Piggy 0.4.2.3 → 0.4.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +11 -0
- data/README.txt +6 -0
- data/lib/icons/fullscreen.ico +0 -0
- data/lib/piggy-core/exifr_adapter.rb +21 -2
- data/lib/piggy-core/nconvert_thumbsgen.rb +1 -1
- data/lib/piggy-core/options.rb +2 -2
- data/lib/piggy-core/thumbnail_page_generator.rb +44 -43
- data/lib/piggy-core/version.rb +1 -1
- data/lib/piggy-gui/filtered_file_list.rb +1 -1
- data/lib/piggy-gui/fullscreen.rb +27 -0
- data/lib/piggy-gui/html_generation_dialog.rb +21 -0
- data/lib/piggy-gui/piggy_image_browser.rb +59 -11
- data/lib/piggy-gui/pipe_log.rb +8 -8
- data/lib/templates/slideshow.htm +1 -3
- data/lib/templates/styles/shadow_bowers/shadow-lb.jpg +0 -0
- data/lib/templates/styles/shadow_bowers/shadow-rt.jpg +0 -0
- data/lib/templates/styles/shadow_bowers/shadow.jpg +0 -0
- data/lib/templates/styles/shadow_bowers/style.css +95 -0
- metadata +77 -61
data/CHANGES.txt
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
Changes in 0.4.2-4
|
2
|
+
- Bugfix for opening browsers
|
3
|
+
- Bugfix utf8 conversion of comments
|
4
|
+
- Include comments in javascript slideshow
|
5
|
+
- Return immediately when opening browsers
|
6
|
+
- Make filelist a single column
|
7
|
+
- Provide additional fullscreen window
|
8
|
+
- Display JPEG properties, use comment if given
|
9
|
+
- Make image size in html export an editable option
|
10
|
+
- More markup in image page
|
11
|
+
|
1
12
|
Changes in 0.4.2-3
|
2
13
|
- Bugfix: Convert /^~/ to home directory
|
3
14
|
- Usability of modal dialogs (e. g. validate before accept)
|
data/README.txt
CHANGED
@@ -25,3 +25,9 @@ Piggy is not meant as general purpose tool for image manipulations:
|
|
25
25
|
- Image rotation reduces the quality of the image
|
26
26
|
- Piggy saves images without exif informations.
|
27
27
|
Therefore the save action refuses to overwrite existing images.
|
28
|
+
|
29
|
+
Zipfile will include original images including all metadata.
|
30
|
+
Uncheck this option if this metadata includes personal information
|
31
|
+
that you do not want to publish.
|
32
|
+
(See http://netzreport.googlepages.com/hidden_data_in_jpeg_files.html
|
33
|
+
for more information on this topic.)
|
Binary file
|
@@ -14,9 +14,28 @@ class ExifrAdapter
|
|
14
14
|
@exif && @exif.exif?
|
15
15
|
end
|
16
16
|
|
17
|
+
def comment
|
18
|
+
return '' unless @exif
|
19
|
+
c = @exif.comment.class == String ? @exif.comment : @exif.comment.to_s
|
20
|
+
return c.gsub(/\0/, '')
|
21
|
+
end
|
22
|
+
|
17
23
|
def to_s
|
18
|
-
return 'no exif' unless exif
|
19
|
-
desc = "
|
24
|
+
return 'no exif' unless @exif
|
25
|
+
desc = "Properties:\n"
|
26
|
+
desc += "\theight: #{@exif.height.to_s}\n"
|
27
|
+
desc += "\twidth: #{@exif.width.to_s}\n"
|
28
|
+
desc += "\tbits: #{@exif.bits.to_s}\n"
|
29
|
+
if @exif.comment.class == String
|
30
|
+
desc += "\tcomment: #{@exif.comment}\n"
|
31
|
+
elsif @exif.comment.class == Array
|
32
|
+
desc += "\tcomments: "
|
33
|
+
@exif.comment.each { |c|
|
34
|
+
desc += "\t\t#{c}\n"
|
35
|
+
}
|
36
|
+
end
|
37
|
+
return desc unless @exif.exif?
|
38
|
+
desc += "Exif:\n\t"
|
20
39
|
h = @exif.exif.to_hash
|
21
40
|
desc += h.keys.collect { |k| "#{k.to_s}: #{h[k].to_s}" }.join("\n\t")
|
22
41
|
return desc
|
@@ -34,7 +34,7 @@ class NconvertThumbnailPageGenerator < ThumbnailPageGenerator
|
|
34
34
|
resize = '-resize ' + width.to_s + ' ' + height.to_s
|
35
35
|
rotate = fileInfo.rotate? ? " -rotate #{fileInfo.rotation.to_s} " : ''
|
36
36
|
command = "#{nconvertPath} #{format} #{mode} #{rotate} #{resize} #{sharpen} #{out} #{filesArgString}"
|
37
|
-
client.runCommand(command, osPath(
|
37
|
+
client.runCommand(command, osPath(fileInfo.path))
|
38
38
|
end
|
39
39
|
|
40
40
|
def conversionTypeFor(type)
|
data/lib/piggy-core/options.rb
CHANGED
@@ -62,8 +62,8 @@ class PiggyOptions
|
|
62
62
|
end
|
63
63
|
@thumbWidth = 100 if @thumbWidth.nil?
|
64
64
|
@thumbHeight = 100 if @thumbHeight.nil?
|
65
|
-
@imageWidth =
|
66
|
-
@imageHeight =
|
65
|
+
@imageWidth = 600 if @imageWidth.nil?
|
66
|
+
@imageHeight = 520 if @imageHeight.nil?
|
67
67
|
@generateFramePage = false if @generateFramePage.nil?
|
68
68
|
@useTable = generateFramePage? if @uosPathseTable.nil?
|
69
69
|
@localDestinationPath = WinShell.instance.pictureDirectory if @localDestinationPath.nil?
|
@@ -83,12 +83,6 @@ class ThumbnailPageGenerator < HtmlGenerator
|
|
83
83
|
escapeHtml("#{info.nameWithoutExtension}.#{conversionTypeFor(info.extension)}")
|
84
84
|
end
|
85
85
|
|
86
|
-
##
|
87
|
-
# Set path to directory containing the original image files
|
88
|
-
def setInputDirectory(inputDir)
|
89
|
-
@inputDir = inputDir
|
90
|
-
end
|
91
|
-
|
92
86
|
def setFiles(fileInfos)
|
93
87
|
@inputFilenames = fileInfos
|
94
88
|
end
|
@@ -176,20 +170,42 @@ class ThumbnailPageGenerator < HtmlGenerator
|
|
176
170
|
stylesheet subStylesheetUrl
|
177
171
|
}
|
178
172
|
body({"class"=>"image_page"}) {
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
173
|
+
div({'class' => 'content'}){
|
174
|
+
div({'class' => 'navigation'}){
|
175
|
+
div {
|
176
|
+
div {
|
177
|
+
p {
|
178
|
+
a({"HREF" => escapeHTML(pred) + HtmlExt}){
|
179
|
+
addHtml(escapeHTML(i == 0 ? 'last' : 'previous'))
|
180
|
+
}
|
181
|
+
a({"HREF" => escapeHTML(backlink) }) {
|
182
|
+
addHtml(escapeHTML('overview'))
|
183
|
+
}
|
184
|
+
a({"HREF" => escapeHTML(succ) + HtmlExt}) {
|
185
|
+
addHtml(escapeHTML(i == maxInd ? 'first' : 'next'))
|
186
|
+
}
|
187
|
+
}
|
188
|
+
}
|
189
|
+
}
|
190
|
+
}
|
191
|
+
div({'class' => 'image'}){
|
192
|
+
div {
|
193
|
+
div {
|
194
|
+
p {
|
195
|
+
img(imageName(currentInfo), escapeHTML(current))
|
196
|
+
}
|
197
|
+
}
|
198
|
+
}
|
199
|
+
}
|
200
|
+
div({'class' => 'comment'}){
|
201
|
+
div {
|
202
|
+
div {
|
203
|
+
p { addHtml(escapeHTML(comment)) }
|
204
|
+
}
|
205
|
+
}
|
206
|
+
}
|
207
|
+
}
|
208
|
+
}
|
193
209
|
}
|
194
210
|
File.open(File.join(imageOutputPath, current + HtmlExt), 'w') { | fp |
|
195
211
|
fp.print(getPage)
|
@@ -197,28 +213,26 @@ class ThumbnailPageGenerator < HtmlGenerator
|
|
197
213
|
}
|
198
214
|
end
|
199
215
|
|
200
|
-
def buildSlideshowList
|
216
|
+
def buildSlideshowList
|
201
217
|
File.open(File.join(imageOutputPath, 'images.js'), 'w') { | fp |
|
202
218
|
fp.print("var images = new Array(\n")
|
203
219
|
maxInd = @inputFilenames.size - 1
|
204
220
|
(0..maxInd).each { | i |
|
205
|
-
current = slideshowImage(@inputFilenames[i]
|
206
|
-
fp.print("
|
221
|
+
current = slideshowImage(@inputFilenames[i])
|
222
|
+
fp.print("#{current}")
|
207
223
|
fp.print(i == maxInd ? "\n" : ",\n")
|
208
224
|
}
|
209
225
|
fp.print(")\n")
|
210
226
|
}
|
211
227
|
unless @inputFilenames.empty?
|
212
|
-
updateSlideshowTemplate(slideshowImage(@inputFilenames[1]
|
228
|
+
updateSlideshowTemplate(slideshowImage(@inputFilenames[1]))
|
213
229
|
end
|
214
230
|
end
|
215
231
|
|
216
|
-
def slideshowImage(
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
end
|
221
|
-
return img
|
232
|
+
def slideshowImage(fileInfo)
|
233
|
+
src = imageName(fileInfo)
|
234
|
+
txt = escapeHtml(fileInfo.comment)
|
235
|
+
"new slide(\"#{src}\", \"\", \"#{txt}\")"
|
222
236
|
end
|
223
237
|
|
224
238
|
def updateSlideshowTemplate(imageFile)
|
@@ -513,19 +527,6 @@ class ThumbnailPageGenerator < HtmlGenerator
|
|
513
527
|
return true
|
514
528
|
end
|
515
529
|
|
516
|
-
# This method will create an adhoc slideshow in the
|
517
|
-
# imageOutputPath without copying any image
|
518
|
-
# Just for testing issues
|
519
|
-
# Works fine if all the images allready have appropriate size
|
520
|
-
def onTheFlySlideshow
|
521
|
-
unless File.directory?(File.join(outputPath, subDir))
|
522
|
-
createSubdir
|
523
|
-
end
|
524
|
-
copyTemplates(['slideshow.htm', 'slideshow.js'], imageOutputPath)
|
525
|
-
buildSlideshowList(@inputDir)
|
526
|
-
return File.join(imageOutputPath, 'slideshow.htm')
|
527
|
-
end
|
528
|
-
|
529
530
|
protected
|
530
531
|
|
531
532
|
##
|
data/lib/piggy-core/version.rb
CHANGED
@@ -14,7 +14,7 @@ class FilteredFileList < Fox::FXFileList
|
|
14
14
|
attr_writer(:choosable)
|
15
15
|
|
16
16
|
def initialize(parent)
|
17
|
-
super(parent, nil, 0, ICONLIST_MINI_ICONS|ICONLIST_AUTOSIZE)
|
17
|
+
super(parent, nil, 0, ICONLIST_MINI_ICONS|ICONLIST_AUTOSIZE|ICONLIST_COLUMNS)
|
18
18
|
@imageProcessor = ImageProcessor.new(getApp)
|
19
19
|
@chosenFiles = Set.new
|
20
20
|
@choosable = proc { |file| true }
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#!/usr/bin/ruby
|
2
|
+
## $Id: html_generation_dialog.rb 190 2008-02-02 18:52:57Z Sascha $
|
3
|
+
|
4
|
+
require 'piggy-gui/require-fox'
|
5
|
+
|
6
|
+
# Provide a validation hook for ID_ACCEPT action
|
7
|
+
class Fullscreen < Fox::FXMainWindow
|
8
|
+
include Fox
|
9
|
+
include Responder
|
10
|
+
|
11
|
+
def initialize(*args)
|
12
|
+
super(*args)
|
13
|
+
FXMAPFUNC(SEL_KEYPRESS, 0, :onKeyPress)
|
14
|
+
end
|
15
|
+
|
16
|
+
def onKeyPress(sender, sel, event)
|
17
|
+
if event.code == KEY_Escape
|
18
|
+
if FOXVERSION_GE_1_2
|
19
|
+
close(true)
|
20
|
+
else
|
21
|
+
hide()
|
22
|
+
end
|
23
|
+
return 1
|
24
|
+
end
|
25
|
+
return 0
|
26
|
+
end
|
27
|
+
end
|
@@ -51,6 +51,11 @@ class HtmlGenerationDialog < ModalDialog
|
|
51
51
|
nil, 0, COMBOBOX_INSERT_LAST)
|
52
52
|
@styleTextField.setFrameStyle(FRAME_SUNKEN|FRAME_THICK)
|
53
53
|
@styleTextField.setLayoutHints(LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
|
54
|
+
@labels.push(FXLabel.new(@contents, "Image size:"))
|
55
|
+
sizeFrame = FXHorizontalFrame.new(@contents, FRAME_NONE, 0, 0, 0 , 0, 0, 0, 0, 0)
|
56
|
+
@imageWidthField = FXTextField.new(sizeFrame, 4)
|
57
|
+
FXLabel.new(sizeFrame, " x ")
|
58
|
+
@imageHeightField = FXTextField.new(sizeFrame, 4)
|
54
59
|
addOkCancelButtonsTo(@frame)
|
55
60
|
end
|
56
61
|
|
@@ -73,6 +78,8 @@ class HtmlGenerationDialog < ModalDialog
|
|
73
78
|
@genFrameNo.setCheck(!@options.generateFramePage)
|
74
79
|
@addZipCheck.setCheck(@options.addZip?)
|
75
80
|
@addSlideshowCheck.setCheck(@options.addSlideshow?)
|
81
|
+
@imageWidthField.setText(ruby2Fox(@options.imageWidth.to_s))
|
82
|
+
@imageHeightField.setText(ruby2Fox(@options.imageHeight.to_s))
|
76
83
|
updateStylesList
|
77
84
|
end
|
78
85
|
|
@@ -95,6 +102,20 @@ class HtmlGenerationDialog < ModalDialog
|
|
95
102
|
@options.style = ptr
|
96
103
|
validateStyle
|
97
104
|
}
|
105
|
+
@imageWidthField.connect(SEL_COMMAND) { |sender, sel, ptr|
|
106
|
+
begin
|
107
|
+
@options.imageWidth = fox2Ruby(@imageWidthField.getText).to_i
|
108
|
+
rescue StandardError => ex
|
109
|
+
@imageWidthField.setText(ruby2Fox(@options.imageWidth.to_s))
|
110
|
+
end
|
111
|
+
}
|
112
|
+
@imageHeightField.connect(SEL_COMMAND) { |sender, sel, ptr|
|
113
|
+
begin
|
114
|
+
@options.imageHeight = fox2Ruby(@imageHeightField.getText).to_i
|
115
|
+
rescue StandardError => ex
|
116
|
+
@imageHeightField.setText(ruby2Fox(@options.imageHeight.to_s))
|
117
|
+
end
|
118
|
+
}
|
98
119
|
end
|
99
120
|
|
100
121
|
def getSubdir
|
@@ -21,6 +21,7 @@ require 'piggy-gui/options_dialog'
|
|
21
21
|
require 'piggy-gui/ftp_browser_widget'
|
22
22
|
require 'piggy-gui/progress_with_dialog'
|
23
23
|
require 'piggy-gui/filtered_file_list'
|
24
|
+
require 'piggy-gui/fullscreen'
|
24
25
|
|
25
26
|
if RMAGICK_AVAILIABLE
|
26
27
|
require 'piggy-core/rmagick_thumbnail_page_generator'
|
@@ -58,6 +59,8 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
58
59
|
|
59
60
|
def initVars
|
60
61
|
@slideManager = nil
|
62
|
+
@fullscreen = nil
|
63
|
+
@fullscreenView = nil
|
61
64
|
@shell = WinShell.instance
|
62
65
|
@history = Array.new
|
63
66
|
@historyPos = @history.size
|
@@ -100,6 +103,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
100
103
|
@previousImageIcon = getIcon("previous-image.ico")
|
101
104
|
@slideshowImageIcon = getIcon("slides.ico")
|
102
105
|
@slideshowOffImageIcon = getIcon("stop-slides.ico")
|
106
|
+
@fullscreenIcon = getIcon("fullscreen.ico")
|
103
107
|
end
|
104
108
|
|
105
109
|
def initStatusbar
|
@@ -234,6 +238,8 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
234
238
|
@delayField.connect(SEL_COMMAND) { |sender, sel, ptr|
|
235
239
|
@options.slideshowDelay = @delayField.getText.to_i
|
236
240
|
}
|
241
|
+
newToolbarButton(@fullscreenIcon, "&Full\tOpen fullscreen",
|
242
|
+
method(:onCmdFullscreen))
|
237
243
|
|
238
244
|
newToolbarButton(@rotateIcon, "&Rotate\tRotate 90� right",
|
239
245
|
method(:onRotate90))
|
@@ -351,7 +357,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
351
357
|
def loadImage(file)
|
352
358
|
@filename = file # needs to be called this early
|
353
359
|
info = currentFileInfo
|
354
|
-
@imageComment.setText(info.comment)
|
360
|
+
@imageComment.setText(ruby2Fox(info.comment))
|
355
361
|
setCurrentRotation(info.rotation)
|
356
362
|
reloadImage(file)
|
357
363
|
end
|
@@ -367,9 +373,15 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
367
373
|
image.create
|
368
374
|
@imageview.image = image
|
369
375
|
else
|
370
|
-
|
371
|
-
|
372
|
-
|
376
|
+
if fullscreen? && @fullScreenView
|
377
|
+
old = @fullScreenView.image
|
378
|
+
@fullScreenView.loadImage(@filename, false, @currentRotation)
|
379
|
+
@imageProcessor.garbageImage(old) unless old.nil?
|
380
|
+
else
|
381
|
+
old = @imageview.image
|
382
|
+
@imageview.loadImage(file, false, @currentRotation)
|
383
|
+
@imageProcessor.garbageImage(old) unless old.nil?
|
384
|
+
end
|
373
385
|
end
|
374
386
|
@imageProcessor.garbageImage(old) unless old.nil?
|
375
387
|
end
|
@@ -393,7 +405,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
393
405
|
end
|
394
406
|
if(supports(filename))
|
395
407
|
loadImage(rubyFile)
|
396
|
-
@exifView.setText("#{File.basename(rubyFile)}\n#{@exif.to_s}")
|
408
|
+
@exifView.setText(ruby2Fox("#{File.basename(rubyFile)}\n#{@exif.to_s}"))
|
397
409
|
@filelist.assumeSelected(rubyFile)
|
398
410
|
return 1
|
399
411
|
end
|
@@ -465,6 +477,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
465
477
|
info = @fileInfos[info]
|
466
478
|
else
|
467
479
|
info.rotation = @exif.viewDegrees
|
480
|
+
info.comment = @exif.comment
|
468
481
|
@fileInfos[info] = info
|
469
482
|
end
|
470
483
|
return info
|
@@ -545,9 +558,12 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
545
558
|
if(@options.browser?)
|
546
559
|
getApp.beginWaitCursor
|
547
560
|
begin
|
548
|
-
|
549
|
-
|
550
|
-
|
561
|
+
cmd = @options.browser
|
562
|
+
args = @shell.osPath(generator.mainIndexWithPath)
|
563
|
+
path = generator.mainIndexPath
|
564
|
+
@pipeLog.runCommand(cmd + ' ' + args, path, true)
|
565
|
+
rescue StandardError => ex
|
566
|
+
log(ex.to_s)
|
551
567
|
end
|
552
568
|
getApp.endWaitCursor
|
553
569
|
end
|
@@ -641,8 +657,33 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
641
657
|
|
642
658
|
def stopSlideshow
|
643
659
|
@slideManager = nil
|
660
|
+
stopFullscreen
|
644
661
|
end
|
645
|
-
|
662
|
+
|
663
|
+
def startFullscreen
|
664
|
+
fillMode = LAYOUT_FILL_X|LAYOUT_FILL_Y|LAYOUT_CENTER_X|LAYOUT_CENTER_Y
|
665
|
+
@fullscreen = Fullscreen.new(getApp, "Piggy fullscreen", nil, nil,
|
666
|
+
DECOR_BORDER|DECOR_TITLE|DECOR_CLOSE)
|
667
|
+
@fullScreenView = MultiImageCanvas.new(@fullscreen, fillMode)
|
668
|
+
@fullscreen.connect(SEL_CLOSE){ |sender, sel, ptr|
|
669
|
+
stopFullscreen
|
670
|
+
}
|
671
|
+
@fullscreen.create
|
672
|
+
@fullscreen.show(PLACEMENT_MAXIMIZED)
|
673
|
+
reloadImage(@filename)
|
674
|
+
end
|
675
|
+
|
676
|
+
def stopFullscreen
|
677
|
+
@fullscreen.destroy if fullscreen?
|
678
|
+
@fullscreen = nil
|
679
|
+
@fullScreenView = nil
|
680
|
+
reloadImage(@filename)
|
681
|
+
end
|
682
|
+
|
683
|
+
def fullscreen?
|
684
|
+
@fullscreen && @fullscreen.shown?
|
685
|
+
end
|
686
|
+
|
646
687
|
def selectIndex(index)
|
647
688
|
return 0 if index < 0
|
648
689
|
if @filelist.isItemDirectory(index)
|
@@ -688,6 +729,14 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
688
729
|
end
|
689
730
|
end
|
690
731
|
|
732
|
+
def onCmdFullscreen(sender, sel, index)
|
733
|
+
if fullscreen?
|
734
|
+
stopFullscreen
|
735
|
+
else
|
736
|
+
startFullscreen
|
737
|
+
end
|
738
|
+
end
|
739
|
+
|
691
740
|
def onCmdGenerateHtml(sender, sel, index)
|
692
741
|
unless @filelist.anyFilesChosen?
|
693
742
|
return error("Select some image files first!")
|
@@ -703,7 +752,6 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
703
752
|
generator = generatorClass.new(@options)
|
704
753
|
generator.client = @pipeLog
|
705
754
|
generator.setOutputDirectory(outputDir)
|
706
|
-
generator.setInputDirectory(directory)
|
707
755
|
generator.setTitle(title)
|
708
756
|
generator.setFiles(chosenSequence.collect { |f| infoForFile(f) })
|
709
757
|
getApp.beginWaitCursor
|
@@ -732,7 +780,7 @@ class PiggyImageBrowser < Fox::FXMainWindow
|
|
732
780
|
end
|
733
781
|
|
734
782
|
def onCommentMightHaveChanged(sender, sel, ptr)
|
735
|
-
currentFileInfo.comment = @imageComment.getText
|
783
|
+
currentFileInfo.comment = fox2Ruby(@imageComment.getText)
|
736
784
|
end
|
737
785
|
|
738
786
|
# EXIT
|
data/lib/piggy-gui/pipe_log.rb
CHANGED
@@ -9,8 +9,7 @@ require 'piggy-gui/require-fox'
|
|
9
9
|
class PipeLog < Fox::FXText
|
10
10
|
include Fox
|
11
11
|
include Responder
|
12
|
-
|
13
|
-
UsePipes = false
|
12
|
+
UsePipes = true
|
14
13
|
|
15
14
|
def initialize(parent)
|
16
15
|
super(parent)
|
@@ -18,12 +17,12 @@ class PipeLog < Fox::FXText
|
|
18
17
|
@pipes = Array.new
|
19
18
|
end
|
20
19
|
|
21
|
-
def runCommand(commandline, workingDir)
|
20
|
+
def runCommand(commandline, workingDir, spawn = false)
|
22
21
|
inPath(workingDir) {
|
23
|
-
runCommandAndDisplayOutput(commandline)
|
22
|
+
runCommandAndDisplayOutput(commandline, spawn)
|
24
23
|
}
|
25
24
|
end
|
26
|
-
|
25
|
+
|
27
26
|
def hasOpenPipes?
|
28
27
|
!@pipes.empty?
|
29
28
|
end
|
@@ -42,16 +41,17 @@ class PipeLog < Fox::FXText
|
|
42
41
|
@pipes.delete(aPipe)
|
43
42
|
end
|
44
43
|
|
45
|
-
def runCommandAndDisplayOutput(commandline)
|
46
|
-
unless UsePipes
|
44
|
+
def runCommandAndDisplayOutput(commandline, spawn)
|
45
|
+
unless spawn && UsePipes
|
47
46
|
system(commandline)
|
48
47
|
msg = "#{$? != 0 ? 'Error' : 'Success'}: #{commandline}\n"
|
49
48
|
appendText(msg)
|
50
49
|
return
|
51
50
|
end
|
52
51
|
newPipe = IO.popen("#{commandline} 2>&1")
|
52
|
+
return if(spawn)
|
53
53
|
getApp().addInput(newPipe, @inputTypes) { |sender, sel, ptr|
|
54
|
-
case
|
54
|
+
case FXSELTYPE(sel)
|
55
55
|
when SEL_IO_READ
|
56
56
|
text = newPipe.read
|
57
57
|
if text
|
data/lib/templates/slideshow.htm
CHANGED
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,95 @@
|
|
1
|
+
body {
|
2
|
+
font-family: Helvetica, Arial, sans-serif;
|
3
|
+
}
|
4
|
+
|
5
|
+
body.thumbs {
|
6
|
+
text-align: center;
|
7
|
+
}
|
8
|
+
|
9
|
+
div {
|
10
|
+
margin:0;
|
11
|
+
padding:0;
|
12
|
+
}
|
13
|
+
|
14
|
+
dl {
|
15
|
+
margin-left: auto;
|
16
|
+
margin-right: auto;
|
17
|
+
max-width:600px;
|
18
|
+
}
|
19
|
+
|
20
|
+
/* no max-width in IE < 7 */
|
21
|
+
* html dl {
|
22
|
+
width: 600px;
|
23
|
+
}
|
24
|
+
|
25
|
+
dd {
|
26
|
+
margin:0;
|
27
|
+
padding: 0;
|
28
|
+
width: 120px;
|
29
|
+
height: 125px;
|
30
|
+
float: left;
|
31
|
+
vertical-align: top;
|
32
|
+
text-align: center;
|
33
|
+
}
|
34
|
+
|
35
|
+
.preview {
|
36
|
+
float:left;
|
37
|
+
}
|
38
|
+
|
39
|
+
* html .image_page div {
|
40
|
+
float: left;
|
41
|
+
}
|
42
|
+
|
43
|
+
.image_page .navigation div div {
|
44
|
+
float: left;
|
45
|
+
width: 100%;
|
46
|
+
border-bottom: solid 1px Silver;
|
47
|
+
padding-bottom: 4px;
|
48
|
+
margin-bottom: 8px;
|
49
|
+
}
|
50
|
+
|
51
|
+
.image_page .navigation a {
|
52
|
+
display: block;
|
53
|
+
float: left;
|
54
|
+
width: 60px;
|
55
|
+
margin: 10px;
|
56
|
+
text-decoration: none;
|
57
|
+
color: Silver;
|
58
|
+
font-weight: bold;
|
59
|
+
}
|
60
|
+
|
61
|
+
.image_page .image {
|
62
|
+
clear: both;
|
63
|
+
float: left;
|
64
|
+
}
|
65
|
+
|
66
|
+
.image_page .comment p {
|
67
|
+
padding: 8px;
|
68
|
+
}
|
69
|
+
|
70
|
+
.thumb, .image_page .image div {
|
71
|
+
background-image:url("shadow.jpg");
|
72
|
+
background-position:right bottom;
|
73
|
+
background-repeat:no-repeat;
|
74
|
+
}
|
75
|
+
|
76
|
+
.thumb p, .image_page .image div div {
|
77
|
+
margin:0;
|
78
|
+
padding:0;
|
79
|
+
background-image:url("shadow-rt.jpg");
|
80
|
+
background-position:right -80px;
|
81
|
+
background-repeat:no-repeat;
|
82
|
+
}
|
83
|
+
|
84
|
+
.thumb p a, .image_page .image div div p {
|
85
|
+
display: block;
|
86
|
+
padding-right:20px;
|
87
|
+
padding-bottom:20px;
|
88
|
+
background-image:url("shadow-lb.jpg");
|
89
|
+
background-position:-80px bottom;
|
90
|
+
background-repeat:no-repeat;
|
91
|
+
}
|
92
|
+
|
93
|
+
.thumb p a img {
|
94
|
+
border:none;
|
95
|
+
}
|
metadata
CHANGED
@@ -1,36 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.2
|
3
|
-
specification_version: 1
|
4
2
|
name: Piggy
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.4.2.
|
7
|
-
date: 2008-06-18 00:00:00 +02:00
|
8
|
-
summary: (P)ick (i)mages and (g)enerate (g)alleries
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: wsdngatrubyforge at hinterkattentuffel.de
|
12
|
-
homepage: http://piggy.rubyforge.org
|
13
|
-
rubyforge_project:
|
14
|
-
description:
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 0.4.2.4
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- "Sascha D\xF6rdelmann"
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-07-08 00:00:00 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rubyzip
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: exifr
|
27
|
+
type: :runtime
|
28
|
+
version_requirement:
|
29
|
+
version_requirements: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: "0"
|
34
|
+
version:
|
35
|
+
description:
|
36
|
+
email: wsdngatrubyforge at hinterkattentuffel.de
|
37
|
+
executables:
|
38
|
+
- directory_diff
|
39
|
+
- ftp_browser
|
40
|
+
- piggy
|
41
|
+
extensions: []
|
42
|
+
|
43
|
+
extra_rdoc_files: []
|
44
|
+
|
31
45
|
files:
|
32
46
|
- LICENCE.txt
|
33
|
-
- README.txt
|
34
47
|
- test.rb
|
35
48
|
- UNINSTALL.txt
|
36
49
|
- lib
|
@@ -69,15 +82,14 @@ files:
|
|
69
82
|
- lib/icons/unchecked.ico
|
70
83
|
- lib/icons/upload-selected.ico
|
71
84
|
- lib/icons/upload.ico
|
85
|
+
- lib/icons/fullscreen.ico
|
72
86
|
- lib/piggy-core
|
73
87
|
- lib/piggy-core/alive_check.rb
|
74
88
|
- lib/piggy-core/debug.rb
|
75
89
|
- lib/piggy-core/encoding.rb
|
76
90
|
- lib/piggy-core/environment.rb
|
77
|
-
- lib/piggy-core/exifr_adapter.rb
|
78
91
|
- lib/piggy-core/file_info.rb
|
79
92
|
- lib/piggy-core/htmlgen.rb
|
80
|
-
- lib/piggy-core/nconvert_thumbsgen.rb
|
81
93
|
- lib/piggy-core/options_persistence.rb
|
82
94
|
- lib/piggy-core/progress.rb
|
83
95
|
- lib/piggy-core/rmagick_thumbnail_page_generator.rb
|
@@ -86,29 +98,31 @@ files:
|
|
86
98
|
- lib/piggy-core/version.rb
|
87
99
|
- lib/piggy-core/ftp_adapter.rb
|
88
100
|
- lib/piggy-core/winshell.rb
|
89
|
-
- lib/piggy-core/
|
101
|
+
- lib/piggy-core/nconvert_thumbsgen.rb
|
102
|
+
- lib/piggy-core/exifr_adapter.rb
|
90
103
|
- lib/piggy-core/options.rb
|
104
|
+
- lib/piggy-core/thumbnail_page_generator.rb
|
91
105
|
- lib/piggy-gui
|
92
|
-
- lib/piggy-gui/filtered_file_list.rb
|
93
106
|
- lib/piggy-gui/fox_thumbsgen.rb
|
94
107
|
- lib/piggy-gui/image_processor.rb
|
95
108
|
- lib/piggy-gui/multiimagecanvas.rb
|
96
|
-
- lib/piggy-gui/pipe_log.rb
|
97
109
|
- lib/piggy-gui/progress_with_dialog.rb
|
98
110
|
- lib/piggy-gui/require-fox.rb
|
99
111
|
- lib/piggy-gui/directory_diff_widget.rb
|
100
112
|
- lib/piggy-gui/ftp_browser_widget.rb
|
101
|
-
- lib/piggy-gui/piggy_image_browser.rb
|
102
113
|
- lib/piggy-gui/options_dialog.rb
|
103
114
|
- lib/piggy-gui/modal_dialog.rb
|
104
115
|
- lib/piggy-gui/dir_chooser.rb
|
116
|
+
- lib/piggy-gui/filtered_file_list.rb
|
117
|
+
- lib/piggy-gui/fullscreen.rb
|
118
|
+
- lib/piggy-gui/pipe_log.rb
|
119
|
+
- lib/piggy-gui/piggy_image_browser.rb
|
105
120
|
- lib/piggy-gui/html_generation_dialog.rb
|
106
121
|
- lib/piggy.rb
|
107
122
|
- lib/templates
|
108
123
|
- lib/templates/fuss.htm
|
109
124
|
- lib/templates/kopf.htm
|
110
125
|
- lib/templates/navigation.htm
|
111
|
-
- lib/templates/slideshow.htm
|
112
126
|
- lib/templates/slideshow.js
|
113
127
|
- lib/templates/styles
|
114
128
|
- lib/templates/styles/basic
|
@@ -133,6 +147,12 @@ files:
|
|
133
147
|
- lib/templates/styles/shadow_D9F5F3/lu.jpg
|
134
148
|
- lib/templates/styles/shadow_D9F5F3/ru.jpg
|
135
149
|
- lib/templates/styles/shadow_D9F5F3/lo.jpg
|
150
|
+
- lib/templates/styles/shadow_bowers
|
151
|
+
- lib/templates/styles/shadow_bowers/shadow.jpg
|
152
|
+
- lib/templates/styles/shadow_bowers/shadow-rt.jpg
|
153
|
+
- lib/templates/styles/shadow_bowers/shadow-lb.jpg
|
154
|
+
- lib/templates/styles/shadow_bowers/style.css
|
155
|
+
- lib/templates/slideshow.htm
|
136
156
|
- test
|
137
157
|
- test/file_info_test.rb
|
138
158
|
- bin
|
@@ -141,36 +161,32 @@ files:
|
|
141
161
|
- bin/piggy
|
142
162
|
- INSTALL.txt
|
143
163
|
- CHANGES.txt
|
144
|
-
|
145
|
-
|
164
|
+
- README.txt
|
165
|
+
has_rdoc: true
|
166
|
+
homepage: http://piggy.rubyforge.org
|
167
|
+
post_install_message:
|
146
168
|
rdoc_options: []
|
147
169
|
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
-
|
153
|
-
-
|
154
|
-
|
155
|
-
|
170
|
+
require_paths:
|
171
|
+
- lib
|
172
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
173
|
+
requirements:
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
version: "0"
|
177
|
+
version:
|
178
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: "0"
|
183
|
+
version:
|
156
184
|
requirements: []
|
157
185
|
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: 0.0.0
|
167
|
-
version:
|
168
|
-
- !ruby/object:Gem::Dependency
|
169
|
-
name: exifr
|
170
|
-
version_requirement:
|
171
|
-
version_requirements: !ruby/object:Gem::Version::Requirement
|
172
|
-
requirements:
|
173
|
-
- - ">"
|
174
|
-
- !ruby/object:Gem::Version
|
175
|
-
version: 0.0.0
|
176
|
-
version:
|
186
|
+
rubyforge_project:
|
187
|
+
rubygems_version: 1.2.0
|
188
|
+
signing_key:
|
189
|
+
specification_version: 2
|
190
|
+
summary: (P)ick (i)mages and (g)enerate (g)alleries
|
191
|
+
test_files:
|
192
|
+
- test.rb
|