Piggy 0.4.2.4 → 0.4.3.0

Sign up to get free protection for your applications and to get access to all the features.
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)