zerenity 1.3
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.
- data/CHANGELOG +21 -0
- data/README +63 -0
- data/examples/example_calendar.rb +6 -0
- data/examples/example_colorselection.rb +5 -0
- data/examples/example_entry.rb +16 -0
- data/examples/example_error.rb +3 -0
- data/examples/example_fileselection.rb +26 -0
- data/examples/example_info.rb +3 -0
- data/examples/example_list.rb +10 -0
- data/examples/example_progress.rb +40 -0
- data/examples/example_question.rb +4 -0
- data/examples/example_textinfo.rb +11 -0
- data/examples/example_warning.rb +3 -0
- data/lib/zerenity.rb +14 -0
- data/lib/zerenity/base.rb +50 -0
- data/lib/zerenity/calendar.rb +26 -0
- data/lib/zerenity/colorselection.rb +30 -0
- data/lib/zerenity/entry.rb +36 -0
- data/lib/zerenity/error.rb +17 -0
- data/lib/zerenity/fileselection.rb +68 -0
- data/lib/zerenity/info.rb +18 -0
- data/lib/zerenity/list.rb +110 -0
- data/lib/zerenity/messagedialog.rb +34 -0
- data/lib/zerenity/progress.rb +136 -0
- data/lib/zerenity/progress.rb~ +136 -0
- data/lib/zerenity/question.rb +26 -0
- data/lib/zerenity/scale.rb +41 -0
- data/lib/zerenity/textinfo.rb +49 -0
- data/lib/zerenity/warning.rb +18 -0
- data/test/all.rb +2 -0
- data/test/tc_base.rb +35 -0
- data/test/tc_calendar.rb +28 -0
- data/test/tc_entry.rb +49 -0
- data/test/tc_fileselection.rb +37 -0
- data/test/tc_info.rb +16 -0
- data/test/tc_list.rb +138 -0
- data/test/tc_messagedialog.rb +16 -0
- data/test/tc_progress.rb +76 -0
- data/test/tc_question.rb +23 -0
- data/test/tc_scale.rb +33 -0
- data/test/tc_textinfo.rb +33 -0
- data/test/tc_warning.rb +16 -0
- data/test/ts_zerenity.rb +33 -0
- metadata +97 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'zerenity/messagedialog'
|
2
|
+
|
3
|
+
module Zerenity
|
4
|
+
# Displays an informational popup dialog on the screen.
|
5
|
+
#
|
6
|
+
# ====Examle Usage
|
7
|
+
# Zerenity::Info(:text=>"Processing has completed.")
|
8
|
+
def Zerenity::Info(options={})
|
9
|
+
Info.run(options)
|
10
|
+
end
|
11
|
+
|
12
|
+
class Info < MessageDialog # :nodoc:
|
13
|
+
def self.check(options)
|
14
|
+
super(options)
|
15
|
+
options[:type] = Gtk::MessageDialog::INFO
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require('zerenity/base')
|
2
|
+
|
3
|
+
module Zerenity
|
4
|
+
# Displays a list dialog on the screen. Items in the list
|
5
|
+
# can be selected. Returns the rows which were selected
|
6
|
+
# or nil if Cancel is clicked.
|
7
|
+
#
|
8
|
+
# ====Options
|
9
|
+
# [:columns] The names which will be displayed at the top og
|
10
|
+
# each column. This option is mandatory.
|
11
|
+
# [:data] The data for the list, with each row
|
12
|
+
# being another array.
|
13
|
+
# [:radiolist] If this is set true the first column of the
|
14
|
+
# list will be rendered as a radiobutton. The first element
|
15
|
+
# of every data array should either be a true or false.
|
16
|
+
# [:checklist] If this is set true the first column of the
|
17
|
+
# list will be rendered as a checkbox. The first element
|
18
|
+
# of every data array should either be a true or false.
|
19
|
+
# When this is set mutiple rows can be selected and an
|
20
|
+
# array of selected rows are returned.
|
21
|
+
# *Note* :radiolist and :checklist are mutually exclusive. If
|
22
|
+
# both are set true an exception is thrown. An exception
|
23
|
+
# is also thrown if the data rows are not equal length or
|
24
|
+
# they differ in length with the number of columns.
|
25
|
+
#
|
26
|
+
# ====Example Usage
|
27
|
+
# choice = Zerenity::List(:columns=>["Food","Energy"],:data=>[["Chips","200KJ"],["Chocolate","300KJ"]])
|
28
|
+
def self.List(options={})
|
29
|
+
List.run(options)
|
30
|
+
end
|
31
|
+
|
32
|
+
class List < Base # :nodoc:
|
33
|
+
def self.check(options)
|
34
|
+
super(options)
|
35
|
+
raise(ArgumentError.new("No column data was given")) unless options[:data]
|
36
|
+
raise(ArgumentError.new("No column headers were given")) unless options[:columns]
|
37
|
+
raise(ArgumentError.new("Column headers and column data differ in length")) unless options[:columns].length.eql?(options[:data][0].length)
|
38
|
+
raise(ArgumentError.new("Column data lengths are not equal")) unless options[:data].map{|element|element.length}.uniq.length.eql?(1)
|
39
|
+
raise(ArgumentError.new("Radiolist and checklist options can not both be set")) if (options[:radiolist] && options[:checklist])
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.build(dialog,options)
|
43
|
+
super(dialog,options)
|
44
|
+
columnTypes = Array.new(options[:columns].length){String}
|
45
|
+
(options[:radiolist] || options[:checklist]) ? columnTypes[0] = TrueClass : nil
|
46
|
+
listStore = Gtk::ListStore.new(*columnTypes)
|
47
|
+
options[:data].each do |datarow|
|
48
|
+
row = listStore.append
|
49
|
+
datarow.each_with_index do |value,index|
|
50
|
+
row[index] = value
|
51
|
+
end
|
52
|
+
end
|
53
|
+
treeView = Gtk::TreeView.new(listStore)
|
54
|
+
treeView.selection.mode = (options[:checklist] ? Gtk::SELECTION_MULTIPLE : Gtk::SELECTION_SINGLE)
|
55
|
+
toggleProc = (if (treeView.selection.mode.eql?(Gtk::SELECTION_SINGLE))
|
56
|
+
lambda do |cell,path|
|
57
|
+
selectedRow = treeView.model.get_iter(path)
|
58
|
+
if !selectedRow[0]
|
59
|
+
selectedRow[0] = true
|
60
|
+
currentRow = treeView.model.iter_first
|
61
|
+
begin
|
62
|
+
currentRow[0] = false unless selectedRow == currentRow
|
63
|
+
end while (currentRow.next!)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
else
|
67
|
+
lambda do |cell,path|
|
68
|
+
selectedRow = treeView.model.get_iter(path)
|
69
|
+
selectedRow[0] = !selectedRow[0]
|
70
|
+
end
|
71
|
+
end)
|
72
|
+
options[:columns].each_with_index do |columnName,index|
|
73
|
+
renderer,column = columnTypes[index].eql?(TrueClass) ? [Gtk::CellRendererToggle.new,:active] : [Gtk::CellRendererText.new,:text]
|
74
|
+
if index.eql?(0)
|
75
|
+
renderer.signal_connect('toggled',&toggleProc) if renderer.class.eql?(Gtk::CellRendererToggle)
|
76
|
+
renderer.set_radio(true) if options[:radiolist]
|
77
|
+
end
|
78
|
+
treeView.append_column(Gtk::TreeViewColumn.new(columnName,renderer,column=>index))
|
79
|
+
end
|
80
|
+
dialog.vbox.add(treeView)
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.retrieve_selection(dialog,options)
|
84
|
+
super(dialog,options)
|
85
|
+
treeView = dialog.vbox.children[0]
|
86
|
+
results = []
|
87
|
+
if (options[:checklist])
|
88
|
+
treeView.model.each do |model,path,selectedRow|
|
89
|
+
if selectedRow[0]
|
90
|
+
resultRow = []
|
91
|
+
(model.n_columns-1).times {|index| resultRow << selectedRow[index+1]}
|
92
|
+
results << resultRow
|
93
|
+
end
|
94
|
+
end
|
95
|
+
return nil if results.size.zero?
|
96
|
+
elsif(options[:radiolist])
|
97
|
+
treeView.model.each do |model,path,selectedRow|
|
98
|
+
if selectedRow[0]
|
99
|
+
(model.n_columns-1).times{|index| results << selectedRow[index+1]}
|
100
|
+
break
|
101
|
+
end
|
102
|
+
end
|
103
|
+
else
|
104
|
+
selectedRow = treeView.selection.selected
|
105
|
+
treeView.model.n_columns.times{|index| results << selectedRow[index]}
|
106
|
+
end
|
107
|
+
return results
|
108
|
+
end
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'zerenity/base'
|
2
|
+
|
3
|
+
module Zerenity
|
4
|
+
class MessageDialog < Base # :nodoc:
|
5
|
+
def self.build(dialog,options)
|
6
|
+
options[:ok_button] = dialog.add_button(Gtk::Stock::OK,Gtk::Dialog::RESPONSE_OK)
|
7
|
+
dialog.set_default_response(Gtk::Dialog::RESPONSE_OK)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.run(options={})
|
11
|
+
Gtk.init
|
12
|
+
self.check(options)
|
13
|
+
dialog = Gtk::MessageDialog.new(nil,Gtk::Dialog::MODAL,options[:type],Gtk::MessageDialog::BUTTONS_NONE,options[:text])
|
14
|
+
self.build(dialog,options)
|
15
|
+
dialog.set_title(options[:title]) if options[:title]
|
16
|
+
result = nil
|
17
|
+
if options[:cancel_button]
|
18
|
+
options[:cancel_button].signal_connect(CLICKED) do
|
19
|
+
dialog.destroy
|
20
|
+
Gtk.main_quit
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
options[:ok_button].signal_connect(CLICKED) do
|
25
|
+
result = true
|
26
|
+
dialog.destroy
|
27
|
+
Gtk.main_quit
|
28
|
+
end
|
29
|
+
dialog.show_all
|
30
|
+
Gtk.main
|
31
|
+
return result
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require('zerenity/base')
|
2
|
+
module Zerenity
|
3
|
+
# Displays a progress bar which can be updated via a processing
|
4
|
+
# block which is passed a ProgressProxy object.
|
5
|
+
#
|
6
|
+
# ====Options
|
7
|
+
# [:autoClose] The dialog will automatically close once the
|
8
|
+
# progressing block is complete.
|
9
|
+
# [:cancellable] If set to true the Cancel button is enabled
|
10
|
+
# and the ProgressProxy#cancelled? will be set to true if it
|
11
|
+
# is clicked. It is the responsibility of the processing block
|
12
|
+
# to monitor this attribute and perfom the necessary actions
|
13
|
+
# when it is ckicked.
|
14
|
+
#
|
15
|
+
# ====Example Usage
|
16
|
+
# Zerenity::Progress(:text=>"Processing...",:cancellable=>true,:title=>"Processing Files") do |progress|
|
17
|
+
# files.each_with_index do |file,index|
|
18
|
+
# progress.cancelled ? break : nil
|
19
|
+
# process_file(file)
|
20
|
+
# progress.update(index/files.size,"#{((index/files.size)*100).round}% Complete")
|
21
|
+
# end
|
22
|
+
# if progress.cancelled?
|
23
|
+
# progress.text = "Cleaning up..."
|
24
|
+
# cleanup_files(files)
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
def self.Progress(options={},&block)
|
28
|
+
Progress.run(options,&block)
|
29
|
+
end
|
30
|
+
|
31
|
+
class Progress < Base # :nodoc:
|
32
|
+
|
33
|
+
def self.check(options)
|
34
|
+
super(options)
|
35
|
+
options[:autoClose] ||= false
|
36
|
+
options[:cancellable] ||= false
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.build(dialog,options,progressProxy)
|
40
|
+
super(dialog,options)
|
41
|
+
label = Gtk::Label.new(options[:text])
|
42
|
+
progressBar = Gtk::ProgressBar.new
|
43
|
+
progressProxy.progressBar = progressBar
|
44
|
+
progressBar.pulse_step = 0.02
|
45
|
+
!options[:cancellable] ? options[:cancel_button].sensitive = false : nil
|
46
|
+
options[:ok_button].sensitive = false
|
47
|
+
dialog.vbox.add(label)
|
48
|
+
dialog.vbox.add(progressBar)
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.run(options={},&block)
|
52
|
+
self.check(options)
|
53
|
+
Gtk.init
|
54
|
+
dialog = Gtk::Dialog.new(options[:title])
|
55
|
+
result = nil
|
56
|
+
progressProxy = Zerenity::ProgressProxy.new
|
57
|
+
self.build(dialog,options,progressProxy)
|
58
|
+
options[:cancel_button].signal_connect(CLICKED) do
|
59
|
+
progressProxy.cancel!
|
60
|
+
end
|
61
|
+
options[:ok_button].signal_connect(CLICKED) do
|
62
|
+
result = true
|
63
|
+
dialog.destroy
|
64
|
+
Gtk.main_quit
|
65
|
+
end
|
66
|
+
dialog.show_all
|
67
|
+
gtkThread = Thread.new do
|
68
|
+
Gtk.main
|
69
|
+
end
|
70
|
+
block.call(progressProxy)
|
71
|
+
if options[:autoClose]
|
72
|
+
dialog.destroy
|
73
|
+
Gtk.main_quit
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
options[:ok_button].sensitive = true
|
77
|
+
options[:cancel_button].sensitive = false
|
78
|
+
gtkThread.join
|
79
|
+
return result
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# ProgressProxy allows you to update the progress of the
|
84
|
+
# Zerenity::Progress dialog. It also can alert the processing
|
85
|
+
# block whether or not the Cancel button has been clicked.
|
86
|
+
class ProgressProxy
|
87
|
+
# An attribute indicating whether the Cancel button has been clicked.
|
88
|
+
attr_reader :cancelled
|
89
|
+
|
90
|
+
def initialize() # :nodoc:
|
91
|
+
@progressBar = nil
|
92
|
+
@cancelled = false
|
93
|
+
end
|
94
|
+
|
95
|
+
def progressBar=(progressBar) # :nodoc:
|
96
|
+
@progressBar = progressBar
|
97
|
+
end
|
98
|
+
|
99
|
+
# Updates the progress bar.
|
100
|
+
#
|
101
|
+
# ====Parameters
|
102
|
+
# [percentage] The percentage completed. Values range from 0 to 1.
|
103
|
+
# [text] Optional text that will be displayed in the progress area.
|
104
|
+
def update(percentage,text=nil)
|
105
|
+
@progressBar.text = text.to_s if text
|
106
|
+
@progressBar.fraction = percentage.to_f
|
107
|
+
end
|
108
|
+
|
109
|
+
# When called will put the progress bar into 'pulse' mode. A
|
110
|
+
# small bar will move forwards and backwards across the progress
|
111
|
+
# area.
|
112
|
+
def pulse(text=nil)
|
113
|
+
@progressBar.text = text.to_s if text
|
114
|
+
@progressBar.pulse
|
115
|
+
end
|
116
|
+
|
117
|
+
# Sets the text in the progress area.
|
118
|
+
def text=(text)
|
119
|
+
@progressBar.text = text.to_s
|
120
|
+
end
|
121
|
+
|
122
|
+
# Sets the percentage complete of the progress bar. Must be in the range 0-1.
|
123
|
+
def percentage=(percentage)
|
124
|
+
@progressBar.fraction = percentage.to_f
|
125
|
+
end
|
126
|
+
|
127
|
+
# Alias for cancelled.
|
128
|
+
def cancelled?
|
129
|
+
@cancelled
|
130
|
+
end
|
131
|
+
|
132
|
+
def cancel! #:nodoc:
|
133
|
+
@cancelled = true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,136 @@
|
|
1
|
+
require('zerenity/base')
|
2
|
+
module Zerenity
|
3
|
+
# Displays a progress bar which can be updated via a processing
|
4
|
+
# block which is passed a ProgressProxy object.
|
5
|
+
#
|
6
|
+
# ====Options
|
7
|
+
# [:autoClose] The dialog will automatically close once the
|
8
|
+
# progressing block is complete.
|
9
|
+
# [:cancellable] If set to true the Cancel button is enabled
|
10
|
+
# and the ProgressProxy#cancelled? will be set to true if it
|
11
|
+
# is clicked. It is the responsibility of the processing block
|
12
|
+
# to monitor this attribute and perfom the necessary actions
|
13
|
+
# when it is ckicked.
|
14
|
+
#
|
15
|
+
# ====Example Usage
|
16
|
+
# Zerenity::Progress(:text=>"Processing...",:cancellable=>true,:title=>"Processing Files") do |progress|
|
17
|
+
# files.each_with_index do |file,index|
|
18
|
+
# progress.cancelled ? break : nil
|
19
|
+
# process_file(file)
|
20
|
+
# progress.update(index/files.size,"#{((index/files.size)*100).round}% Complete")
|
21
|
+
# end
|
22
|
+
# if progress.cancelled?
|
23
|
+
# progress.text = "Cleaning up..."
|
24
|
+
# cleanup_files(files)
|
25
|
+
# end
|
26
|
+
# end
|
27
|
+
def self.Progress(options={},&block)
|
28
|
+
Progress.run(options,&block)
|
29
|
+
end
|
30
|
+
|
31
|
+
class Progress < Base # :nodoc:
|
32
|
+
|
33
|
+
def self.check(options)
|
34
|
+
super(options)
|
35
|
+
options[:autoClose] ||= false
|
36
|
+
options[:cancellable] ||= false
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.build(dialog,options,progressProxy)
|
40
|
+
super(dialog,options)
|
41
|
+
label = Gtk::Label.new(options[:text])
|
42
|
+
progressBar = Gtk::ProgressBar.new
|
43
|
+
progressProxy.progressBar = progressBar
|
44
|
+
progressBar.pulse_step = 0.02
|
45
|
+
!options[:cancellable] ? options[:cancel_button].sensitive = false : nil
|
46
|
+
options[:ok_button].sensitive = false
|
47
|
+
dialog.vbox.add(label)
|
48
|
+
dialog.vbox.add(progressBar)
|
49
|
+
end
|
50
|
+
|
51
|
+
def self.run(options={},&block)
|
52
|
+
self.check(options)
|
53
|
+
Gtk.init
|
54
|
+
dialog = Gtk::Dialog.new(options[:title])
|
55
|
+
result = nil
|
56
|
+
progressProxy = Zerenity::ProgressProxy.new
|
57
|
+
self.build(dialog,options,progressProxy)
|
58
|
+
options[:cancel_button].signal_connect(CLICKED) do
|
59
|
+
progressProxy.cancel!
|
60
|
+
end
|
61
|
+
options[:ok_button].signal_connect(CLICKED) do
|
62
|
+
result = true
|
63
|
+
dialog.destroy
|
64
|
+
Gtk.main_quit
|
65
|
+
end
|
66
|
+
dialog.show_all
|
67
|
+
gtkThread = Thread.new do
|
68
|
+
Gtk.main
|
69
|
+
end
|
70
|
+
block.call(progressProxy)
|
71
|
+
if options[:autoClose]
|
72
|
+
dialog.destroy
|
73
|
+
Gtk.main_quit
|
74
|
+
return true
|
75
|
+
end
|
76
|
+
options[:ok_button].sensitive = true
|
77
|
+
options[:cancel_button].sensitive = false
|
78
|
+
gtkThread.join
|
79
|
+
return result
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# ProgressProxy allows you to update the progress of the
|
84
|
+
# Zerenity::Progress dialog. It also can alert the processing
|
85
|
+
# block whether or not the Cancel button has been clicked.
|
86
|
+
class ProgressProxy
|
87
|
+
# An attribute indicating whether the Cancel button has been clicked.
|
88
|
+
attr_reader :cancelled
|
89
|
+
|
90
|
+
def initialize() # :nodoc:
|
91
|
+
@progressBar = nil
|
92
|
+
@cancelled = false
|
93
|
+
end
|
94
|
+
|
95
|
+
def progressBar=(progressBar) # :nodoc:
|
96
|
+
@progressBar = progressBar
|
97
|
+
end
|
98
|
+
|
99
|
+
# Updates the progress bar.
|
100
|
+
#
|
101
|
+
# ====Parameters
|
102
|
+
# [percentage] The percentage completed. Values range from 0 to 1.
|
103
|
+
# [text] Optional text that will be displayed in the progress area.
|
104
|
+
def update(percentage,text=nil)
|
105
|
+
text ? @progressBar.text = text.to_s : nil
|
106
|
+
@progressBar.fraction = percentage.to_f
|
107
|
+
end
|
108
|
+
|
109
|
+
# When called will put the progress bar into 'pulse' mode. A
|
110
|
+
# small bar will move forwards and backwards across the progress
|
111
|
+
# area.
|
112
|
+
def pulse(text=nil)
|
113
|
+
text ? @progressBar.text = text.to_s : nil
|
114
|
+
@progressBar.pulse
|
115
|
+
end
|
116
|
+
|
117
|
+
# Sets the text in the progress area.
|
118
|
+
def text=(text)
|
119
|
+
@progressBar.text = text.to_s
|
120
|
+
end
|
121
|
+
|
122
|
+
# Sets the percentage complete of the progress bar. Must be in the range 0-1.
|
123
|
+
def percentage=(percentage)
|
124
|
+
@progressBar.fraction = percentage.to_f
|
125
|
+
end
|
126
|
+
|
127
|
+
# Alias for cancelled.
|
128
|
+
def cancelled?
|
129
|
+
@cancelled
|
130
|
+
end
|
131
|
+
|
132
|
+
def cancel! #:nodoc:
|
133
|
+
@cancelled = true
|
134
|
+
end
|
135
|
+
end
|
136
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require('zerenity/messagedialog')
|
2
|
+
|
3
|
+
module Zerenity
|
4
|
+
# Displays a question dialog. Returns true if OK is clicked, false if
|
5
|
+
# Cancel is clicked.
|
6
|
+
#
|
7
|
+
# ====Example Useage
|
8
|
+
# if Zerenity::Question(:text=>"Continue processing?")
|
9
|
+
# post_process_files()
|
10
|
+
# end
|
11
|
+
def self.Question(options={})
|
12
|
+
Question.run(options)
|
13
|
+
end
|
14
|
+
|
15
|
+
class Question < MessageDialog # :nodoc:
|
16
|
+
def self.check(options)
|
17
|
+
super(options)
|
18
|
+
options[:type] = Gtk::MessageDialog::QUESTION
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.build(dialog,options)
|
22
|
+
super(dialog,options)
|
23
|
+
options[:cancel_button] = dialog.add_button(Gtk::Stock::CANCEL,Gtk::Dialog::RESPONSE_CANCEL)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|