Piggy 0.4.2.3 → 0.4.2.4
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/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
|