miga-base 0.2.0.6 → 0.2.0.7
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/Gemfile +3 -0
- data/LICENSE +201 -0
- data/README.md +17 -335
- data/Rakefile +31 -0
- data/actions/add_result +2 -5
- data/actions/add_taxonomy +4 -7
- data/actions/create_dataset +5 -6
- data/actions/create_project +2 -5
- data/actions/daemon +2 -5
- data/actions/download_dataset +88 -58
- data/actions/find_datasets +36 -38
- data/actions/import_datasets +2 -5
- data/actions/index_taxonomy +2 -5
- data/actions/list_datasets +47 -49
- data/actions/list_files +7 -11
- data/actions/unlink_dataset +2 -5
- data/bin/miga +1 -1
- data/lib/miga/common.rb +132 -0
- data/lib/miga/daemon.rb +229 -168
- data/lib/miga/dataset.rb +354 -277
- data/lib/miga/gui.rb +346 -269
- data/lib/miga/metadata.rb +115 -71
- data/lib/miga/project.rb +361 -259
- data/lib/miga/remote_dataset.rb +200 -148
- data/lib/miga/result.rb +150 -99
- data/lib/miga/tax_index.rb +124 -67
- data/lib/miga/taxonomy.rb +129 -100
- data/lib/miga/version.rb +57 -0
- data/lib/miga.rb +2 -77
- data/scripts/_distances_noref_nomulti.bash +2 -0
- data/scripts/_distances_ref_nomulti.bash +2 -0
- data/scripts/aai_distances.bash +1 -0
- data/scripts/ani_distances.bash +1 -0
- data/scripts/assembly.bash +1 -0
- data/scripts/cds.bash +1 -0
- data/scripts/clade_finding.bash +17 -1
- data/scripts/distances.bash +1 -0
- data/scripts/essential_genes.bash +1 -0
- data/scripts/haai_distances.bash +1 -0
- data/scripts/init.bash +2 -0
- data/scripts/mytaxa.bash +1 -0
- data/scripts/mytaxa_scan.bash +1 -0
- data/scripts/ogs.bash +1 -0
- data/scripts/read_quality.bash +1 -0
- data/scripts/ssu.bash +1 -0
- data/scripts/subclades.bash +1 -0
- data/scripts/trimmed_fasta.bash +1 -0
- data/scripts/trimmed_reads.bash +1 -0
- data/test/common_test.rb +82 -0
- data/test/daemon_test.rb +53 -0
- data/test/dataset_test.rb +156 -0
- data/test/jruby_gui_test.rb +20 -0
- data/test/metadata_test.rb +48 -0
- data/test/project_test.rb +54 -0
- data/test/remote_dataset_test.rb +41 -0
- data/test/tax_index_test.rb +44 -0
- data/test/taxonomy_test.rb +36 -0
- data/test/test_helper.rb +32 -0
- metadata +53 -38
data/lib/miga/gui.rb
CHANGED
@@ -1,289 +1,366 @@
|
|
1
|
-
#
|
2
1
|
# @package MiGA
|
3
|
-
# @
|
4
|
-
# @license artistic license 2.0
|
5
|
-
# @update Jul-11-2015
|
6
|
-
#
|
2
|
+
# @license Artistic-2.0
|
7
3
|
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
4
|
+
require "miga/common"
|
5
|
+
require "miga/project"
|
6
|
+
require "shoes"
|
7
|
+
require "shoes/swt"
|
11
8
|
|
12
9
|
Shoes::Swt.initialize_backend
|
13
10
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
url '/project', :project
|
24
|
-
url '/datasets', :datasets
|
25
|
-
url '/dataset-(.*)', :dataset
|
26
|
-
url '/report', :report
|
27
|
-
$miga_path = File.expand_path(File.dirname(__FILE__) + "/../../")
|
11
|
+
##
|
12
|
+
# Graphical User Interface for MiGA using Shoes.
|
13
|
+
class MiGA::GUI < Shoes
|
14
|
+
|
15
|
+
# Class-level
|
16
|
+
|
17
|
+
##
|
18
|
+
# Set system status for MiGA::GUI.
|
19
|
+
def self.status=(status) @@STATUS = status ; end
|
28
20
|
|
29
|
-
|
30
|
-
|
21
|
+
##
|
22
|
+
# System status for MiGA::GUI.
|
23
|
+
def self.status() @@STATUS; end
|
24
|
+
@@STATUS = "Initializing MiGA..."
|
25
|
+
|
26
|
+
##
|
27
|
+
# Reset the system status for MiGA::GUI.
|
28
|
+
def self.reset_status() @@STATUS="MiGA is ready to go!" ; end
|
29
|
+
|
30
|
+
url "/", :index
|
31
|
+
url "/project", :project
|
32
|
+
url "/datasets", :datasets
|
33
|
+
url "/dataset-(.*)", :dataset
|
34
|
+
url "/report", :report
|
35
|
+
$miga_gui_path = File.expand_path("../../../gui", __FILE__)
|
36
|
+
|
37
|
+
##
|
38
|
+
# Initialize GUI.
|
39
|
+
def self.init (&block)
|
40
|
+
Shoes.app title: "MiGA | Microbial Genomes Atlas",
|
41
|
+
width: 750, height: 400, &block
|
42
|
+
end
|
43
|
+
|
44
|
+
# =====================[ View : Windows ]
|
45
|
+
|
46
|
+
##
|
47
|
+
# Main window.
|
48
|
+
def index
|
49
|
+
header("Microbial Genomes Atlas")
|
50
|
+
stack(margin:40) do
|
51
|
+
menu_bar [:open_project, :new_project, :help]
|
52
|
+
box alpha: 0.0 do
|
53
|
+
para "Welcome to the MiGA GUI. If you use MiGA in your research, ",
|
54
|
+
"please consider citing:\n", MiGA::MiGA.CITATION
|
31
55
|
end
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
end
|
50
|
-
MiGA.RESET_STATUS
|
51
|
-
keypress do |key|
|
52
|
-
if [:control_o, "o"].include? key
|
53
|
-
MiGA.STATUS = "Calling open_project..."
|
54
|
-
open_project
|
55
|
-
elsif [:control_n, "n"].include? key
|
56
|
-
MiGA.STATUS = "Calling new_project..."
|
57
|
-
new_project
|
58
|
-
end
|
59
|
-
end
|
56
|
+
end
|
57
|
+
MiGA::GUI.reset_status
|
58
|
+
status_bar
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# Project window.
|
63
|
+
def project
|
64
|
+
header("» " + $project.name.unmiga_name)
|
65
|
+
stack(margin:40) do
|
66
|
+
menu_bar [:list_datasets, :new_dataset, :progress_report, :help]
|
67
|
+
stack(margin_top:10) do
|
68
|
+
para strong("Path"), ": ", $project.path
|
69
|
+
para strong("Datasets"), ": ", $project.metadata[:datasets].size
|
70
|
+
$project.metadata.each do |k,v|
|
71
|
+
para(strong(k.to_s.capitalize), ": ", v) unless k==:datasets
|
72
|
+
end
|
60
73
|
end
|
74
|
+
end
|
75
|
+
MiGA::GUI.reset_status
|
76
|
+
end
|
61
77
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
end
|
76
|
-
MiGA.RESET_STATUS
|
77
|
-
keypress do |key|
|
78
|
-
if [:control_r, "r"].include? key
|
79
|
-
MiGA.STATUS = "Calling progress_report..."
|
80
|
-
progress_report
|
81
|
-
elsif [:control_d, "d"].include? key
|
82
|
-
MiGA.STATUS = "Calling list_datasets..."
|
83
|
-
list_datasets
|
84
|
-
end
|
85
|
-
end
|
78
|
+
##
|
79
|
+
# Datasets list window.
|
80
|
+
def datasets
|
81
|
+
header("» " + $project.name.unmiga_name)
|
82
|
+
stack(margin:40) do
|
83
|
+
para "#{$project.metadata[:datasets].size} datasets:"
|
84
|
+
para ""
|
85
|
+
flow(width: 1.0) do
|
86
|
+
$project.metadata[:datasets].each do |name|
|
87
|
+
stack(width:150) do
|
88
|
+
para "> ", link(name.unmiga_name){ show_dataset(name) }
|
89
|
+
end
|
90
|
+
end
|
86
91
|
end
|
92
|
+
end
|
93
|
+
MiGA::GUI.reset_status
|
94
|
+
end
|
87
95
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
96
|
+
##
|
97
|
+
# Dataset details window.
|
98
|
+
def dataset(name)
|
99
|
+
header("» " + $project.name.unmiga_name + " » " + name.unmiga_name)
|
100
|
+
stack(margin:40) do
|
101
|
+
ds = $project.dataset(name)
|
102
|
+
stack do
|
103
|
+
ds.metadata.each { |k,v| para strong(k.to_s.capitalize), ": ", v }
|
104
|
+
end
|
105
|
+
flow(margin_top:10) do
|
106
|
+
w = 40+30*MiGA::Dataset.PREPROCESSING_TASKS.size
|
107
|
+
stack(width:w) do
|
108
|
+
subtitle "Advance"
|
109
|
+
done = graphic_advance(ds)
|
110
|
+
para sprintf("%.1f%% Complete", done*100)
|
111
|
+
end
|
112
|
+
stack(width:-w) do
|
113
|
+
subtitle "Task"
|
114
|
+
$task_name_field = stack { para "" }
|
115
|
+
animate do
|
116
|
+
$task_name_field.clear{ para $task }
|
117
|
+
end
|
118
|
+
end
|
104
119
|
end
|
120
|
+
MiGA::GUI.reset_status
|
121
|
+
end
|
122
|
+
end
|
105
123
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
stack(width:-w) do
|
123
|
-
subtitle "Task"
|
124
|
-
$task_name_field = stack { para "" }
|
125
|
-
animate do
|
126
|
-
$task_name_field.clear{ para $task }
|
127
|
-
end
|
128
|
-
end
|
129
|
-
end
|
130
|
-
para ""
|
131
|
-
MiGA.RESET_STATUS
|
132
|
-
end
|
124
|
+
##
|
125
|
+
# Project report window.
|
126
|
+
def report
|
127
|
+
header("» " + $project.name.unmiga_name)
|
128
|
+
stack(margin:40) do
|
129
|
+
$done_para = subtitle "Dataset tasks advance: "
|
130
|
+
$done = 0.0
|
131
|
+
w = 40+30*MiGA::Dataset.PREPROCESSING_TASKS.size
|
132
|
+
stack(width:w) do
|
133
|
+
stack(margin_top:10) do
|
134
|
+
$done = $project.datasets.map{ |ds| graphic_advance(ds, 7) }.inject(:+)
|
135
|
+
motion { |_,y| show_report_hover(w, y) }
|
136
|
+
click { show_dataset($dataset) }
|
137
|
+
end
|
138
|
+
$done /= $project.metadata[:datasets].size
|
139
|
+
$done_para.text += sprintf("%.1f%% Complete.", $done*100)
|
133
140
|
end
|
141
|
+
$task_ds_box = stack(width:-w)
|
142
|
+
stack(margin_top:10) do
|
143
|
+
subtitle "Project-wide tasks:"
|
144
|
+
tasks = MiGA::Project.DISTANCE_TASKS
|
145
|
+
tasks += MiGA::Project.INCLADE_TASK if $project.metadata[:type]==:clade
|
146
|
+
tasks.each do |t|
|
147
|
+
para strong(t), ": ",
|
148
|
+
($project.add_result(t, false).nil? ? "Pending" : "Done")
|
149
|
+
end
|
150
|
+
end if $done==1.0
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
##
|
157
|
+
# The MiGA GUI's blue.
|
158
|
+
def miga_blue(alpha=1.0)
|
159
|
+
rgb(0,121,166,alpha)
|
160
|
+
end
|
134
161
|
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
end
|
161
|
-
$task_ds_box.show
|
162
|
-
$task_ds_box.move(w,y-150)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
click do
|
166
|
-
GUI.init{ visit "/dataset-#{$dataset}" } unless $dataset.nil?
|
167
|
-
end
|
168
|
-
leave do
|
169
|
-
$task = nil
|
170
|
-
$dataset = nil
|
171
|
-
$task_ds_box.hide
|
172
|
-
end
|
173
|
-
end
|
174
|
-
$done /= $project.metadata[:datasets].size
|
175
|
-
para sprintf("%.1f%% Complete", $done*100)
|
176
|
-
end
|
177
|
-
$task_ds_box = stack(width:-w)
|
178
|
-
end
|
179
|
-
if $done==1.0
|
180
|
-
para ""
|
181
|
-
stack do
|
182
|
-
subtitle "Project-wide tasks:"
|
183
|
-
Project.DISTANCE_TASKS.each { |t| para strong(t), ": ", ($project.add_result(t).nil? ? "Pending" : "Done") }
|
184
|
-
if $project.metadata[:type]==:clade
|
185
|
-
Project.INCLADE_TASKS.each { |t| para strong(t), ": ", ($project.add_result(t).nil? ? "Pending" : "Done") }
|
186
|
-
end
|
187
|
-
end
|
188
|
-
end
|
189
|
-
para ""
|
190
|
-
MiGA.RESET_STATUS
|
191
|
-
end
|
162
|
+
##
|
163
|
+
# The MIGA GUI's red.
|
164
|
+
def miga_red(alpha=1.0)
|
165
|
+
rgb(179,0,3,alpha)
|
166
|
+
end
|
167
|
+
|
168
|
+
# =====================[ View : Elements ]
|
169
|
+
|
170
|
+
##
|
171
|
+
# Header in all windows
|
172
|
+
def header(msg="")
|
173
|
+
# workaround to shoes/shoes4#1212:
|
174
|
+
$clicky ||= []
|
175
|
+
$clicky.each{ |i| i.hide }
|
176
|
+
$clicky = []
|
177
|
+
# Keyboard support
|
178
|
+
key_shortcuts = {
|
179
|
+
:control_o => :open_project, :super_o => :open_project,
|
180
|
+
:control_n => :new_project, :super_n => :new_project,
|
181
|
+
:control_l => :list_datasets, :super_l => :list_datasets,
|
182
|
+
:control_r => :progress_report, :super_r => :progress_report
|
183
|
+
}
|
184
|
+
keypress do |key|
|
185
|
+
funct = key_shortcuts[key]
|
186
|
+
send(funct) unless funct.nil?
|
192
187
|
end
|
188
|
+
# Graphical header
|
189
|
+
flow(margin:[40,10,40,0]) do
|
190
|
+
image $miga_gui_path + "/img/MiGA-sm.png", width: 120, height: 50
|
191
|
+
title msg, margin_top: 5, margin_left: 5
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
##
|
196
|
+
# General-purpose box
|
197
|
+
def box(opts={}, &blk)
|
198
|
+
flow(margin_bottom:5) do
|
199
|
+
opts[:alpha] ||= 0.2
|
200
|
+
opts[:side_line] ||= miga_blue
|
201
|
+
opts[:background] ||= miga_blue(opts[:alpha])
|
202
|
+
stack(width: 5, height: 1.0) do
|
203
|
+
background opts[:side_line]
|
204
|
+
end unless opts[:right]
|
205
|
+
stack(width: -5) do
|
206
|
+
background opts[:background]
|
207
|
+
stack{ background rgb(0,0,0,1.0) } # workaround to shoes/shoes4#1190
|
208
|
+
s = stack(margin:5, &blk)
|
209
|
+
unless opts[:click].nil?
|
210
|
+
s.click{ visit opts[:click] }
|
211
|
+
end
|
212
|
+
end
|
213
|
+
stack(width: 5, height: 1.0) do
|
214
|
+
background opts[:side_line]
|
215
|
+
end if opts[:right]
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
##
|
220
|
+
# Menu bar.
|
221
|
+
def menu_bar actions
|
222
|
+
box do
|
223
|
+
flow do
|
224
|
+
img = {
|
225
|
+
open_project: "iconmonstr-archive-5-icon-40",
|
226
|
+
new_project: "iconmonstr-plus-5-icon-40",
|
227
|
+
list_datasets: "iconmonstr-note-10-icon-40",
|
228
|
+
new_dataset: "iconmonstr-note-25-icon-40",
|
229
|
+
progress_report: "iconmonstr-bar-chart-2-icon-40",
|
230
|
+
help: "iconmonstr-help-3-icon-40"}
|
231
|
+
actions.each do |k|
|
232
|
+
flow(margin:0, width:200) do
|
233
|
+
image $miga_gui_path + "/img/#{img[k]}.png", margin: 2
|
234
|
+
button(k.to_s.unmiga_name.capitalize, top:5){ send(k) }
|
235
|
+
end
|
236
|
+
end
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
193
240
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
eval k.to_s
|
213
|
-
end
|
214
|
-
end
|
215
|
-
end
|
216
|
-
end
|
217
|
-
end # menu_bar
|
218
|
-
|
219
|
-
# Status bar
|
220
|
-
def status_bar
|
221
|
-
stack(bottom:0) do
|
222
|
-
flow bottom:0, height:20, margin:0 do
|
223
|
-
background "#CCC"
|
224
|
-
stack(width:50)
|
225
|
-
$status_cont = stack(width:-300, height:1.0)
|
226
|
-
every do |i|
|
227
|
-
$status_cont.clear { inscription MiGA.STATUS, margin:5 }
|
228
|
-
end
|
229
|
-
stack(width:250, height:1.0) do
|
230
|
-
inscription MiGA.LONG_VERSION, align:"right", margin:5
|
231
|
-
end
|
232
|
-
end
|
233
|
-
image $miga_path + "/gui/img/MiGA-sq.png", left:0, bottom:0, width:30, height:32
|
234
|
-
end
|
235
|
-
end # status_bar
|
241
|
+
##
|
242
|
+
# Status bar.
|
243
|
+
def status_bar
|
244
|
+
stack(bottom:0) do
|
245
|
+
flow bottom:0, height:20, margin:0 do
|
246
|
+
background "#CCC"
|
247
|
+
$status_cont = stack(width:-300, height:1.0, margin_left:45)
|
248
|
+
every do
|
249
|
+
$status_cont.clear { inscription MiGA::GUI.status, margin:5 }
|
250
|
+
end
|
251
|
+
stack(width:250, height:1.0, right: 5) do
|
252
|
+
inscription MiGA::MiGA.LONG_VERSION, align:"right", margin:5
|
253
|
+
end
|
254
|
+
end
|
255
|
+
image "#{$miga_gui_path}/img/MiGA-sq.png",
|
256
|
+
left:10, bottom:5, width:30, height:32
|
257
|
+
end
|
258
|
+
end
|
236
259
|
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
260
|
+
##
|
261
|
+
# Display processing status of a dataset as a horizontal bar, as reported
|
262
|
+
# by MiGA::Dataset#profile_advance.
|
263
|
+
def graphic_advance(ds, h=10)
|
264
|
+
ds_adv = ds.profile_advance
|
265
|
+
flow(width:30*MiGA::Dataset.PREPROCESSING_TASKS.size) do
|
266
|
+
nostroke
|
267
|
+
col = ["#CCC", rgb(119,130,61), rgb(160,41,50)]
|
268
|
+
ds_adv.each_index do |i|
|
269
|
+
stack(width:28,margin:0,top:0,left:i*30,height:h) do
|
270
|
+
background col[ ds_adv[i] ]
|
271
|
+
t = MiGA::Dataset.PREPROCESSING_TASKS[i]
|
272
|
+
hover do
|
273
|
+
$task = t
|
274
|
+
$dataset = ds.name.unmiga_name
|
275
|
+
end
|
276
|
+
leave do
|
277
|
+
$task = nil
|
278
|
+
$dataset = nil
|
279
|
+
$task_ds_box.hide unless $task_ds_box.nil?
|
280
|
+
end
|
281
|
+
end
|
282
|
+
end
|
283
|
+
nofill
|
284
|
+
end
|
285
|
+
return 0.0 if ds_adv.count{|i| i>0} <= 1
|
286
|
+
(ds_adv.count{|i| i==1}.to_f - 1.0)/(ds_adv.count{|i| i>0}.to_f - 1.0)
|
287
|
+
end
|
259
288
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
+
##
|
290
|
+
# Show floating window with additional information on report cells.
|
291
|
+
def show_report_hover(w, y)
|
292
|
+
unless $task.nil?
|
293
|
+
$task_ds_box.clear do
|
294
|
+
para strong("Task: "), $task, "\n", strong("Dataset: "), $dataset
|
295
|
+
end
|
296
|
+
$task_ds_box.show
|
297
|
+
$task_ds_box.move(w-20, y-115)
|
298
|
+
end
|
299
|
+
end
|
300
|
+
|
301
|
+
# =====================[ Controller : Projects ]
|
302
|
+
|
303
|
+
##
|
304
|
+
# Load a project.
|
305
|
+
def open_project
|
306
|
+
open_window("Opening project...") do
|
307
|
+
folder = ask_open_folder
|
308
|
+
if folder.nil? or not MiGA::Project.exist?(folder)
|
309
|
+
alert "Cannot find a MiGA project at #{folder}!" unless folder.nil?
|
310
|
+
else
|
311
|
+
$project = MiGA::Project.new(folder)
|
312
|
+
visit "/project"
|
313
|
+
end
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
##
|
318
|
+
# Create a project.
|
319
|
+
def new_project
|
320
|
+
open_window("Creating project...") do
|
321
|
+
if MiGA::MiGA.initialized?
|
322
|
+
folder = ask_save_folder
|
323
|
+
if folder.nil? or MiGA::Project.exist?(folder)
|
324
|
+
alert "Cannot overwrite existent MiGA project at #{folder}!" unless
|
325
|
+
folder.nil?
|
326
|
+
else
|
327
|
+
$project = MiGA::Project.new(folder)
|
328
|
+
visit "/project"
|
329
|
+
end
|
330
|
+
else
|
331
|
+
# FIXME Add a way to initialize MiGA from the GUI
|
332
|
+
alert "MiGA is currently uninitialized, no projects can be created."
|
333
|
+
end
|
334
|
+
end
|
335
|
+
end
|
336
|
+
|
337
|
+
##
|
338
|
+
# Open a window on #datasets.
|
339
|
+
def list_datasets
|
340
|
+
open_window("Listing all datasets..."){
|
341
|
+
visit "/datasets" } unless $project.nil?
|
342
|
+
end
|
343
|
+
|
344
|
+
##
|
345
|
+
# Open a window on #dataset +name+.
|
346
|
+
def show_dataset(name)
|
347
|
+
open_window("Showing dataset details..."){
|
348
|
+
visit "/dataset-#{name}" } unless name.nil?
|
349
|
+
end
|
289
350
|
|
351
|
+
##
|
352
|
+
# Open a window on #report.
|
353
|
+
def progress_report
|
354
|
+
open_window("Creating progress report..."){
|
355
|
+
visit "/report" } unless $project.nil?
|
356
|
+
end
|
357
|
+
|
358
|
+
##
|
359
|
+
# Open a window sending +msg+ to the status, the yields +blk+.
|
360
|
+
def open_window(msg, &blk)
|
361
|
+
MiGA::GUI.status = msg
|
362
|
+
MiGA::GUI.init(&blk)
|
363
|
+
MiGA::GUI.reset_status
|
364
|
+
end
|
365
|
+
|
366
|
+
end
|