Piggy 0.4.2.4 → 0.4.3.0

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.
Files changed (61) hide show
  1. data/CHANGES.txt +15 -0
  2. data/INSTALL.txt +9 -4
  3. data/README.txt +8 -6
  4. data/bin/directory_diff +1 -1
  5. data/bin/ftp_browser +1 -1
  6. data/bin/piggy +1 -1
  7. data/lib/directory_diff.rb +8 -6
  8. data/lib/ftp_browser.rb +8 -6
  9. data/lib/icons/connect.ico +0 -0
  10. data/lib/icons/hide_details.ico +0 -0
  11. data/lib/icons/show_details.ico +0 -0
  12. data/lib/piggy-core/alive_check.rb +4 -4
  13. data/lib/piggy-core/debug.rb +4 -4
  14. data/lib/piggy-core/environment.rb +24 -26
  15. data/lib/piggy-core/exifr_adapter.rb +11 -11
  16. data/lib/piggy-core/file_info.rb +61 -61
  17. data/lib/piggy-core/ftp_adapter.rb +24 -24
  18. data/lib/piggy-core/htmlgen.rb +41 -45
  19. data/lib/piggy-core/nconvert_thumbsgen.rb +22 -22
  20. data/lib/piggy-core/options.rb +25 -19
  21. data/lib/piggy-core/options_persistence.rb +8 -8
  22. data/lib/piggy-core/progress.rb +7 -7
  23. data/lib/piggy-core/rmagick_thumbnail_page_generator.rb +14 -14
  24. data/lib/piggy-core/thumbnail_generator.rb +26 -26
  25. data/lib/piggy-core/thumbnail_page_generator.rb +234 -230
  26. data/lib/piggy-core/upload_info.rb +22 -22
  27. data/lib/piggy-core/version.rb +7 -7
  28. data/lib/piggy-core/winshell.rb +136 -80
  29. data/lib/piggy-gui/dir_chooser.rb +14 -14
  30. data/lib/piggy-gui/directory_diff_widget.rb +177 -160
  31. data/lib/piggy-gui/filtered_file_list.rb +87 -87
  32. data/lib/piggy-gui/fox_thumbsgen.rb +4 -4
  33. data/lib/piggy-gui/ftp_browser_widget.rb +211 -155
  34. data/lib/piggy-gui/fullscreen.rb +4 -4
  35. data/lib/piggy-gui/html_generation_dialog.rb +42 -115
  36. data/lib/piggy-gui/html_options_widget.rb +97 -0
  37. data/lib/piggy-gui/image_processor.rb +58 -58
  38. data/lib/piggy-gui/modal_dialog.rb +11 -5
  39. data/lib/piggy-gui/multiimagecanvas.rb +59 -59
  40. data/lib/piggy-gui/options_dialog.rb +170 -48
  41. data/lib/piggy-gui/piggy_image_browser.rb +382 -340
  42. data/lib/piggy-gui/pipe_log.rb +17 -17
  43. data/lib/piggy-gui/progress_with_dialog.rb +8 -8
  44. data/lib/piggy-gui/require-fox.rb +23 -8
  45. data/lib/piggy.rb +7 -5
  46. data/lib/templates/styles/basic/style.css +16 -14
  47. data/lib/templates/styles/black/style.css +28 -29
  48. data/lib/templates/styles/roundedbox/style.css +28 -31
  49. data/lib/templates/styles/shadow/style.css +26 -26
  50. data/lib/templates/styles/shadow_D9F5F3/style.css +1 -1
  51. data/lib/templates/styles/shadow_black/lo.jpg +0 -0
  52. data/lib/templates/styles/shadow_black/lu.jpg +0 -0
  53. data/lib/templates/styles/shadow_black/ro.jpg +0 -0
  54. data/lib/templates/styles/shadow_black/ru.jpg +0 -0
  55. data/lib/templates/styles/shadow_black/style.css +78 -0
  56. data/lib/templates/styles/shadow_bowers/style.css +48 -51
  57. data/lib/templates/styles/sylvester/sh.png +0 -0
  58. data/lib/templates/styles/sylvester/style.css +74 -0
  59. data/lib/templates/styles/sylvester/wunderkerze.jpg +0 -0
  60. data/test/file_info_test.rb +29 -29
  61. metadata +52 -38
@@ -9,172 +9,99 @@ require 'piggy-core/winshell'
9
9
  require 'piggy-gui/require-fox'
10
10
  require 'piggy-gui/modal_dialog'
11
11
  require 'piggy-gui/dir_chooser'
12
+ require 'piggy-gui/html_options_widget'
12
13
 
13
14
  # Dialog for manipulation some of Piggy's html generation parameters.
14
15
  class HtmlGenerationDialog < ModalDialog
15
16
  attr_reader(:options)
16
17
 
17
18
  def initialize(owner, options = PiggyOptions.new)
18
- title = "Thumbnail page generator options"
19
+ title = "Generate HTML image gallery"
19
20
  @options = options
20
21
  @shell = WinShell.instance
21
22
  super(owner, title, DECOR_TITLE|DECOR_BORDER|DECOR_CLOSE)
22
- initializeVariables
23
- initializeLayout
24
- setDefaults
25
- connectEvents
23
+ init_gui
26
24
  end
27
-
28
- def initializeVariables
29
- @frame = FXVerticalFrame.new(self)
30
- @contents = FXMatrix.new(@frame, 2, MATRIX_BY_COLUMNS)
31
- @labels = Array.new
32
- @labels.push(FXLabel.new(@contents, "Output directory:"))
33
- DirChooser.new(@contents, @options.localDestinationPath) { |v|
34
- @options.localDestinationPath = v
25
+
26
+ def init_gui
27
+ frame = FXVerticalFrame.new(self)
28
+ contents = HtmlOptionsWidget.new(frame, @options, false)
29
+ labels = Array.new
30
+ labels.push(FXLabel.new(contents, "Title:"))
31
+ @titleField = FXTextField.new(contents, 32)
32
+ @titleField.connect(SEL_COMMAND) { |sender, sel, new_txt|
33
+ on_title_changed(fox_2_ruby(new_txt)) if (new_txt)
35
34
  }
36
- @labels.push(FXLabel.new(@contents, "Framepage:"))
37
- @genFrameRadioButtons = FXMatrix.new(@contents, 2, MATRIX_BY_COLUMNS)
38
- @genFrameYes = FXRadioButton.new(@genFrameRadioButtons, "&Yes")
39
- @genFrameNo = FXRadioButton.new(@genFrameRadioButtons, "&No")
40
- @labels.push(FXLabel.new(@contents, "Title:"))
41
- @titleField = FXTextField.new(@contents, 32)
42
- @labels.push(FXLabel.new(@contents, "Subdirectory:"))
43
- @subdirField = FXTextField.new(@contents, 32)
44
- FXLabel.new(@contents, ""); # TODO empty cell in matrix layout
45
- @addZipCheck = FXCheckButton.new(@contents, 'Add zipfile')
46
- FXLabel.new(@contents, ""); # TODO empty cell in matrix layout
47
- @addSlideshowCheck = FXCheckButton.new(@contents, 'Add slideshow')
48
- @labels.push(FXLabel.new(@contents, "Style:"))
49
- @styleTextField = newCombobox(@contents, 32,
50
- 10,
51
- nil, 0, COMBOBOX_INSERT_LAST)
52
- @styleTextField.setFrameStyle(FRAME_SUNKEN|FRAME_THICK)
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)
59
- addOkCancelButtonsTo(@frame)
35
+ labels.push(FXLabel.new(contents, "Subdirectory:"))
36
+ @subdirField = FXTextField.new(contents, 32)
37
+ labels.each { |label| label.setLayoutHints LAYOUT_CENTER_Y }
38
+ contents.init_gui
39
+ add_ok_cancel_buttons_to(frame)
60
40
  end
61
41
 
62
- def initializeLayout
63
- @labels.each { |label| label.setLayoutHints LAYOUT_CENTER_Y }
42
+ def on_title_changed(title)
43
+ title_letters = title.gsub(/\W/, '')
44
+ return unless title_letters
45
+ dir_suggestion = title_letters.slice(0..8).downcase
46
+ @subdirField.setText(ruby_2_fox(dir_suggestion))
64
47
  end
65
48
 
66
- def updateStylesList
67
- styleDir = File.join(PIGGY_PATH, 'templates/styles')
68
- @styleTextField.clearItems
69
- Dir[File.join(styleDir, '*')].entries.reject { |f| f =~ /^\.+$/ }.each do
70
- |folder|
71
- @styleTextField.appendItem(File.basename(folder))
72
- end
73
- @styleTextField.setText(@options.style)
49
+ def get_subdir
50
+ return fox_2_ruby(@subdirField.getText)
74
51
  end
75
52
 
76
- def setDefaults
77
- @genFrameYes.setCheck(@options.generateFramePage)
78
- @genFrameNo.setCheck(!@options.generateFramePage)
79
- @addZipCheck.setCheck(@options.addZip?)
80
- @addSlideshowCheck.setCheck(@options.addSlideshow?)
81
- @imageWidthField.setText(ruby2Fox(@options.imageWidth.to_s))
82
- @imageHeightField.setText(ruby2Fox(@options.imageHeight.to_s))
83
- updateStylesList
84
- end
85
-
86
- def connectEvents
87
- @genFrameYes.connect(SEL_COMMAND) {
88
- @genFrameNo.setCheck false
89
- @options.generateFramePage = true
90
- }
91
- @genFrameNo.connect(SEL_COMMAND) {
92
- @genFrameYes.setCheck false
93
- @options.generateFramePage = false
94
- }
95
- @addZipCheck.connect(SEL_COMMAND) { |sender, sel, ptr|
96
- @options.addZip = ptr
97
- }
98
- @addSlideshowCheck.connect(SEL_COMMAND) { |sender, sel, ptr|
99
- @options.addSlideshow = ptr
100
- }
101
- @styleTextField.connect(SEL_COMMAND) { |sender, sel, ptr|
102
- @options.style = ptr
103
- validateStyle
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
- }
119
- end
120
-
121
- def getSubdir
122
- return fox2Ruby(@subdirField.getText)
123
- end
124
-
125
- def getTitle
126
- return fox2Ruby(@titleField.getText)
53
+ def get_title
54
+ return fox_2_ruby(@titleField.getText)
127
55
  end
128
56
 
129
57
  def validate
130
- validateOutputPath && validateSubdir && validateStyle
58
+ validate_output_path && validate_subdir && validate_style
131
59
  end
132
60
 
133
- def validateOutputPath
61
+ def validate_output_path
134
62
  unless File.directory?(@options.localDestinationPath)
135
- warnOutputPath
63
+ warn_output_path
136
64
  return false
137
65
  end
138
66
  return true;
139
67
  end
140
68
 
141
- def validateSubdir
142
- subdir = getSubdir
69
+ def validate_subdir
70
+ subdir = get_subdir
143
71
  if subdir.empty?
144
- warnNoSubdirGiven
72
+ warn_no_subdir_given
145
73
  return false
146
74
  end
147
- pathToSubdir = File.join(@options.localDestinationPath, subdir)
148
- if(File.directory? pathToSubdir)
149
- warn("Overwrite protection!", "#{pathToSubdir} allready exists")
150
- return false
75
+ path_to_subdir = File.join(@options.localDestinationPath, subdir)
76
+ if(File.directory? path_to_subdir)
77
+ return yes?("Overwrite?", "#{path_to_subdir} allready exists. Overwrite?")
151
78
  end
152
79
  return true
153
80
  end
154
81
 
155
- def validateStyle
156
- styleDir = File.join(PIGGY_PATH, 'templates/styles', @options.style)
157
- unless File.directory?(styleDir)
158
- warnStyleMissing
82
+ def validate_style
83
+ style_dir = File.join(PIGGY_PATH, 'templates/styles', @options.style)
84
+ unless File.directory?(style_dir)
85
+ warn_style_missing
159
86
  false
160
87
  else
161
88
  true
162
89
  end
163
90
  end
164
91
 
165
- def warnOutputPath
92
+ def warn_output_path
166
93
  title = "Output path does not exist"
167
94
  msg = "Output path does not exist"
168
95
  warn(title, msg)
169
96
  end
170
97
 
171
- def warnNoSubdirGiven
98
+ def warn_no_subdir_given
172
99
  title = "No subdirectory"
173
100
  msg = "Specify a subdirectory first"
174
101
  warn(title, msg)
175
102
  end
176
103
 
177
- def warnStyleMissing
104
+ def warn_style_missing
178
105
  title = "Style not found"
179
106
  msg = "Style missing: #{@options.style}"
180
107
  warn(title, msg)
@@ -0,0 +1,97 @@
1
+ #!/usr/bin/ruby
2
+ ## $Id: options_dialog.rb 161 2006-12-23 15:41:01Z Sascha $
3
+
4
+ require 'piggy-core/options'
5
+ require 'piggy-gui/require-fox'
6
+ require 'piggy-gui/dir_chooser'
7
+
8
+ class HtmlOptionsWidget < Fox::FXMatrix
9
+ include Fox
10
+ include Responder
11
+
12
+ def initialize(parent, options, init=true)
13
+ super(parent, 2, MATRIX_BY_COLUMNS)
14
+ @options = options
15
+ init_gui if init
16
+ end
17
+
18
+ def cb_flags
19
+ ICON_BEFORE_TEXT|LAYOUT_SIDE_TOP
20
+ end
21
+
22
+ def add_label_to(frame, msg)
23
+ FXLabel.new(frame, msg, :opts => JUSTIFY_LEFT|LAYOUT_CENTER_Y)
24
+ end
25
+
26
+ def add_txt_to(frame, msg)
27
+ FXLabel.new(frame, msg, :opts => JUSTIFY_LEFT)
28
+ end
29
+
30
+ def init_gui
31
+ add_label_to(self, "Output directory:")
32
+ DirChooser.new(self, @options.localDestinationPath) { |v|
33
+ @options.localDestinationPath = v
34
+ }
35
+ add_label_to(self, "Framepage:")
36
+ gen_frame_radio_buttons = FXMatrix.new(self, 2, MATRIX_BY_COLUMNS)
37
+ gen_frame_yes = FXRadioButton.new(gen_frame_radio_buttons, "&Yes")
38
+ gen_frame_no = FXRadioButton.new(gen_frame_radio_buttons, "&No")
39
+ gen_frame_yes.setCheck(@options.generateFramePage)
40
+ gen_frame_no.setCheck(!@options.generateFramePage)
41
+ gen_frame_yes.connect(SEL_COMMAND) {
42
+ gen_frame_no.setCheck false
43
+ @options.generateFramePage = true
44
+ }
45
+ gen_frame_no.connect(SEL_COMMAND) {
46
+ gen_frame_yes.setCheck false
47
+ @options.generateFramePage = false
48
+ }
49
+ add_label_to(self, ""); # TODO empty cell in matrix layout
50
+ add_zip_check = FXCheckButton.new(self, 'Add zipfile')
51
+ add_zip_check.setCheck(@options.addZip?)
52
+ add_zip_check.connect(SEL_COMMAND) { |sender, sel, ptr|
53
+ @options.addZip = ptr
54
+ }
55
+ add_label_to(self, ""); # TODO empty cell in matrix layout
56
+ add_slideshow_check = FXCheckButton.new(self, 'Add slideshow')
57
+ add_slideshow_check.setCheck(@options.addSlideshow?)
58
+ add_slideshow_check.connect(SEL_COMMAND) { |sender, sel, ptr|
59
+ @options.addSlideshow = ptr
60
+ }
61
+ add_label_to(self, "Style:")
62
+ style_text_field = new_combobox(self, 32,
63
+ 10,
64
+ nil, 0, COMBOBOX_INSERT_LAST)
65
+ style_text_field.setFrameStyle(FRAME_SUNKEN|FRAME_THICK)
66
+ style_text_field.setLayoutHints(LAYOUT_LEFT|LAYOUT_FILL_X|LAYOUT_FILL_COLUMN)
67
+ style_text_field.clearItems
68
+ get_style_list.each { |style|
69
+ style_text_field.appendItem(style)
70
+ }
71
+ style_text_field.setText(@options.style)
72
+ style_text_field.connect(SEL_COMMAND) { |sender, sel, ptr|
73
+ @options.style = ptr
74
+ }
75
+ add_label_to(self, "Image size:")
76
+ size_frame = FXHorizontalFrame.new(self, FRAME_NONE, 0, 0, 0 , 0, 0, 0, 0, 0)
77
+ image_width_field = FXTextField.new(size_frame, 4)
78
+ add_label_to(size_frame, " x ")
79
+ image_height_field = FXTextField.new(size_frame, 4)
80
+ image_width_field.setText(ruby_2_fox(@options.imageWidth.to_s))
81
+ image_height_field.setText(ruby_2_fox(@options.imageHeight.to_s))
82
+ image_width_field.connect(SEL_COMMAND) { |sender, sel, ptr|
83
+ begin
84
+ @options.imageWidth = fox_2_ruby(image_width_field.getText).to_i
85
+ rescue StandardError => ex
86
+ image_width_field.setText(ruby_2_fox(@options.imageWidth.to_s))
87
+ end
88
+ }
89
+ image_height_field.connect(SEL_COMMAND) { |sender, sel, ptr|
90
+ begin
91
+ @options.imageHeight = fox_2_ruby(image_height_field.getText).to_i
92
+ rescue StandardError => ex
93
+ image_height_field.setText(ruby_2_fox(@options.imageHeight.to_s))
94
+ end
95
+ }
96
+ end
97
+ end
@@ -11,23 +11,23 @@ class ImageProcessor
11
11
  @app = application
12
12
  end
13
13
 
14
- def isSupportedImageFile? file
15
- return getImageClassForFile(file) != nil
14
+ def is_supported_image_file? file
15
+ return get_image_class_for_file(file) != nil
16
16
  end
17
17
 
18
- def loadIcon(file, create = true)
19
- img = getIconInstanceForFile file
20
- return basicLoad(img, file, create)
18
+ def load_icon(file, create = true)
19
+ img = get_icon_instance_for_file file
20
+ return basic_load(img, file, create)
21
21
  end
22
22
 
23
- def loadImage(file, create = true)
24
- img = getImageInstanceForFile file
25
- return basicLoad(img, file, create)
23
+ def load_image(file, create = true)
24
+ img = get_image_instance_for_file file
25
+ return basic_load(img, file, create)
26
26
  end
27
27
 
28
- def basicLoad(img, rubyfile, create)
28
+ def basic_load(img, rubyfile, create)
29
29
  return nil if img == nil
30
- file = ruby2Fox(rubyfile)
30
+ file = ruby_2_fox(rubyfile)
31
31
  begin
32
32
  FXFileStream.open(file, FXStreamLoad) do
33
33
  |stream|
@@ -40,47 +40,47 @@ class ImageProcessor
40
40
  return img
41
41
  end
42
42
 
43
- def saveImage(img, rubyfile)
44
- file = ruby2Fox(rubyfile)
43
+ def save_image(img, rubyfile)
44
+ file = ruby_2_fox(rubyfile)
45
45
  FXFileStream.open(file, FXStreamSave) do
46
46
  |stream|
47
47
  img.savePixels stream
48
48
  end
49
49
  end
50
50
 
51
- def uncreateImage(img)
51
+ def uncreate_image(img)
52
52
  img.destroy
53
53
  img.release
54
54
  end
55
55
 
56
- def destroyAll(imageCache)
57
- imageCache.each { |i| uncreateImage(i) }
56
+ def destroy_all(imageCache)
57
+ imageCache.each { |i| uncreate_image(i) }
58
58
  imageCache.clear
59
59
  end
60
60
 
61
- def garbageImage(img)
62
- uncreateImage(img)
61
+ def garbage_image(img)
62
+ uncreate_image(img)
63
63
  GC.start
64
64
  end
65
65
 
66
- def fitImage(img, maxW, maxH, quality = 1)
66
+ def fit_image(img, maxW, maxH, quality = 1)
67
67
  w = img.getWidth
68
68
  h = img.getHeight
69
69
  ratios = Array.new(2)
70
70
  ratios[0] = maxW.to_f / w.to_f
71
71
  ratios[1] = maxH.to_f / h.to_f
72
72
  ratio = ratios.min
73
- newW = (w * ratio).to_i
74
- newH = (h * ratio).to_i
75
- if newW < 10 or newH < 10
73
+ new_w = (w * ratio).to_i
74
+ new_h = (h * ratio).to_i
75
+ if new_w < 10 or new_h < 10
76
76
  return false
77
77
  end
78
- img.scale(newW, newH, quality)
78
+ img.scale(new_w, new_h, quality)
79
79
  return true
80
80
  end
81
81
 
82
- def rotateImage(img, degree)
83
- foxDegree = case degree
82
+ def rotate_image(img, degree)
83
+ fox_degree = case degree
84
84
  when 0 then 0
85
85
  when 90 then 270
86
86
  when 180 then 180
@@ -88,53 +88,53 @@ class ImageProcessor
88
88
  else
89
89
  return error('Illegal degree')
90
90
  end
91
- img.rotate(foxDegree)
91
+ img.rotate(fox_degree)
92
92
  end
93
93
 
94
94
  private
95
95
 
96
- def hasExtension(filename, ext)
96
+ def has_extension(filename, ext)
97
97
  File.basename(filename.upcase, ext.upcase) !=
98
- File.basename(filename.upcase)
99
- end
100
-
101
- def getImageClassForFile(file)
102
- return FXGIFImage if hasExtension(file, ".gif")
103
- return FXBMPImage if hasExtension(file, ".bmp")
104
- return FXXPMImage if hasExtension(file, ".xpm")
105
- return FXPNGImage if hasExtension(file, ".png")
106
- return FXJPGImage if hasExtension(file, ".jpg")
107
- return FXPCXImage if hasExtension(file, ".pcx")
108
- return FXTIFImage if hasExtension(file, ".tif")
109
- return FXTGAImage if hasExtension(file, ".tga")
110
- return FXICOImage if hasExtension(file, ".ico")
98
+ File.basename(filename.upcase)
99
+ end
100
+
101
+ def get_image_class_for_file(file)
102
+ return FXGIFImage if has_extension(file, ".gif")
103
+ return FXBMPImage if has_extension(file, ".bmp")
104
+ return FXXPMImage if has_extension(file, ".xpm")
105
+ return FXPNGImage if has_extension(file, ".png")
106
+ return FXJPGImage if has_extension(file, ".jpg")
107
+ return FXPCXImage if has_extension(file, ".pcx")
108
+ return FXTIFImage if has_extension(file, ".tif")
109
+ return FXTGAImage if has_extension(file, ".tga")
110
+ return FXICOImage if has_extension(file, ".ico")
111
111
  return nil
112
112
  end
113
113
 
114
- def getIconClassForFile(file)
115
- return FXGIFIcon if hasExtension(file, ".gif")
116
- return FXBMPIcon if hasExtension(file, ".bmp")
117
- return FXXPMIcon if hasExtension(file, ".xpm")
118
- return FXPNGIcon if hasExtension(file, ".png")
119
- return FXJPGIcon if hasExtension(file, ".jpg")
120
- return FXPCXIcon if hasExtension(file, ".pcx")
121
- return FXTIFIcon if hasExtension(file, ".tif")
122
- return FXTGAIcon if hasExtension(file, ".tga")
123
- return FXICOIcon if hasExtension(file, ".ico")
114
+ def get_icon_class_for_file(file)
115
+ return FXGIFIcon if has_extension(file, ".gif")
116
+ return FXBMPIcon if has_extension(file, ".bmp")
117
+ return FXXPMIcon if has_extension(file, ".xpm")
118
+ return FXPNGIcon if has_extension(file, ".png")
119
+ return FXJPGIcon if has_extension(file, ".jpg")
120
+ return FXPCXIcon if has_extension(file, ".pcx")
121
+ return FXTIFIcon if has_extension(file, ".tif")
122
+ return FXTGAIcon if has_extension(file, ".tga")
123
+ return FXICOIcon if has_extension(file, ".ico")
124
124
  return nil
125
125
  end
126
126
 
127
- def getImageInstanceForFile(file)
128
- imageClass = getImageClassForFile file
129
- return nil if !imageClass
130
- return imageClass.new(@app, nil, IMAGE_KEEP|
131
- IMAGE_OWNED|IMAGE_SHMI|IMAGE_SHMP
127
+ def get_image_instance_for_file(file)
128
+ image_class = get_image_class_for_file file
129
+ return nil if !image_class
130
+ return image_class.new(@app, nil, IMAGE_KEEP|
131
+ IMAGE_OWNED|IMAGE_SHMI|IMAGE_SHMP
132
132
  )
133
133
  end
134
134
 
135
- def getIconInstanceForFile(file)
136
- iconClass = getIconClassForFile file
137
- return nil if !iconClass
138
- return iconClass.new(@app, nil)
135
+ def get_icon_instance_for_file(file)
136
+ icon_class = get_icon_class_for_file file
137
+ return nil if !icon_class
138
+ return icon_class.new(@app, nil)
139
139
  end
140
140
  end
@@ -11,16 +11,16 @@ class ModalDialog < Fox::FXDialogBox
11
11
 
12
12
  def initialize(*args)
13
13
  super(*args)
14
- FXMAPFUNC(SEL_COMMAND, FXDialogBox::ID_ACCEPT, :onCmdAccept)
14
+ FXMAPFUNC(SEL_COMMAND, FXDialogBox::ID_ACCEPT, :on_cmd_accept)
15
15
  end
16
16
 
17
17
  # utility method for use in subclasses
18
- def addOkCancelButtonsTo(frame)
18
+ def add_ok_cancel_buttons_to(frame)
19
19
  FXHorizontalSeparator.new(frame, SEPARATOR_GROOVE)
20
20
  buttons = FXHorizontalFrame.new(frame)
21
21
  cancel = FXButton.new(buttons, "&Cancel", nil, self, ID_CANCEL)
22
22
  accept = FXButton.new(buttons, "&Accept", nil, self, ID_ACCEPT,
23
- BUTTON_NORMAL|BUTTON_INITIAL|BUTTON_DEFAULT)
23
+ BUTTON_NORMAL|BUTTON_INITIAL|BUTTON_DEFAULT)
24
24
  buttons.setLayoutHints(LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X)
25
25
  buttons.setPackingHints(PACK_UNIFORM_WIDTH)
26
26
  accept.setLayoutHints(LAYOUT_RIGHT)
@@ -29,13 +29,13 @@ class ModalDialog < Fox::FXDialogBox
29
29
  end
30
30
 
31
31
  # This is the overwrite that integrates the validation hook
32
- def onCmdAccept(p1, p2, p3)
32
+ def on_cmd_accept(p1, p2, p3)
33
33
  begin
34
34
  view2model
35
35
  rescue Error => ex
36
36
  warn(ex.to_s, "Error")
37
37
  end
38
- super(p1, p2, p3) if validate
38
+ onCmdAccept(p1, p2, p3) if validate
39
39
  end
40
40
 
41
41
  # this method will be sent before validation
@@ -56,6 +56,12 @@ class ModalDialog < Fox::FXDialogBox
56
56
  FXMessageBox::warning(self, style, title, msg)
57
57
  return false
58
58
  end
59
+
60
+ def yes?(title, question)
61
+ style = MBOX_YES_NO|DECOR_TITLE|DECOR_CLOSE|Placement
62
+ answer = FXMessageBox.question(self, style, title, question)
63
+ return answer == MBOX_CLICKED_YES
64
+ end
59
65
 
60
66
  # Return a boolean
61
67
  def execute(placement=Placement)