Piggy 0.5.0.0 → 0.5.1.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +31 -0
- data/README.txt +3 -5
- data/lib/icons/gallery.jpg +0 -0
- data/lib/piggy-core/album.rb +8 -0
- data/lib/piggy-core/exifr_adapter.rb +10 -2
- data/lib/piggy-core/file_info.rb +6 -1
- data/lib/piggy-core/options.rb +21 -3
- data/lib/piggy-core/rmagick_thumbnail_page_generator.rb +8 -7
- data/lib/piggy-core/thumbnail_generator.rb +1 -1
- data/lib/piggy-core/thumbnail_page_generator.rb +12 -4
- data/lib/piggy-core/version.rb +2 -2
- data/lib/piggy-gui/directory_diff_widget.rb +12 -8
- data/lib/piggy-gui/filtered_file_list.rb +6 -1
- data/lib/piggy-gui/ftp_browser_widget.rb +4 -3
- data/lib/piggy-gui/html_generation_dialog.rb +2 -0
- data/lib/piggy-gui/html_options_widget.rb +27 -4
- data/lib/piggy-gui/image_processor.rb +3 -2
- data/lib/piggy-gui/options_dialog.rb +52 -13
- data/lib/piggy-gui/piggy_image_browser.rb +134 -15
- data/lib/templates/PiggyFX.jar +0 -0
- data/lib/templates/PiggyFX.jnlp +2 -2
- data/lib/templates/PiggyFX_browser.jnlp +2 -2
- data/lib/templates/javafx.htm +2 -2
- data/lib/templates/slideshow.htm +12 -3
- data/lib/templates/slideshow.js +5 -0
- data/lib/templates/styles/candle/kerze-160x213.png +0 -0
- data/lib/templates/styles/candle/style.css +73 -0
- data/lib/templates/styles/cappuccinoheart/cappuccino-300x225.png +0 -0
- data/lib/templates/styles/cappuccinoheart/cappuccinoheart-80x81.png +0 -0
- data/lib/templates/styles/cappuccinoheart/style.css +81 -0
- data/lib/templates/styles/feuerzangenbowle/feuerzangenbowle.jpg +0 -0
- data/lib/templates/styles/feuerzangenbowle/sh.png +0 -0
- data/lib/templates/styles/feuerzangenbowle/style.css +79 -0
- data/lib/templates/styles/glitterballs/christbaum-detail.png +0 -0
- data/lib/templates/styles/glitterballs/christbaumkugel-120x155-multi.png +0 -0
- data/lib/templates/styles/glitterballs/christbaumkugel-120x155.png +0 -0
- data/lib/templates/styles/glitterballs/style.css +86 -0
- data/lib/templates/styles/qualle/qualle.jpg +0 -0
- data/lib/templates/styles/qualle/style.css +73 -0
- data/lib/templates/styles/snow/sitzgruppe-im-schnee-300x225.png +0 -0
- data/lib/templates/styles/snow/style.css +76 -0
- data/lib/templates/styles/snowman/snowman.png +0 -0
- data/lib/templates/styles/snowman/style.css +73 -0
- data/lib/templates/styles/snowwoman/snowwomen.png +0 -0
- data/lib/templates/styles/snowwoman/style.css +73 -0
- data/lib/templates/styles/sylvester/fireworks.png +0 -0
- data/lib/templates/styles/sylvester/gluecksklee-375x500.png +0 -0
- data/lib/templates/styles/sylvester/style.css +7 -9
- data/lib/templates/styles/sylvester/wunderkerze.gif +0 -0
- metadata +64 -33
- data/lib/templates/styles/sylvester/wunderkerze.jpg +0 -0
@@ -59,10 +59,10 @@ class HtmlOptionsWidget < Fox::FXMatrix
|
|
59
59
|
@options.addSlideshow = ptr
|
60
60
|
}
|
61
61
|
add_label_to(self, ""); # TODO empty cell in matrix layout
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
62
|
+
add_slideshow_check = FXCheckButton.new(self, 'Add JavaFX slideshow')
|
63
|
+
add_slideshow_check.setCheck(@options.addJavaFxSlideshow?)
|
64
|
+
add_slideshow_check.connect(SEL_COMMAND) { |sender, sel, ptr|
|
65
|
+
@options.addJavaFxSlideshow = ptr
|
66
66
|
}
|
67
67
|
add_label_to(self, "Style:")
|
68
68
|
style_text_field = new_combobox(self, 32,
|
@@ -78,6 +78,19 @@ class HtmlOptionsWidget < Fox::FXMatrix
|
|
78
78
|
style_text_field.connect(SEL_COMMAND) { |sender, sel, ptr|
|
79
79
|
@options.style = ptr
|
80
80
|
}
|
81
|
+
add_label_to(self, "Sort order")
|
82
|
+
sort_order_text_field = new_combobox(self, 32,
|
83
|
+
2,
|
84
|
+
nil, 0, COMBOBOX_INSERT_LAST)
|
85
|
+
sort_order_text_field.setFrameStyle(FRAME_SUNKEN|FRAME_THICK)
|
86
|
+
sort_order_text_field.setLayoutHints(LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
87
|
+
sort_order_text_field.clearItems
|
88
|
+
sort_order_text_field.appendItem(PiggyOptions::SortByName)
|
89
|
+
sort_order_text_field.appendItem(PiggyOptions::SortByTime)
|
90
|
+
sort_order_text_field.setText(@options.sortOrder)
|
91
|
+
sort_order_text_field.connect(SEL_COMMAND) { |sender, sel, ptr|
|
92
|
+
@options.sortOrder = ptr
|
93
|
+
}
|
81
94
|
add_label_to(self, "Image size:")
|
82
95
|
size_frame = FXHorizontalFrame.new(self, FRAME_NONE, 0, 0, 0 , 0, 0, 0, 0, 0)
|
83
96
|
image_width_field = FXTextField.new(size_frame, 4)
|
@@ -99,5 +112,15 @@ class HtmlOptionsWidget < Fox::FXMatrix
|
|
99
112
|
image_height_field.setText(ruby_2_fox(@options.imageHeight.to_s))
|
100
113
|
end
|
101
114
|
}
|
115
|
+
add_label_to(self, "Widescreen image width:")
|
116
|
+
w_image_width_field = FXTextField.new(self, 4)
|
117
|
+
w_image_width_field.setText(ruby_2_fox(@options.widescreenWidth.to_s))
|
118
|
+
w_image_width_field.connect(SEL_COMMAND) { |sender, sel, ptr|
|
119
|
+
begin
|
120
|
+
@options.widescreenWidth = fox_2_ruby(w_image_width_field.getText).to_i
|
121
|
+
rescue StandardError => ex
|
122
|
+
w_image_width_field.setText(ruby_2_fox(@options.widescreenWidth.to_s))
|
123
|
+
end
|
124
|
+
}
|
102
125
|
end
|
103
126
|
end
|
@@ -63,11 +63,12 @@ class ImageProcessor
|
|
63
63
|
GC.start
|
64
64
|
end
|
65
65
|
|
66
|
-
def fit_image(img, maxW, maxH, quality = 1)
|
66
|
+
def fit_image(img, maxW, maxH, quality = 1, widescreen_w = -1)
|
67
67
|
w = img.getWidth
|
68
68
|
h = img.getHeight
|
69
|
+
used_width = (widescreen_w > 0 and h.to_f > 0 and w.to_f/h.to_f > 1.6) ? widescreen_w : maxW
|
69
70
|
ratios = Array.new(2)
|
70
|
-
ratios[0] =
|
71
|
+
ratios[0] = used_width.to_f / w.to_f
|
71
72
|
ratios[1] = maxH.to_f / h.to_f
|
72
73
|
ratio = ratios.min
|
73
74
|
new_w = (w * ratio).to_i
|
@@ -118,34 +118,34 @@ class OptionsDialog < ModalDialog
|
|
118
118
|
|
119
119
|
def add_tab_ftp_to(tabs)
|
120
120
|
tab = add_tab(tabs, "Upload")
|
121
|
-
|
122
|
-
add_label_to(
|
123
|
-
server_field = FXTextField.new(
|
121
|
+
expert_settings_frame = FXMatrix.new(tab, 2, MATRIX_BY_COLUMNS)
|
122
|
+
add_label_to(expert_settings_frame, "FTP server:")
|
123
|
+
server_field = FXTextField.new(expert_settings_frame, 32)
|
124
124
|
server_field.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
125
125
|
server_field.setText(ruby_2_fox(@options.ftpHost))
|
126
126
|
server_field.connect(SEL_COMMAND) {
|
127
127
|
@options.ftpHost = fox_2_ruby(server_field.getText)
|
128
128
|
}
|
129
|
-
add_label_to(
|
130
|
-
user_field = FXTextField.new(
|
129
|
+
add_label_to(expert_settings_frame, "User:")
|
130
|
+
user_field = FXTextField.new(expert_settings_frame, 32)
|
131
131
|
user_field.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
132
132
|
user_field.setText(@options.ftpUser)
|
133
133
|
user_field.connect(SEL_COMMAND) {
|
134
134
|
@options.ftpUser = fox_2_ruby(user_field.getText)
|
135
135
|
}
|
136
|
-
add_label_to(
|
137
|
-
remote_path_field = FXTextField.new(
|
136
|
+
add_label_to(expert_settings_frame, "Remote path:")
|
137
|
+
remote_path_field = FXTextField.new(expert_settings_frame, 32)
|
138
138
|
remote_path_field.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
139
139
|
remote_path_field.setText(@options.remoteDestinationPath)
|
140
140
|
remote_path_field.connect(SEL_COMMAND) {
|
141
141
|
@options.remoteDestinationPath = fox_2_ruby(remote_path_field.getText)
|
142
142
|
}
|
143
143
|
|
144
|
-
|
145
|
-
add_txt_to(
|
146
|
-
add_txt_to(
|
147
|
-
add_label_to(
|
148
|
-
filters_field = FXTextField.new(
|
144
|
+
expert_settings_frame = FXMatrix.new(tab, 2, MATRIX_BY_COLUMNS)
|
145
|
+
add_txt_to(expert_settings_frame, "Expert settings")
|
146
|
+
add_txt_to(expert_settings_frame, "")
|
147
|
+
add_label_to(expert_settings_frame, "Exclude filters:")
|
148
|
+
filters_field = FXTextField.new(expert_settings_frame, 32)
|
149
149
|
filters_field.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
150
150
|
filters_field.setText(@options.excludeFilters.join(','))
|
151
151
|
filters_field.connect(SEL_COMMAND) {
|
@@ -154,6 +154,28 @@ class OptionsDialog < ModalDialog
|
|
154
154
|
collect { |s| s.strip }.
|
155
155
|
reject { |s| s.length == 0 }
|
156
156
|
}
|
157
|
+
add_label_to(expert_settings_frame, "Timeouts:")
|
158
|
+
timeouts_frame = FXHorizontalFrame.new(expert_settings_frame, FRAME_NONE, 0, 0, 0 , 0, 0, 0, 0, 0)
|
159
|
+
add_label_to(timeouts_frame, "Connection:")
|
160
|
+
connection_timeout_field = FXTextField.new(timeouts_frame, 5)
|
161
|
+
connection_timeout_field.setText(ruby_2_fox(@options.ftpConnectionTimeout.to_s))
|
162
|
+
connection_timeout_field.connect(SEL_COMMAND) { |sender, sel, ptr|
|
163
|
+
begin
|
164
|
+
@options.ftpConnectionTimeout = fox_2_ruby(connection_timeout_field.getText).to_i
|
165
|
+
rescue StandardError => ex
|
166
|
+
connection_timeout_field.setText(ruby_2_fox(@options.ftpConnectionTimeout.to_s))
|
167
|
+
end
|
168
|
+
}
|
169
|
+
add_label_to(timeouts_frame, "Transfer:")
|
170
|
+
transfer_timeout_field = FXTextField.new(timeouts_frame, 5)
|
171
|
+
transfer_timeout_field.setText(ruby_2_fox(@options.ftpTransferTimeout.to_s))
|
172
|
+
transfer_timeout_field.connect(SEL_COMMAND) { |sender, sel, ptr|
|
173
|
+
begin
|
174
|
+
@options.ftpTransferTimeout = fox_2_ruby(transfer_timeout_field.getText).to_i
|
175
|
+
rescue StandardError => ex
|
176
|
+
transfer_timeout_field.setText(ruby_2_fox(@options.ftpTransferTimeout.to_s))
|
177
|
+
end
|
178
|
+
}
|
157
179
|
end
|
158
180
|
|
159
181
|
def add_tab_experimental_to(tabs)
|
@@ -182,6 +204,13 @@ class OptionsDialog < ModalDialog
|
|
182
204
|
cb.connect(SEL_COMMAND) { |sender, sel, ptr|
|
183
205
|
@options.useTable = ptr
|
184
206
|
}
|
207
|
+
cb = FXCheckButton.new(tab,
|
208
|
+
'Use Exif comments',
|
209
|
+
nil, 0, cb_flags)
|
210
|
+
cb.setCheck(@options.useExifComments)
|
211
|
+
cb.connect(SEL_COMMAND) { |sender, sel, ptr|
|
212
|
+
@options.useExifComments = ptr
|
213
|
+
}
|
185
214
|
cb = FXCheckButton.new(tab,
|
186
215
|
'Styles sample',
|
187
216
|
nil, 0, cb_flags)
|
@@ -211,6 +240,16 @@ class OptionsDialog < ModalDialog
|
|
211
240
|
thumb_height_field.setText(ruby_2_fox(@options.thumbHeight.to_s))
|
212
241
|
end
|
213
242
|
}
|
243
|
+
add_label_to(tab, "Cameras naming patterns:")
|
244
|
+
naming_field = FXTextField.new(tab, 32)
|
245
|
+
naming_field.setLayoutHints(LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
246
|
+
naming_field.setText(@options.namingPatterns.join(','))
|
247
|
+
naming_field.connect(SEL_COMMAND) {
|
248
|
+
naming_txt = fox_2_ruby(naming_field.getText)
|
249
|
+
@options.namingPatterns = naming_txt.split(',').
|
250
|
+
collect { |s| s.strip }.
|
251
|
+
reject { |s| s.length == 0 }
|
252
|
+
}
|
214
253
|
end
|
215
254
|
|
216
255
|
def browser_changed
|
@@ -225,7 +264,7 @@ class OptionsDialog < ModalDialog
|
|
225
264
|
|
226
265
|
def validate
|
227
266
|
if @options.browser?
|
228
|
-
return warn("Browser not found"
|
267
|
+
return warn("Warning", "Browser not found") unless File.exists?(@options.browser)
|
229
268
|
end
|
230
269
|
true
|
231
270
|
end
|
@@ -4,10 +4,12 @@
|
|
4
4
|
# piggy.rb allows you to view image files, choose some and generate a new
|
5
5
|
# page for an internet picture album.
|
6
6
|
|
7
|
+
require 'yaml'
|
7
8
|
require 'piggy-core/version'
|
8
9
|
require 'piggy-core/environment'
|
9
10
|
require 'piggy-core/debug'
|
10
11
|
require 'piggy-core/options_persistence'
|
12
|
+
require 'piggy-core/album'
|
11
13
|
require 'piggy-core/winshell'
|
12
14
|
require 'piggy-core/exifr_adapter'
|
13
15
|
require 'piggy-core/nconvert_thumbsgen'
|
@@ -138,10 +140,16 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
138
140
|
|
139
141
|
# File menu entries
|
140
142
|
tmp = FXMenuCommand.new(menus['file'],
|
141
|
-
"&
|
143
|
+
"Open &album...\tCtl-a\tOpen album list file.")
|
144
|
+
tmp.connect(SEL_COMMAND, method(:on_cmd_open_album))
|
145
|
+
tmp = FXMenuCommand.new(menus['file'],
|
146
|
+
"Sa&ve album...\tCtl-v\tSave album list file.")
|
147
|
+
tmp.connect(SEL_COMMAND, method(:on_cmd_save_album))
|
148
|
+
tmp = FXMenuCommand.new(menus['file'],
|
149
|
+
"&Open image...\tCtl-o\tOpen image file.")
|
142
150
|
tmp.connect(SEL_COMMAND, method(:on_cmd_open))
|
143
151
|
tmp = FXMenuCommand.new(menus['file'],
|
144
|
-
"
|
152
|
+
"&Back\t\tBack in history",
|
145
153
|
@backIcon)
|
146
154
|
tmp.connect(SEL_COMMAND, method(:on_cmd_back))
|
147
155
|
tmp = FXMenuCommand.new(menus['file'],
|
@@ -194,8 +202,8 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
194
202
|
msg += "- Ruby #{RUBY_VERSION} (released #{RUBY_RELEASE_DATE})\n"
|
195
203
|
msg += "- FXRuby #{Fox.fxrubyversion}\n"
|
196
204
|
msg += "- FOX Toolkit #{Fox.fxversion}\n"
|
197
|
-
msg += "- Javascript slideshow
|
198
|
-
msg += "- JavaFX animation uses JavaFX Script
|
205
|
+
msg += "- BarelyFitz Javascript slideshow 1.16\n"
|
206
|
+
msg += "- JavaFX animation uses JavaFX Script 1.3 which runs on top of Java 6\n"
|
199
207
|
msg += "- Piggy #{PiggyVersion.display_string}\n"
|
200
208
|
about_title = "About Piggy"
|
201
209
|
tmp = FXMenuCommand.new(menus['help'], "&About Piggy...")
|
@@ -295,6 +303,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
295
303
|
@filelist.choosable = proc { |filename| supports(filename) }
|
296
304
|
@filelist.setLayoutHints(fill_mode)
|
297
305
|
@filelist.connect(SEL_COMMAND, method(:on_cmd_file_list_selection))
|
306
|
+
@filelist.connect(SEL_DOUBLECLICKED, method(:on_cmd_file_list_doubleclicked))
|
298
307
|
@imageview = if UseImageView
|
299
308
|
FXImageView.new(@imageviewframe)
|
300
309
|
else
|
@@ -358,7 +367,10 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
358
367
|
end
|
359
368
|
|
360
369
|
def log(msg)
|
361
|
-
|
370
|
+
time = Time.new.strftime("%H:%M:%S")
|
371
|
+
log_msg = "#{time}> #{msg}\n"
|
372
|
+
puts(log_msg)
|
373
|
+
@pipeLog.appendText(log_msg)
|
362
374
|
end
|
363
375
|
|
364
376
|
def load_image(file)
|
@@ -442,7 +454,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
442
454
|
return FoxThumbnailPageGenerator
|
443
455
|
end
|
444
456
|
|
445
|
-
def set_directory(dirname)
|
457
|
+
def set_directory(dirname, preselect = true)
|
446
458
|
if @historyPos < @history.size
|
447
459
|
@history.pop
|
448
460
|
else
|
@@ -450,7 +462,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
450
462
|
@historyPos = @history.size
|
451
463
|
end
|
452
464
|
@filelist.go_to_directory(dirname)
|
453
|
-
if(@options.preselectDirectories?)
|
465
|
+
if(preselect and @options.preselectDirectories?)
|
454
466
|
@filelist.choose_all_in_filelist
|
455
467
|
next_image
|
456
468
|
end
|
@@ -480,11 +492,14 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
480
492
|
path_string = @shell.ruby_path(osPathString)
|
481
493
|
@exif = ExifrAdapter.new(path_string)
|
482
494
|
info = CommentedFile.new(File.basename(path_string), File.dirname(path_string))
|
495
|
+
info.ctime = File.ctime(info.name_with_path)
|
496
|
+
info.mtime = File.mtime(info.name_with_path)
|
497
|
+
info.date_time = @exif.date_time
|
483
498
|
if @fileInfos.has_key?(info)
|
484
499
|
info = @fileInfos[info]
|
485
500
|
else
|
486
501
|
info.rotation = @exif.view_degrees
|
487
|
-
info.comment = @exif.comment
|
502
|
+
info.comment = @exif.comment if @options.useExifComments?
|
488
503
|
@fileInfos[info] = info
|
489
504
|
end
|
490
505
|
return info
|
@@ -544,7 +559,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
544
559
|
if @currentRotation >= 360
|
545
560
|
@currentRotation = @currentRotation - 360
|
546
561
|
end
|
547
|
-
@orientationStatus.setText(ruby_2_fox(@currentRotation.to_s + '�'))
|
562
|
+
@orientationStatus.setText(ruby_2_fox(@currentRotation.to_s + '�'))
|
548
563
|
current_file_info.rotation = @currentRotation
|
549
564
|
end
|
550
565
|
|
@@ -580,6 +595,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
580
595
|
begin
|
581
596
|
if(@options.browser?)
|
582
597
|
cmd = @options.browser
|
598
|
+
cmd = "\"#{cmd}\"" if PLATFORM =~ /mswin/ and cmd.size > 0 and cmd[0] != "\""[0]
|
583
599
|
@pipeLog.run_command(cmd + ' ' + url, working_dir, true)
|
584
600
|
else
|
585
601
|
if PLATFORM =~ /mswin/
|
@@ -632,22 +648,75 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
632
648
|
|
633
649
|
def open_system_file_chooser
|
634
650
|
open_dialog = FXFileDialog.new(self, "Open Image")
|
635
|
-
|
636
|
-
open_dialog.set_directory(@filelist.get_current_directory)
|
651
|
+
open_dialog.directory = @filelist.get_current_directory
|
637
652
|
patterns = ["All Files (*)" ] + @supportedImageTypes.values
|
638
653
|
open_dialog.patternList = patterns
|
639
654
|
open_dialog.currentPattern = @preferredFileFilter
|
640
655
|
if open_dialog.execute
|
641
656
|
@preferredFileFilter = open_dialog.currentPattern
|
642
|
-
filename = open_dialog.filename
|
643
|
-
set_directory(open_dialog.getDirectory)
|
657
|
+
filename = fox_2_ruby(open_dialog.filename)
|
658
|
+
set_directory(fox_2_ruby(open_dialog.getDirectory))
|
644
659
|
open_file_or_link(filename)
|
645
660
|
end
|
646
661
|
end
|
662
|
+
|
663
|
+
def on_cmd_open_album(sender, sel, ptr)
|
664
|
+
open_dialog = FXFileDialog.new(self, "Open album list file")
|
665
|
+
open_dialog.directory = @filelist.get_current_directory
|
666
|
+
patterns = ["All Files (*)" , "Yaml Files (*.yaml)"]
|
667
|
+
open_dialog.patternList = patterns
|
668
|
+
open_dialog.currentPattern = 1
|
669
|
+
if open_dialog.execute
|
670
|
+
filename = fox_2_ruby(open_dialog.filename)
|
671
|
+
return unless File.exists?(filename)
|
672
|
+
begin
|
673
|
+
album = File.open(filename) { |io| YAML.load(io) }
|
674
|
+
return unless album.class == Album
|
675
|
+
set_directory(album.path, false) unless (album.path.nil?)
|
676
|
+
unless(album.file_infos.nil?)
|
677
|
+
album.file_infos.each { |info|
|
678
|
+
@fileInfos[info] = info
|
679
|
+
@filelist.choose(info.name_with_path)
|
680
|
+
@filelist.update_file_list
|
681
|
+
}
|
682
|
+
next_image
|
683
|
+
end
|
684
|
+
rescue StandardError => ex
|
685
|
+
puts('Not an album file: ' + ex.message)
|
686
|
+
end
|
687
|
+
end
|
688
|
+
end
|
689
|
+
|
690
|
+
def on_cmd_save_album(sender, sel, ptr)
|
691
|
+
open_dialog = FXFileDialog.new(self, "Save album list file")
|
692
|
+
open_dialog.directory = @filelist.get_current_directory
|
693
|
+
patterns = ["All Files (*)" , "Yaml Files (*.yaml)"]
|
694
|
+
open_dialog.patternList = patterns
|
695
|
+
open_dialog.currentPattern = 1
|
696
|
+
if open_dialog.execute
|
697
|
+
filename = fox_2_ruby(open_dialog.filename)
|
698
|
+
filename = filename + ".yaml"unless(filename.split('.')[-1] == "yaml")
|
699
|
+
begin
|
700
|
+
album = Album.new
|
701
|
+
album.path = @filelist.get_current_directory
|
702
|
+
album.file_infos = chosen_sequence.collect { |f| info_for_file(f) }
|
703
|
+
File.open(filename, 'w') { |out|
|
704
|
+
YAML.dump(album, out)
|
705
|
+
}
|
706
|
+
puts "Album saved to #{filename}"
|
707
|
+
rescue StandardError => ex
|
708
|
+
puts "Album could not be saved to #{filename}: " + ex.message
|
709
|
+
end
|
710
|
+
end
|
711
|
+
end
|
647
712
|
|
648
713
|
# Command message from the file list
|
649
714
|
|
650
715
|
def on_cmd_file_list_selection(sender, dummy, index)
|
716
|
+
select_index(index) unless @filelist.isItemDirectory(index)
|
717
|
+
end
|
718
|
+
|
719
|
+
def on_cmd_file_list_doubleclicked(sender, dummy, index)
|
651
720
|
select_index(index)
|
652
721
|
end
|
653
722
|
|
@@ -778,7 +847,20 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
778
847
|
generator.set_title(title)
|
779
848
|
generator.set_output_directory(output_dir)
|
780
849
|
generator.client = @pipeLog
|
781
|
-
|
850
|
+
info_sequence = chosen_sequence.collect { |f| info_for_file(f) }
|
851
|
+
info_sequence.sort! { |x, y| x.name <=> y.name }
|
852
|
+
if(@options.sort_by_time?)
|
853
|
+
guess_missing_times(info_sequence)
|
854
|
+
info_sequence.sort! { |x, y|
|
855
|
+
begin
|
856
|
+
c1 = x.date_time <=> y.date_time
|
857
|
+
rescue Exception
|
858
|
+
c1 = 0
|
859
|
+
end
|
860
|
+
c1 == 0 ? x.name <=> y.name : c1
|
861
|
+
}
|
862
|
+
end
|
863
|
+
generator.set_files(info_sequence)
|
782
864
|
getApp.beginWaitCursor
|
783
865
|
progress = ProgressWithDialog.new(self)
|
784
866
|
progress.set_task('Generating', @filelist.num_files_chosen)
|
@@ -787,6 +869,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
787
869
|
begin
|
788
870
|
if(@options.stylesSample?)
|
789
871
|
actual_options = @options.clone
|
872
|
+
success = true
|
790
873
|
begin
|
791
874
|
get_style_list.each { |style|
|
792
875
|
@options.style = style
|
@@ -811,12 +894,48 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
811
894
|
end
|
812
895
|
if(success)
|
813
896
|
open_html_browser_on_result(generator)
|
897
|
+
log("Done!")
|
814
898
|
else
|
815
|
-
|
899
|
+
log('Error')
|
816
900
|
error("Error in html generation!")
|
817
901
|
end
|
818
902
|
return success
|
819
903
|
end
|
904
|
+
|
905
|
+
# Call this if some files have an exif date_time and some don't.
|
906
|
+
# Assume that the given ordering for each naming pattern
|
907
|
+
# is correct and simply take the time from the predecessor in
|
908
|
+
# the subsequence corresponding to a naming pattern.
|
909
|
+
def guess_missing_times(info_sequence)
|
910
|
+
done = Set.new
|
911
|
+
(@options.namingPatterns + ['.*']).collect { |p| Regexp.new(p) }.each do
|
912
|
+
|pattern|
|
913
|
+
subsequence = info_sequence.select {
|
914
|
+
|info|
|
915
|
+
info.name =~ pattern and not done.include?(info.name_with_path)
|
916
|
+
}
|
917
|
+
subsequence.each { |info| done.add(info.name_with_path) }
|
918
|
+
guess_missing_times_for_subsequence(subsequence)
|
919
|
+
end
|
920
|
+
end
|
921
|
+
|
922
|
+
def guess_missing_times_for_subsequence(info_sequence)
|
923
|
+
first_with_time = info_sequence.detect{
|
924
|
+
|info|
|
925
|
+
puts "#{info.name} - #{info.date_time}"
|
926
|
+
not info.date_time.nil?
|
927
|
+
}
|
928
|
+
return if first_with_time.nil?
|
929
|
+
time = first_with_time.date_time
|
930
|
+
info_sequence.each do
|
931
|
+
|info|
|
932
|
+
if(info.date_time.nil?)
|
933
|
+
info.date_time = time
|
934
|
+
else
|
935
|
+
time = info.date_time
|
936
|
+
end
|
937
|
+
end
|
938
|
+
end
|
820
939
|
|
821
940
|
def on_ftp_browser_dialog_closed(sender, sel, ptr)
|
822
941
|
# get options?
|
data/lib/templates/PiggyFX.jar
CHANGED
Binary file
|