dialogbind 0.9.3 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/dialogbind.rb +263 -110
  3. metadata +7 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0cc13b581cce68d335c1cf660187dea9c6a9d3d3429e1d3737bab775787f0834
4
- data.tar.gz: 33dfce0084709de26c7b3213bf5a97a8db19c07dc285cf3848d928d604236ef7
3
+ metadata.gz: 15db92bd3bcd2c1f15e7dd00f4f643f0e3cf967e0c4ca6822fd51bba303a9c37
4
+ data.tar.gz: 0d7f0743dbd44377eed925c1927eb61d85b99ac8d9677341cb407917759cc979
5
5
  SHA512:
6
- metadata.gz: 53bf0c4557f64fb2f534c17f753ba8e44bbd7855082e099861bae3711013352eabfb2796838cb36bd608f372aadb81d44cc5456f602044dcad51120593de0e33
7
- data.tar.gz: b8d45642cfa13ea453d1ed27b86998df97a5ed8e15bc57fcd0ba97ef3cac03255ac8702c2d928730429c0454251629cd598f0ab91a27bf836f747be512b0d242
6
+ metadata.gz: 3a05bba5157559fe28498d1ea90757f84e21dcf37405331be852d31cb7b9c5f950eaa19ada11ad36a4ad2588af89b1b26e76b6802a13a97b8c8b6069bd0b4ab6
7
+ data.tar.gz: 501746e21d415a8e7a9b97677e337e13222631bc9792fc0bbf281394cb4127a4f726f6445671b9410511f03606b7986d9fa903b6f469f689bc68bda20efe9c15
data/lib/dialogbind.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
2
  # DialogBind - a simple library wrapping around message box displaying
3
- # tools on Linux (xmessage and zenity) and macOS
3
+ # tools on Linux (zenity and kdialog), macOS and Windows
4
4
  #
5
5
  # Copyright (C) Tim K 2018-2019 <timprogrammer@rambler.ru>.
6
6
  # Licensed under MIT License.
@@ -8,17 +8,18 @@
8
8
  require 'fiddle/import'
9
9
 
10
10
  $dialogbind_macos_script_cmd = ''
11
- $dialogbind_version = '0.9.3'
11
+ $dialogbind_version = '0.9.4'
12
12
 
13
- # Function used internally in DialogBind to run Zenity from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
13
+ # @!visibility private
14
14
  def zenity(arg)
15
15
  args_total = ''
16
16
  arg.keys.each do |key|
17
+ key_o = key
17
18
  if key[-1] == '%' then
18
- key = key.sub('%', '')
19
+ key_o = key.gsub('%', '')
19
20
  end
20
21
  if arg[key] == nil then
21
- args_total += '--' + key
22
+ args_total += '--' + key_o
22
23
  elsif arg[key].instance_of? Array then
23
24
  arg[key].each do |nested_key|
24
25
  if nested_key != nil then
@@ -26,68 +27,35 @@ def zenity(arg)
26
27
  end
27
28
  end
28
29
  else
29
- args_total += '--' + key + "='" + arg[key].to_s.gsub("'", '"') + "'"
30
+ args_total += '--' + key_o + "='" + arg[key].to_s.gsub("'", '"') + "'"
30
31
  end
31
32
  args_total += ' '
32
33
  end
33
34
  return system('zenity ' + args_total)
34
35
  end
35
36
 
36
- # Internal module binding Win32 API MessageBox to Ruby. While it can be used directly, it is not recommended to do so to maintain your app's portability.
37
- module Win32NativeBindings
38
- # based on https://gist.github.com/Youka/3ebbdfd03454afa7d0c4
39
- if $dialogbind_dialog_backend == 'win32' then
40
- extend Fiddle::Importer
41
-
42
- dlload 'user32'
43
- dlload 'winmm'
44
- typealias 'HANDLE', 'void*'
45
- typealias 'HWND', 'HANDLE'
46
- typealias 'LPCSTR', 'const char*'
47
- typealias 'UINT', 'unsigned int'
48
- typealias 'BOOL', 'int'
49
- typealias 'HMODULE', 'void*'
50
- typealias 'DWORD', 'unsigned long'
51
-
52
- extern 'int MessageBox(HWND, LPCSTR, LPCSTR, UINT)'
53
- extern 'BOOL PlaySound(LPCTSTR, HMODULE, DWORD)'
54
- else
55
- def MessageBox(arg1, arg2, arg3, arg4)
56
- return
57
- end
58
-
59
- def PlaySound(arg1, arg2, arg3)
60
- return 1
61
- end
62
- end
63
- end
64
-
65
- # Function used internally in DialogBind to run Win32 MessageBoxA from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
66
- def win32_msgbox(text, title='DialogBind', buttons=0)
67
- return Win32NativeBindings::MessageBox(nil, text, title, buttons)
68
- end
69
-
70
- # Function used internally in DialogBind to run XMessage from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
71
- def xmessage(arg, buttons={ 'OK' => 0 }, file=false)
72
- build_cmd = 'xmessage -center -buttons "'
73
- first = true
74
- buttons.keys.each do |button|
75
- if first then
76
- first = false
37
+ # @!visibility private
38
+ def kdialog(arg, redirect_output=false)
39
+ args_total = ''
40
+ arg.keys.each do |key|
41
+ if arg[key].instance_of? Array then
42
+ args_total += '--' + key + ' '
43
+ arg[key].each do |instance_item|
44
+ args_total += "'" + instance_item.to_s.gsub("'", '"') + "' "
45
+ end
46
+ elsif arg[key] != nil then
47
+ args_total += '--' + key + " '" + arg[key].to_s.gsub("'", '"') + "' "
77
48
  else
78
- build_cmd += ','
49
+ args_total += key
79
50
  end
80
- build_cmd += button.gsub('"', '') + ':' + buttons[button].to_s
81
51
  end
82
- build_cmd += '" '
83
- if file then
84
- build_cmd += '-file '
52
+ if redirect_output then
53
+ args_total += ' > /tmp/kdialog.sock 2>/dev/null'
85
54
  end
86
- build_cmd += '"' + arg.gsub('"', "'").gsub('!', '') + '"'
87
- return system(build_cmd)
55
+ return system('kdialog ' + args_total)
88
56
  end
89
57
 
90
- # Function used internally in DialogBind to run AppleScript ``display dialog`` from Ruby code. Please do not use this function directly as its API and behaviour might change in any release.
58
+ # @!visibility private
91
59
  def macdialog(text, buttons=['OK'], type='dialog', error=false, dryrun=false)
92
60
  text_fixed = text.gsub("!", "").gsub("'", '').gsub('"', '').gsub('$', '')
93
61
  cmd = "osascript -e 'tell app \"System Events\" to display " + type + ' "' + text_fixed + '"'
@@ -107,13 +75,62 @@ def macdialog(text, buttons=['OK'], type='dialog', error=false, dryrun=false)
107
75
  return false
108
76
  end
109
77
 
110
- $dialogbind_available_backends = [ 'xmessage', 'zenity', 'macos', 'win32' ]
111
- $dialogbind_dialog_backend = 'xmessage'
78
+ # @!visibility private
79
+ def macopen(text, ftype=[], folder=false)
80
+ text_fixed = text.gsub("!", "").gsub("'", '').gsub('"', '').gsub('$', '')
81
+ type = 'file'
82
+ if folder then
83
+ type = 'folder'
84
+ end
85
+ cmd = "osascript -e 'tell app \"System Events\" to choose " + type + ' with prompt "' + text_fixed + "\""
86
+ if ftype.length > 0 then
87
+ cmd += ' of type { '
88
+ ftype.each do |extension|
89
+ extension_real = extension.downcase
90
+ if extension_real.include? '.' then
91
+ extension_real = extension_real.split('.')[-1]
92
+ end
93
+ cmd += '"' + extension_real + '", '
94
+ end
95
+ cmd += '"*" }'
96
+ end
97
+ cmd += "'"
98
+ cmd_output = `#{cmd} | cut -d ' ' -f2- | sed 's+:+/+g'`
99
+ cmd_output.gsub!("\n", "")
100
+ cmd_output = '/Volumes/' + cmd_output.clone
101
+ if cmd_output == '/Volumes/' then
102
+ return ''
103
+ end
104
+ return cmd_output
105
+ end
106
+
107
+ # @!visibility private
108
+ def macselect(items, text)
109
+ cmd = 'osascript -e \'tell app "System Events" to choose from list ' + items.to_s.gsub('[', '{').gsub(']', '}').gsub("'", '')
110
+ cmd += ' with prompt "' + text + '"\''
111
+ cmd_output = `#{cmd}`.gsub("\n", "")
112
+ if cmd_output == 'false' then
113
+ return nil
114
+ end
115
+ return cmd_output
116
+ end
117
+
118
+ # @!visibility private
119
+ def macentry(text)
120
+ cmd = "osascript -e 'display dialog \"" + text.gsub('"', '').gsub("'", '').gsub('!', '') + "\" default answer \"\" with icon note' | cut -d ':' -f3-"
121
+ return `#{cmd}`.gsub("\n", "")
122
+ end
123
+
124
+ $dialogbind_available_backends = [ 'cli', 'zenity', 'kdialog', 'macos', 'win32' ]
125
+ $dialogbind_dialog_backend = 'cli'
112
126
 
113
- if system('command -v zenity > /dev/null 2>&1') then
127
+ if system('command -v kdialog > /dev/null 2>&1') && ENV.keys.include?('KDE_SESSION_VERSION') then
128
+ $dialogbind_dialog_backend = 'kdialog'
129
+ elsif system('command -v zenity > /dev/null 2>&1') then
114
130
  $dialogbind_dialog_backend = 'zenity'
115
131
  elsif ENV.keys.include?('OS') && ENV['OS'] == 'Windows_NT' then
116
132
  $dialogbind_dialog_backend = 'win32'
133
+ require 'win32ole'
117
134
  elsif `uname`.gsub("\n", "") == 'Darwin' then
118
135
  $dialogbind_dialog_backend = 'macos'
119
136
  end
@@ -125,18 +142,107 @@ if $dialogbind_available_backends.include?($dialogbind_dialog_backend) == false
125
142
  raise 'Dialog backend "' + $dialogbind_dialog_backend + '" is not available. Available frontends: ' + $dialogbind_available_backends.join(', ')
126
143
  end
127
144
 
145
+ # @!visibility private
146
+ module Win32NativeBindings
147
+ # based on https://gist.github.com/Youka/3ebbdfd03454afa7d0c4
148
+ if $dialogbind_dialog_backend == 'win32' then
149
+ extend Fiddle::Importer
150
+
151
+ dlload 'user32'
152
+ typealias 'HANDLE', 'void*'
153
+ typealias 'HWND', 'HANDLE'
154
+ typealias 'LPCSTR', 'const char*'
155
+ typealias 'UINT', 'unsigned int'
156
+
157
+ extern 'int MessageBox(HWND, LPCSTR, LPCSTR, UINT)'
158
+ else
159
+ def MessageBox(arg1, arg2, arg3, arg4)
160
+ return
161
+ end
162
+ end
163
+ end
164
+
165
+ if $dialogbind_dialog_backend == 'win32' then
166
+ # @!visibility private
167
+ def win32_msgbox(text, title='DialogBind', buttons=0)
168
+ return Win32NativeBindings.MessageBox(nil, text, title, buttons)
169
+ end
170
+
171
+ # @!visibility private
172
+ def win32_activexplay(path)
173
+ player = WIN32OLE.new('WMPlayer.OCX')
174
+ player.OpenPlayer(sound_path)
175
+ end
176
+
177
+ # @!visibility private
178
+ def win32_generatevbs(write_out)
179
+ tmpfile_loc = ENV['TEMP'].gsub("\\", "/") + '/dialogbind_vbs_ibox' + rand(9999).to_s + '.vbs'
180
+ if File.exists? tmpfile_loc then
181
+ File.delete(tmpfile_loc)
182
+ end
183
+ File.write(tmpfile_loc, write_out)
184
+ tmpfile_loc_w = tmpfile_loc.gsub('/', "\\")
185
+ cmd_out = `cscript //Nologo "#{tmpfile_loc_w}"`.gsub("\r\n", "")
186
+ File.delete(tmpfile_loc)
187
+ return cmd_out
188
+ end
189
+
190
+ # @!visibility private
191
+ def win32_vbinputbox(text)
192
+ write_out = 'a = inputbox("' + text.gsub('"', '') + '")'
193
+ write_out += "\r\nWScript.Echo a"
194
+ return win32_generatevbs(write_out)
195
+ end
196
+
197
+ # @!visibility private
198
+ def win32_activexopen(filters, title)
199
+ filters_str = ''
200
+ filters.each do |filter_pattern|
201
+ to_append = 'Files matching pattern ' + filter_pattern + '|' + filter_pattern
202
+ if filters_str == '' then
203
+ filters_str = to_append
204
+ else
205
+ filters_str += '|' + to_append
206
+ end
207
+ end
208
+ generated_vbs = "fso=CreateObject(\"UserAccounts.CommonDialog\")\r\nfso.Filter=\"" + filters_str + "\"\r\n"
209
+ generated_vbs += "fso.FilterIndex=" + filters.length.to_s + "\r\nif fso.showOpen then\r\nWScript.Echo fso.fileName\r\nend if"
210
+ return win32_generatevbs(generated_vbs)
211
+ end
212
+ else
213
+ # @!visibility private
214
+ def win32_activexopen(filters, title)
215
+ return ''
216
+ end
217
+
218
+ # @!visibility private
219
+ def win32_msgbox(text, title='DialogBind', buttons=0)
220
+ return -1
221
+ end
222
+
223
+ # @!visibility private
224
+ def win32_activexplay(path)
225
+ return
226
+ end
227
+
228
+ # @!visibility private
229
+ def win32_vbinputbox(text)
230
+ return ''
231
+ end
232
+ end
233
+
128
234
  # Shows a simple message box (or information message box when using Zenity backend).
129
235
  #
130
236
  # @param text [String] the text that should be displayed in a message box
131
237
  # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
132
238
  # @return [Boolean] true on success, false if something went wrong
133
239
  def guiputs(text, title='DialogBind')
134
- if $dialogbind_dialog_backend == 'xmessage' then
135
- return xmessage(text, { 'OK' => 0 })
136
- elsif $dialogbind_dialog_backend == 'zenity' then
240
+ if $dialogbind_dialog_backend == 'zenity' then
137
241
  return zenity({ 'info' => nil, 'title' => title, 'text' => text })
138
242
  elsif $dialogbind_dialog_backend == 'macos' then
139
243
  return macdialog(text)
244
+ elsif $dialogbind_dialog_backend == 'kdialog' then
245
+ return kdialog({ 'title' => title, 'msgbox' => text })
140
246
  elsif $dialogbind_dialog_backend == 'win32' then
141
247
  win32_msgbox(text, title, 0)
142
248
  return true
@@ -153,9 +259,7 @@ end
153
259
  # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
154
260
  # @return [Boolean] true if the user presses yes, false if the user pressed no
155
261
  def guiyesno(text, title='DialogBind')
156
- if $dialogbind_dialog_backend == 'xmessage' then
157
- return xmessage(text, { 'Yes' => 0, 'No' => 1})
158
- elsif $dialogbind_dialog_backend == 'zenity' then
262
+ if $dialogbind_dialog_backend == 'zenity' then
159
263
  return zenity('question' => nil, 'title' => title, 'text' => text)
160
264
  elsif $dialogbind_dialog_backend == 'macos' then
161
265
  macdialog(text, [ 'Yes', 'No' ], 'dialog', false, true)
@@ -166,6 +270,8 @@ def guiyesno(text, title='DialogBind')
166
270
  if output.split(':')[1].downcase == 'yes' then
167
271
  return true
168
272
  end
273
+ elsif $dialogbind_dialog_backend == 'kdialog' then
274
+ return kdialog({ 'title' => title, 'yesno' => text })
169
275
  elsif $dialogbind_dialog_backend == 'win32' then
170
276
  retv_msgbox = win32_msgbox(text, title, 36)
171
277
  return (retv_msgbox == 6)
@@ -181,12 +287,12 @@ end
181
287
  # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
182
288
  # @return [Boolean] true on success, false if something went wrong
183
289
  def guierror(text, title='DialogBind')
184
- if $dialogbind_dialog_backend == 'xmessage' then
185
- return xmessage('ERROR. ' + text, { 'OK' => 0 })
186
- elsif $dialogbind_dialog_backend == 'zenity' then
290
+ if $dialogbind_dialog_backend == 'zenity' then
187
291
  return zenity('error' => nil, 'title' => title, 'text' => text)
188
292
  elsif $dialogbind_dialog_backend == 'macos' then
189
293
  return macdialog(text, [ 'OK' ], 'dialog', true)
294
+ elsif $dialogbind_dialog_backend == 'kdialog' then
295
+ return kdialog({ 'title' => title, 'error' => text })
190
296
  elsif $dialogbind_dialog_backend == 'win32' then
191
297
  return win32_msgbox(text, title, 16)
192
298
  else
@@ -195,26 +301,6 @@ def guierror(text, title='DialogBind')
195
301
  return false
196
302
  end
197
303
 
198
- # Shows either a buttonless message box with the specified text or a progress message box with the specified text. Does not work on Windows.
199
- # This function is not async, just like all other functions, so you should actually start it in a seperate thread.
200
- #
201
- # @param text [String] the text that should be displayed in a message box
202
- # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
203
- # @return [Boolean] true on success, false if something went wrong
204
- def guiprogress(text='Please wait...', title='DialogBind')
205
- if $dialogbind_dialog_backend == 'xmessage' then
206
- return xmessage(text, { })
207
- elsif $dialogbind_dialog_backend == 'zenity' then
208
- return zenity({ 'progress' => nil, 'title' => title, 'text' => text, 'no-cancel' => nil, 'percentage' => 2, 'pulsate' => nil })
209
- elsif $dialogbind_dialog_backend == 'macos' then
210
- return macdialog(text, [], 'notification', false)
211
- else
212
- raise 'The selected backend does not support progress message boxes.'
213
- return false
214
- end
215
- return false
216
- end
217
-
218
304
  # Shows a message box containing the license agreement that is stored in the specified file.
219
305
  #
220
306
  # @param file [String] the file that contains the licensing terms
@@ -225,9 +311,7 @@ def guilicense(file, title='DialogBind')
225
311
  guierror('File "' + file + '" does not exist.', title)
226
312
  return false
227
313
  end
228
- if $dialogbind_dialog_backend == 'xmessage' then
229
- return xmessage(file, { 'Accept' => 0, 'Decline' => 1 }, true)
230
- elsif $dialogbind_dialog_backend == 'zenity' then
314
+ if $dialogbind_dialog_backend == 'zenity' then
231
315
  return zenity({ 'text-info' => nil, 'title' => title, 'filename' => file, 'checkbox' => 'I have read and accepted the terms of the license agreement.' })
232
316
  elsif $dialogbind_dialog_backend == 'macos' then
233
317
  macdialog('Right now, the license agreement will be shown in TextEdit. Close TextEdit using Command-Q to continue,', ['OK'])
@@ -236,6 +320,12 @@ def guilicense(file, title='DialogBind')
236
320
  elsif $dialogbind_dialog_backend == 'win32' then
237
321
  retv_msgbox = win32_msgbox("Do you accept the terms of the license agreement below?\n\n" + File.read(file), title, 36)
238
322
  return (retv_msgbox == 6)
323
+ elsif $dialogbind_dialog_backend == 'kdialog' then
324
+ kdialog({ 'textbox' => file, 'title' => title })
325
+ if kdialog({ 'yesno' => 'Do you accept the terms of the license agreement?', 'title' => title }) then
326
+ return true
327
+ end
328
+ return false
239
329
  else
240
330
  raise 'The selected backend does not support license message boxes.'
241
331
  return false
@@ -243,6 +333,7 @@ def guilicense(file, title='DialogBind')
243
333
  return false
244
334
  end
245
335
 
336
+ # @!visibility private
246
337
  def entry2buttonshash(entries)
247
338
  hash = {}
248
339
  count = 0
@@ -260,33 +351,38 @@ end
260
351
  # @param title [String] an optional parameter specifying the title of the message box. Ignored on macOS.
261
352
  # @return [String] the selected string or nil on cancel
262
353
  def guiselect(entries, text='Choose one of the items below:', title='DialogBind')
263
- if entries.length > 2 then
264
- raise 'More than 2 entries for guiselect are not supported by xmessage.'
265
- end
266
- if $dialogbind_dialog_backend == 'xmessage' then
267
- if xmessage(text, entry2buttonshash(entries)) then
268
- return entries[0]
269
- else
270
- return entries[1]
271
- end
272
- elsif $dialogbind_dialog_backend == 'zenity' then
273
- array_of_items = [0, entries[0], nil, nil]
274
- if entries.length > 1 then
275
- array_of_items[2] = 1
276
- array_of_items[3] = entries[1]
354
+ if $dialogbind_dialog_backend == 'zenity' then
355
+ array_of_items = []
356
+ item_count_zenity = 0
357
+ entries.each do |item|
358
+ array_of_items.push(item_count_zenity)
359
+ array_of_items.push(item)
360
+ item_count_zenity += 1
277
361
  end
278
362
  if zenity({'list' => nil, 'radiolist' => nil, 'text' => text, 'print-column' => 'ALL', 'column' => '#', 'column%' => 'Items', '' => array_of_items, ' > /tmp/zenity.sock 2>/dev/null' => nil }) then
279
363
  return File.read('/tmp/zenity.sock').gsub("\n", "")
280
364
  else
281
365
  return nil
282
366
  end
283
- elsif $dialogbind_dialog_backend == 'macos' then
284
- macdialog(text, entries, 'dialog', false, true)
285
- output = `#{$dialogbind_macos_script_cmd}`.gsub("\n", "")
286
- if output == nil || output.include?(':') == false then
367
+ elsif $dialogbind_dialog_backend == 'kdialog' then
368
+ list_args = [ text ]
369
+ item_count = 0
370
+ entries.each do |list_item|
371
+ list_args.push(item_count)
372
+ list_args.push(list_item)
373
+ list_args.push('-')
374
+ item_count += 1
375
+ end
376
+ if kdialog({ 'title' => title, 'radiolist' => list_args,}, true) == false then
287
377
  return nil
288
378
  end
289
- return output.split(':')[1]
379
+ item_index = File.read('/tmp/kdialog.sock').gsub("\n", "").to_i
380
+ return entries[item_index].clone
381
+ elsif $dialogbind_dialog_backend == 'macos' then
382
+ if entries.include? 'false' then
383
+ raise 'The list of items to present to the user cannot contain the words "true" or "false" without additional punctuation due to limitations of AppleScript that is called from Ruby on macOS to display dialogs.'
384
+ end
385
+ return macselect(entries, text)
290
386
  else
291
387
  raise 'The selected backend does not support license message boxes.'
292
388
  return false
@@ -302,10 +398,11 @@ module DialogBindSystemSounds
302
398
  Attention = 3
303
399
  end
304
400
 
401
+ # @!visibility private
305
402
  def nativesoundplay(sound_path)
306
403
  unix_cmd_optimized_path = sound_path.gsub('"', "\\\"")
307
404
  if $dialogbind_dialog_backend == 'win32' then
308
- Win32NativeBindings::PlaySound(sound_path, nil, SND_SYNC)
405
+ win32_activexplay(sound_path)
309
406
  elsif $dialogbind_dialog_backend == 'macos' then
310
407
  system('afplay "' + unix_cmd_optimized_path + '" > /dev/null 2>&1')
311
408
  else
@@ -325,6 +422,7 @@ def nativesoundplay(sound_path)
325
422
  end
326
423
  end
327
424
 
425
+ # @!visibility private
328
426
  def linuxsound(sound_v)
329
427
  sound_theme = '/usr/share/sounds/freedesktop/stereo'
330
428
  sound_theme_success = sound_theme + '/complete.oga'
@@ -381,3 +479,58 @@ def guisound(sound_v)
381
479
  nativesoundplay(constant_sound_attention)
382
480
  end
383
481
  end
482
+
483
+ # @!visibility private
484
+ def zenityfilter(filter)
485
+ filter_out = []
486
+ filter.each do |filter_item|
487
+ filter_out.append('--file-filter=' + filter_item)
488
+ end
489
+ return filter_out
490
+ end
491
+
492
+ # Shows system-native file selection dialog. Currently does not work on Windows.
493
+ #
494
+ # @param filter [Array] an array of file patterns. Example: [ '*.rb', 'markdown-doc-toprocess*.md' ]
495
+ # @param title [String] an optional parameter specifying the title of the dialog box. Ignored on macOS.
496
+ # @return [String] either an empty string (if the user cancels the dialog) or the native path to the file.
497
+ def guifileselect(filter=[], title='DialogBind')
498
+ if $dialogbind_dialog_backend == 'macos' then
499
+ return macopen(title, filter, false)
500
+ elsif $dialogbind_dialog_backend == 'kdialog' then
501
+ if kdialog({ 'title' => title, 'getopenfilename' => [] }, true) == false then
502
+ return ''
503
+ end
504
+ return File.read('/tmp/kdialog.sock').gsub("\n", "")
505
+ elsif $dialogbind_dialog_backend == 'zenity' then
506
+ zenity({ 'title' => title, 'file-selection' => nil, '%' => zenityfilter(filter), ' > /tmp/zenity.sock 2>/dev/null' => nil })
507
+ return File.read('/tmp/zenity.sock').gsub("\n", "")
508
+ else
509
+ raise 'The selected backend does not support file selection dialog boxes.'
510
+ return ''
511
+ end
512
+ return ''
513
+ end
514
+
515
+ # Shows an input box with the specified text.
516
+ #
517
+ # @param text [String] the text that should be displayed in an input box
518
+ # @param title [String] an optional parameter specifying the title of the input box. Ignored on macOS and Windows.
519
+ # @return [String] the string that the user has typed in
520
+ def guigets(text='Type something:', title='DialogBind')
521
+ if $dialogbind_dialog_backend == 'macos' then
522
+ return macentry(text)
523
+ elsif $dialogbind_dialog_backend == 'kdialog' then
524
+ kdialog({ 'title' => title, 'inputbox' => [ text, '' ] }, true)
525
+ return File.read('/tmp/kdialog.sock').gsub("\n", "")
526
+ elsif $dialogbind_dialog_backend == 'zenity' then
527
+ zenity({ 'title' => title, 'entry' => nil, 'text' => text, ' > /tmp/zenity.sock 2>/dev/null' => nil })
528
+ return File.read('/tmp/zenity.sock').gsub("\n", "")
529
+ elsif $dialogbind_dialog_backend == 'win32' then
530
+ return win32_vbinputbox(text)
531
+ else
532
+ raise 'The selected backend does not support input boxes.'
533
+ return ''
534
+ end
535
+ return ''
536
+ end
metadata CHANGED
@@ -1,16 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dialogbind
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.3
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tim K
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-22 00:00:00.000000000 Z
11
+ date: 2019-07-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description:
13
+ description: 'DialogBind is a library providing a cross-platform API for creating
14
+ dialog and message boxes from Ruby code. Docs are available here: https://www.rubydoc.info/gems/dialogbind/'
14
15
  email:
15
16
  - timprogrammer@rambler.ru
16
17
  executables: []
@@ -30,7 +31,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
30
31
  requirements:
31
32
  - - ">="
32
33
  - !ruby/object:Gem::Version
33
- version: 2.0.0
34
+ version: 2.2.0
34
35
  required_rubygems_version: !ruby/object:Gem::Requirement
35
36
  requirements:
36
37
  - - ">="
@@ -40,7 +41,6 @@ requirements: []
40
41
  rubygems_version: 3.0.4
41
42
  signing_key:
42
43
  specification_version: 4
43
- summary: DialogBind provides a Ruby API that wraps around Linux and macOS message
44
- box-generating tools. As of version 0.9.2, Windows is also supported. See https://gitlab.com/timkoi/dialogbind/blob/master/README.md
45
- for documentation. Updates for this library are released frequently.
44
+ summary: DialogBind provides a portable Ruby API for creating simple message box-based
45
+ interfaces that work on Linux, macOS and Windows.
46
46
  test_files: []