ifmapper 0.9.9 → 1.0.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.
- data/HISTORY.txt +36 -1
- data/IFMapper.gemspec +28 -0
- data/TODO.txt +1 -0
- data/docs/{index.html → en/index.html} +1 -1
- data/docs/{start.html → en/start.html} +6 -6
- data/docs/es/index.html +120 -0
- data/docs/es/start.html +1282 -0
- data/lib/IFMapper/FXConnection.rb +2 -2
- data/lib/IFMapper/FXConnectionDialogBox.rb +8 -26
- data/lib/IFMapper/FXMap.rb +36 -33
- data/lib/IFMapper/FXMapColorBox.rb +13 -16
- data/lib/IFMapper/FXMapDialogBox.rb +7 -7
- data/lib/IFMapper/FXMapFileDialog.rb +9 -4
- data/lib/IFMapper/FXMapperSettings.rb +162 -32
- data/lib/IFMapper/FXMapperWindow.rb +197 -202
- data/lib/IFMapper/FXRoomDialogBox.rb +12 -9
- data/lib/IFMapper/FXRoomList.rb +3 -3
- data/lib/IFMapper/FXSection.rb +1 -1
- data/lib/IFMapper/Inform7Writer.rb +103 -26
- data/lib/IFMapper/InformWriter.rb +15 -3
- data/lib/IFMapper/Room.rb +0 -11
- data/lib/IFMapper/TADSWriter.rb +15 -2
- data/lib/IFMapper/TranscriptDialogBox.rb +15 -103
- data/lib/IFMapper/locales/en/Messages.rb +435 -0
- data/lib/IFMapper/locales/es/Messages.rb +440 -0
- data/lib/IFMapper/locales/es/Messages_iso-8859-1.rb +440 -0
- data/lib/IFMapper/locales/es/runme.sh +3 -0
- data/maps/CityOfSecrets.map +0 -0
- data/maps/Janitor.map +0 -0
- metadata +28 -21
@@ -7,13 +7,18 @@
|
|
7
7
|
class FXMapFileDialog < FXFileDialog
|
8
8
|
@@last_path = nil
|
9
9
|
|
10
|
-
|
11
|
-
"
|
12
|
-
|
10
|
+
KNOWN_LOAD_EXTENSIONS = [
|
11
|
+
"#{EXT_MAP_FILES} (*.map,*.gmp,*.ifm,*.inf,*.t,*.t3m)",
|
12
|
+
EXT_ALL_FILES,
|
13
|
+
]
|
14
|
+
|
15
|
+
KNOWN_SAVE_EXTENSIONS = [
|
16
|
+
"#{EXT_MAP_FILES} (*.map,*.gmp,*.ifm,*.inf,*.inform,*.t,*.t3m)",
|
17
|
+
EXT_ALL_FILES,
|
13
18
|
]
|
14
19
|
|
15
20
|
|
16
|
-
def initialize(parent, title, patterns =
|
21
|
+
def initialize(parent, title, patterns = KNOWN_LOAD_EXTENSIONS)
|
17
22
|
opts = 0
|
18
23
|
if RUBY_PLATFORM =~ /mswin/
|
19
24
|
opts |= FILEMATCH_NOESCAPE
|
@@ -1,8 +1,31 @@
|
|
1
1
|
|
2
|
+
begin
|
3
|
+
require 'iconv'
|
4
|
+
rescue LoadError
|
5
|
+
$stderr.puts 'Iconv could not be loaded. Languages other than English will have problems'
|
6
|
+
class Iconv
|
7
|
+
def initialize(to, from)
|
8
|
+
end
|
9
|
+
|
10
|
+
def iconv(a)
|
11
|
+
a
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
2
17
|
#
|
3
18
|
# This class contains the applicatio and map's settings
|
4
19
|
#
|
5
20
|
class FXMapperSettings < Hash
|
21
|
+
|
22
|
+
class UnknownParameter < StandardError; end;
|
23
|
+
|
24
|
+
#
|
25
|
+
# Return the home location
|
26
|
+
#
|
27
|
+
# Result: home location for user
|
28
|
+
#
|
6
29
|
def home
|
7
30
|
if ENV['HOME']
|
8
31
|
homedir = File.expand_path('~')
|
@@ -17,6 +40,12 @@ class FXMapperSettings < Hash
|
|
17
40
|
return homedir
|
18
41
|
end
|
19
42
|
|
43
|
+
|
44
|
+
#
|
45
|
+
# Write out the preferences to disk.
|
46
|
+
#
|
47
|
+
# Result: none
|
48
|
+
#
|
20
49
|
def write
|
21
50
|
begin
|
22
51
|
file = home + '/.ifmapper'
|
@@ -29,47 +58,148 @@ class FXMapperSettings < Hash
|
|
29
58
|
end
|
30
59
|
end
|
31
60
|
|
61
|
+
|
62
|
+
if RUBY_PLATFORM =~ /mswin/
|
63
|
+
require 'Win32API'
|
64
|
+
LOCALE_USER_DEFAULT = 0x400
|
65
|
+
LOCALE_SLANGUAGE = 0x1001
|
66
|
+
|
67
|
+
FORMAT_MESSAGE_FROM_SYSTEM = 0x00001000
|
68
|
+
FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x00002000
|
69
|
+
FormatMessage = Win32API.new("kernel32","FormatMessage","LPLLPLP","L")
|
70
|
+
GetLastError = Win32API.new("kernel32","GetLastError",[],"L")
|
71
|
+
GetLocaleInfo = Win32API.new('Kernel32.dll', 'GetLocaleInfo',
|
72
|
+
%w{l l p i}, 'i')
|
73
|
+
|
74
|
+
LANGUAGES = {
|
75
|
+
/English/ => 'en',
|
76
|
+
/Spanish/ => 'es',
|
77
|
+
# todo1
|
78
|
+
/German/ => 'de',
|
79
|
+
/Italian/ => 'it',
|
80
|
+
/French/ => 'fr',
|
81
|
+
/Japanese/ => 'ja',
|
82
|
+
/Chinese/ => 'ch',
|
83
|
+
/Korean/ => 'ko',
|
84
|
+
/Arabic/ => 'ar',
|
85
|
+
/Hebrew/ => 'he',
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
#
|
91
|
+
# Restore user preferences
|
92
|
+
#
|
93
|
+
# Result:
|
94
|
+
#
|
32
95
|
def initialize
|
96
|
+
has_yaml = true
|
33
97
|
begin
|
98
|
+
require 'yaml'
|
34
99
|
f = home + '/.ifmapper'
|
35
100
|
self.replace( YAML.load_file(f) )
|
101
|
+
rescue LoadError
|
102
|
+
has_yaml = false
|
36
103
|
rescue
|
37
104
|
end
|
38
105
|
|
106
|
+
if RUBY_PLATFORM =~ /mswin/
|
107
|
+
lcid = LOCALE_USER_DEFAULT
|
108
|
+
lctype = LOCALE_SLANGUAGE
|
109
|
+
slanguage = '\0' * 256
|
110
|
+
len = 256
|
111
|
+
ret = GetLocaleInfo.call lcid, lctype, slanguage, len
|
112
|
+
if ret == 0
|
113
|
+
error_code = GetLastError.call
|
114
|
+
msg = " " * 255
|
115
|
+
FormatMessage.call(
|
116
|
+
FORMAT_MESSAGE_FROM_SYSTEM +
|
117
|
+
FORMAT_MESSAGE_ARGUMENT_ARRAY,
|
118
|
+
'',
|
119
|
+
error_code,
|
120
|
+
0,
|
121
|
+
msg,
|
122
|
+
255,
|
123
|
+
''
|
124
|
+
)
|
125
|
+
msg.gsub!(/\000/, '')
|
126
|
+
msg.strip!
|
127
|
+
$stderr.puts msg
|
128
|
+
end
|
129
|
+
language = 'en'
|
130
|
+
LANGUAGES.each { |re, locale|
|
131
|
+
if slanguage =~ re
|
132
|
+
language = locale
|
133
|
+
break
|
134
|
+
end
|
135
|
+
}
|
136
|
+
else
|
137
|
+
locale = ENV['LC_ALL'] || ENV['LC_CTYPE'] || 'en_US'
|
138
|
+
language = locale[0,2]
|
139
|
+
end
|
140
|
+
|
141
|
+
while ARGV.size > 0
|
142
|
+
param = ARGV.shift
|
143
|
+
case param
|
144
|
+
when /^-l(anguage)?$/
|
145
|
+
language = ARGV.shift
|
146
|
+
language = language[0,2].downcase
|
147
|
+
self['Language'] = language
|
148
|
+
else
|
149
|
+
$stderr.puts "Unknown parameter '#{param}'."
|
150
|
+
exit(1)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
39
154
|
defaults = {
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
155
|
+
# Language
|
156
|
+
'Language' => language,
|
157
|
+
|
158
|
+
# Colors
|
159
|
+
'BG Color' => 'dark grey',
|
160
|
+
'Arrow Color' => 'black',
|
161
|
+
'Box BG Color' => 'white',
|
162
|
+
'Box Darkness Color' => 'grey',
|
163
|
+
'Box Border Color' => 'black',
|
164
|
+
'Box Number Color' => 'grey',
|
165
|
+
|
166
|
+
# Fonts
|
167
|
+
'Font Text' => 'Times',
|
168
|
+
'Font Objects' => 'Times',
|
169
|
+
|
170
|
+
# Creation options
|
171
|
+
'Create on Connection' => true,
|
172
|
+
'Edit on Creation' => false,
|
173
|
+
'Automatic Connection' => true,
|
174
|
+
|
175
|
+
|
176
|
+
# Display options
|
177
|
+
'Use Room Cursor' => false,
|
178
|
+
'Paths as Curves' => true,
|
179
|
+
|
180
|
+
# Location options
|
181
|
+
'Location Tasks' => true,
|
182
|
+
'Location Description' => false,
|
183
|
+
'Location Numbers' => true,
|
184
|
+
|
185
|
+
# Grid options
|
186
|
+
'Grid Boxes' => true,
|
187
|
+
'Grid Straight Connections' => true,
|
188
|
+
'Grid Diagonal Connections' => false,
|
189
|
+
|
190
|
+
}
|
72
191
|
|
73
192
|
self.replace( defaults.merge(self) )
|
193
|
+
language = self['Language']
|
194
|
+
|
195
|
+
begin
|
196
|
+
require "IFMapper/locales/#{language}/Messages.rb"
|
197
|
+
rescue LoadError => e
|
198
|
+
puts "Language '#{language}' was not found."
|
199
|
+
end
|
200
|
+
|
201
|
+
unless has_yaml
|
202
|
+
$stderr.puts ERR_NO_YAML
|
203
|
+
end
|
74
204
|
end
|
75
205
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
|
2
|
+
|
2
3
|
begin
|
3
4
|
$rubygems = false
|
4
5
|
require 'rubygems'
|
@@ -7,9 +8,9 @@ rescue LoadError
|
|
7
8
|
end
|
8
9
|
|
9
10
|
def no_fox
|
10
|
-
$stderr.puts
|
11
|
+
$stderr.puts ERR_NO_FOX
|
11
12
|
if $rubygems
|
12
|
-
$stderr.puts
|
13
|
+
$stderr.puts ERR_HAS_GEMS
|
13
14
|
end
|
14
15
|
exit(1)
|
15
16
|
end
|
@@ -33,39 +34,38 @@ def get_fox
|
|
33
34
|
no_fox if ver.to_i < 1 or rev.to_i < 2
|
34
35
|
end
|
35
36
|
|
37
|
+
|
36
38
|
get_fox
|
37
39
|
include Fox
|
38
40
|
|
39
|
-
begin
|
40
|
-
require 'yaml'
|
41
|
-
rescue LoadError => e
|
42
|
-
$stderr.puts "Please install the yaml library."
|
43
|
-
$stderr.puts "Without it, preferences cannot be loaded or saved."
|
44
|
-
end
|
45
|
-
|
46
|
-
|
47
|
-
|
48
41
|
require 'IFMapper/FXMap'
|
49
42
|
require 'IFMapper/FXMapperSettings'
|
50
43
|
require 'IFMapper/FXWarningBox'
|
51
|
-
require 'IFMapper/FXAboutDialogBox'
|
52
|
-
require 'IFMapper/FXSearchDialogBox'
|
53
|
-
require 'IFMapper/FXMapFileDialog'
|
54
|
-
require 'IFMapper/FXMapColorBox'
|
55
|
-
require 'IFMapper/FXRoomList'
|
56
|
-
|
57
44
|
|
58
45
|
|
59
46
|
class FXMapperWindow < FXMainWindow
|
60
47
|
|
61
48
|
PROGRAM_NAME = "Interactive Fiction Mapper"
|
62
|
-
VERSION = '0.
|
63
|
-
AUTHOR
|
64
|
-
TITLE = "#{PROGRAM_NAME} v#{VERSION} - Written by #{AUTHOR}"
|
49
|
+
VERSION = '1.0.0'
|
50
|
+
AUTHOR = "Gonzalo Garramuño"
|
65
51
|
|
66
52
|
@@copy_buffer = nil
|
67
53
|
@@default_options = FXMapperSettings.new
|
68
54
|
|
55
|
+
LANGUAGES = {
|
56
|
+
'English' => 'en',
|
57
|
+
'Español' => 'es',
|
58
|
+
# todo1
|
59
|
+
'Deutsch' => 'de',
|
60
|
+
'Italiano' => 'it',
|
61
|
+
'Fran�ais' => 'fr',
|
62
|
+
# todo2
|
63
|
+
'Japanese' => 'ja',
|
64
|
+
'Chinese' => 'ch',
|
65
|
+
'Korean' => 'ko',
|
66
|
+
'Arabic' => 'ar',
|
67
|
+
}
|
68
|
+
|
69
69
|
def open_map(file)
|
70
70
|
tmp = nil
|
71
71
|
begin
|
@@ -151,7 +151,8 @@ class FXMapperWindow < FXMainWindow
|
|
151
151
|
# Callback to Open File
|
152
152
|
#
|
153
153
|
def open_cb(sender, sel, ptr)
|
154
|
-
|
154
|
+
require 'IFMapper/FXMapFileDialog'
|
155
|
+
file = FXMapFileDialog.new(self, MSG_LOAD_MAP).filename
|
155
156
|
return if file == ''
|
156
157
|
|
157
158
|
# First, make sure we don't have it loaded already...
|
@@ -182,7 +183,7 @@ class FXMapperWindow < FXMainWindow
|
|
182
183
|
else
|
183
184
|
map = @maps[0]
|
184
185
|
end
|
185
|
-
status "
|
186
|
+
status "#{MSG_LOADING} '#{file}'..."
|
186
187
|
|
187
188
|
tmp = nil
|
188
189
|
if file =~ /\.ifm$/i
|
@@ -202,7 +203,7 @@ class FXMapperWindow < FXMainWindow
|
|
202
203
|
w = FXWarningBox.new( self,
|
203
204
|
"#{tmp}")
|
204
205
|
w.execute
|
205
|
-
status "
|
206
|
+
status "#{ERR_COULD_NOT_LOAD} '#{file}'."
|
206
207
|
if make_new_map
|
207
208
|
if map.close_cb
|
208
209
|
@maps.delete(map)
|
@@ -220,7 +221,7 @@ class FXMapperWindow < FXMainWindow
|
|
220
221
|
map.window.create
|
221
222
|
map.modified = false
|
222
223
|
update_map
|
223
|
-
status "
|
224
|
+
status "#{MSG_LOADED} '#{file}'."
|
224
225
|
end
|
225
226
|
|
226
227
|
#
|
@@ -269,11 +270,21 @@ class FXMapperWindow < FXMainWindow
|
|
269
270
|
m.window.create
|
270
271
|
end
|
271
272
|
|
273
|
+
#
|
274
|
+
# Callback used to change language
|
275
|
+
#
|
276
|
+
def language_cb(sender, msg, opts)
|
277
|
+
@@default_options['Language'] = LANGUAGES[sender.text]
|
278
|
+
|
279
|
+
require "IFMapper/locales/#{language}/Messages.rb"
|
280
|
+
recreate
|
281
|
+
end
|
282
|
+
|
272
283
|
#
|
273
284
|
# Create a new map
|
274
285
|
#
|
275
286
|
def new_map
|
276
|
-
mapname = "
|
287
|
+
mapname = "#{MSG_EMPTY_MAP} \##{@maps.size+1}"
|
277
288
|
@maps.push( FXMap.new(mapname, @mdiclient, @@default_options.dup,
|
278
289
|
@mdiicon, @mdimenu, MDI_NORMAL, 0, 0, 790, 500) )
|
279
290
|
map = @maps[-1]
|
@@ -309,7 +320,7 @@ class FXMapperWindow < FXMainWindow
|
|
309
320
|
}
|
310
321
|
icon
|
311
322
|
rescue
|
312
|
-
raise RuntimeError, "
|
323
|
+
raise RuntimeError, "#{ERR_NO_ICON} #{filename}"
|
313
324
|
end
|
314
325
|
end
|
315
326
|
|
@@ -334,7 +345,7 @@ class FXMapperWindow < FXMainWindow
|
|
334
345
|
#
|
335
346
|
# Popup a printer dialog and return the settings or false if user cancels
|
336
347
|
#
|
337
|
-
def printer_dialog(title =
|
348
|
+
def printer_dialog(title = MSG_PRINT_MAP)
|
338
349
|
map = current_map
|
339
350
|
dlg = FXPrintDialog.new(self, title + " for #{map.name}")
|
340
351
|
dlg.printer.flags |= PRINT_DEST_PAPER
|
@@ -349,13 +360,11 @@ class FXMapperWindow < FXMainWindow
|
|
349
360
|
map = current_map
|
350
361
|
return unless map
|
351
362
|
|
352
|
-
w = FXWarningBox.new( self,
|
353
|
-
"Sorry, but printing is not yet implemented\n" +
|
354
|
-
"in this version.")
|
363
|
+
w = FXWarningBox.new( self, ERR_NO_PRINTING)
|
355
364
|
w.execute
|
356
365
|
return
|
357
366
|
|
358
|
-
printer = printer_dialog
|
367
|
+
printer = printer_dialog MSG_PRINT_LOC
|
359
368
|
map.print_locations( printer ) if printer
|
360
369
|
end
|
361
370
|
|
@@ -366,9 +375,10 @@ class FXMapperWindow < FXMainWindow
|
|
366
375
|
map = current_map
|
367
376
|
return unless map
|
368
377
|
|
369
|
-
|
378
|
+
require 'IFMapper/FXMapFileDialog'
|
379
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_IFM,
|
370
380
|
[
|
371
|
-
|
381
|
+
FMT_IFM
|
372
382
|
])
|
373
383
|
map.export_ifm(d.filename) if d.filename != ''
|
374
384
|
end
|
@@ -380,9 +390,10 @@ class FXMapperWindow < FXMainWindow
|
|
380
390
|
map = current_map
|
381
391
|
return unless map
|
382
392
|
|
383
|
-
|
393
|
+
require 'IFMapper/FXMapFileDialog'
|
394
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_INFORM,
|
384
395
|
[
|
385
|
-
|
396
|
+
FMT_INFORM,
|
386
397
|
])
|
387
398
|
map.export_inform( d.filename ) if d.filename != ''
|
388
399
|
end
|
@@ -396,10 +407,10 @@ class FXMapperWindow < FXMainWindow
|
|
396
407
|
return unless map
|
397
408
|
|
398
409
|
require 'IFMapper/TADSWriter'
|
399
|
-
|
400
|
-
d = FXMapFileDialog.new(self,
|
410
|
+
require 'IFMapper/FXMapFileDialog'
|
411
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_TADS,
|
401
412
|
[
|
402
|
-
|
413
|
+
FMT_TADS
|
403
414
|
])
|
404
415
|
map.export_tads( d.filename ) if d.filename != ''
|
405
416
|
end
|
@@ -420,9 +431,10 @@ class FXMapperWindow < FXMainWindow
|
|
420
431
|
return
|
421
432
|
end
|
422
433
|
|
423
|
-
|
434
|
+
require 'IFMapper/FXMapFileDialog'
|
435
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_PDF,
|
424
436
|
[
|
425
|
-
|
437
|
+
FMT_PDF
|
426
438
|
])
|
427
439
|
if d.filename != ''
|
428
440
|
map.pdf_export(d.filename)
|
@@ -436,9 +448,7 @@ class FXMapperWindow < FXMainWindow
|
|
436
448
|
map = current_map
|
437
449
|
return unless map
|
438
450
|
|
439
|
-
w = FXWarningBox.new( self,
|
440
|
-
"Sorry, but printing is not yet implemented\n" +
|
441
|
-
"in this version.")
|
451
|
+
w = FXWarningBox.new( self, ERR_NO_PRINTING )
|
442
452
|
w.execute
|
443
453
|
return
|
444
454
|
require 'IFMapper/MapPrinting'
|
@@ -540,8 +550,7 @@ class FXMapperWindow < FXMainWindow
|
|
540
550
|
sel = @@copy_buffer
|
541
551
|
pos = map.find_empty_area( sel[0] )
|
542
552
|
if not pos
|
543
|
-
w = FXWarningBox.new( map.window,
|
544
|
-
"Sorry. No free room in map to paste the nodes.")
|
553
|
+
w = FXWarningBox.new( map.window, ERR_NO_FREE_ROOM)
|
545
554
|
w.execute
|
546
555
|
else
|
547
556
|
map.clear_selection
|
@@ -627,7 +636,7 @@ class FXMapperWindow < FXMainWindow
|
|
627
636
|
#
|
628
637
|
def hilite_matches(map, matches, re, idx = 0 )
|
629
638
|
if matches.size == 0
|
630
|
-
status "
|
639
|
+
status "#{ERR_NO_MATCHES} '#{re}'."
|
631
640
|
return
|
632
641
|
end
|
633
642
|
|
@@ -650,7 +659,7 @@ class FXMapperWindow < FXMainWindow
|
|
650
659
|
map.center_view_on_room( room )
|
651
660
|
update_section
|
652
661
|
|
653
|
-
status "'#{room.name}'
|
662
|
+
status "'#{room.name}' #{MSG_MATCHES}. #{matches.size} #{MSG_MATCHES_IN_MAP}, #{num.size} #{MSG_MATCHES_IN_SECTION}."
|
654
663
|
map.draw
|
655
664
|
end
|
656
665
|
|
@@ -678,8 +687,9 @@ class FXMapperWindow < FXMainWindow
|
|
678
687
|
map = current_map
|
679
688
|
return unless map
|
680
689
|
|
681
|
-
title =
|
690
|
+
title = MSG_FIND_LOCATION_IN_MAP
|
682
691
|
if not @search
|
692
|
+
require 'IFMapper/FXSearchDialogBox'
|
683
693
|
@search = FXSearchDialogBox.new(self)
|
684
694
|
end
|
685
695
|
@search.proc = method(:find_in_map)
|
@@ -711,8 +721,9 @@ class FXMapperWindow < FXMainWindow
|
|
711
721
|
map = current_map
|
712
722
|
return unless map
|
713
723
|
|
714
|
-
title =
|
724
|
+
title = MSG_FIND_LOCATION_IN_SECTION
|
715
725
|
if not @search
|
726
|
+
require 'IFMapper/FXSearchDialogBox'
|
716
727
|
@search = FXSearchDialogBox.new(self)
|
717
728
|
end
|
718
729
|
@search.proc = method(:find_in_section)
|
@@ -768,8 +779,9 @@ class FXMapperWindow < FXMainWindow
|
|
768
779
|
map = current_map
|
769
780
|
return unless map
|
770
781
|
|
771
|
-
title =
|
782
|
+
title = MSG_FIND_OBJECT_IN_MAP
|
772
783
|
if not @search
|
784
|
+
require 'IFMapper/FXSearchDialogBox'
|
773
785
|
@search = FXSearchDialogBox.new(self)
|
774
786
|
end
|
775
787
|
@search.proc = method(:find_object_in_map)
|
@@ -785,8 +797,9 @@ class FXMapperWindow < FXMainWindow
|
|
785
797
|
map = current_map
|
786
798
|
return unless map
|
787
799
|
|
788
|
-
title =
|
800
|
+
title = MSG_FIND_TASK_IN_MAP
|
789
801
|
if not @search
|
802
|
+
require 'IFMapper/FXSearchDialogBox'
|
790
803
|
@search = FXSearchDialogBox.new(self)
|
791
804
|
end
|
792
805
|
@search.proc = method(:find_task_in_map)
|
@@ -822,8 +835,9 @@ class FXMapperWindow < FXMainWindow
|
|
822
835
|
map = current_map
|
823
836
|
return unless map
|
824
837
|
|
825
|
-
title =
|
838
|
+
title = MSG_FIND_DESCRIPTION_IN_MAP
|
826
839
|
if not @search
|
840
|
+
require 'IFMapper/FXSearchDialogBox'
|
827
841
|
@search = FXSearchDialogBox.new(self)
|
828
842
|
end
|
829
843
|
@search.proc = method(:find_desc_in_map)
|
@@ -832,6 +846,7 @@ class FXMapperWindow < FXMainWindow
|
|
832
846
|
@search.show
|
833
847
|
end
|
834
848
|
|
849
|
+
|
835
850
|
#
|
836
851
|
# Pop-up color preferences
|
837
852
|
#
|
@@ -840,6 +855,7 @@ class FXMapperWindow < FXMainWindow
|
|
840
855
|
return if not map
|
841
856
|
|
842
857
|
if not @colors
|
858
|
+
require 'IFMapper/FXMapColorBox'
|
843
859
|
@colors = FXMapColorBox.new(self)
|
844
860
|
else
|
845
861
|
@colors.show
|
@@ -879,24 +895,12 @@ class FXMapperWindow < FXMainWindow
|
|
879
895
|
|
880
896
|
|
881
897
|
def about_cb(sender, id, event )
|
882
|
-
FXAboutDialogBox
|
883
|
-
|
884
|
-
|
885
|
-
|
886
|
-
FXRuby Version: #{Fox::fxrubyversion}
|
887
|
-
|
888
|
-
A WYSIWYG mapping tool for interactive fiction.
|
889
|
-
|
890
|
-
ggarra@advancedsl.com.ar
|
891
|
-
|_|0|_|
|
892
|
-
|_|_|0|
|
893
|
-
|0|0|0|
|
894
|
-
|
895
|
-
EOF
|
898
|
+
require 'IFMapper/FXAboutDialogBox'
|
899
|
+
FXAboutDialogBox.new(self, MSG_ABOUT_SOFTWARE,
|
900
|
+
eval("\"#{MSG_ABOUT}\"")).execute
|
896
901
|
end
|
897
902
|
|
898
903
|
|
899
|
-
|
900
904
|
def create_menus
|
901
905
|
# Construct these icons
|
902
906
|
newdoc = load_icon("filenew")
|
@@ -906,126 +910,123 @@ EOF
|
|
906
910
|
|
907
911
|
# File Menu
|
908
912
|
filemenu = FXMenuPane.new(self)
|
909
|
-
FXMenuTitle.new(@menubar,
|
910
|
-
cmd = FXMenuCommand.new(filemenu,
|
913
|
+
FXMenuTitle.new(@menubar, MENU_FILE, nil, filemenu)
|
914
|
+
cmd = FXMenuCommand.new(filemenu, MENU_NEW, newdoc)
|
911
915
|
cmd.connect(SEL_COMMAND, method(:new_map_cb))
|
912
916
|
|
913
|
-
cmd = FXMenuCommand.new(filemenu,
|
917
|
+
cmd = FXMenuCommand.new(filemenu, MENU_OPEN, opendoc)
|
914
918
|
cmd.connect(SEL_COMMAND, method(:open_cb))
|
915
|
-
cmd = FXMenuCommand.new(filemenu,
|
919
|
+
cmd = FXMenuCommand.new(filemenu, MENU_SAVE, savedoc)
|
916
920
|
cmd.connect(SEL_COMMAND, method(:save_cb))
|
917
|
-
cmd = FXMenuCommand.new(filemenu,
|
921
|
+
cmd = FXMenuCommand.new(filemenu, MENU_SAVE_AS,
|
918
922
|
saveasdoc)
|
919
923
|
cmd.connect(SEL_COMMAND, method(:save_as_cb))
|
920
924
|
|
921
925
|
# Export submenu
|
922
926
|
submenu = FXMenuPane.new(self)
|
923
927
|
|
924
|
-
cmd = FXMenuCommand.new(submenu,
|
928
|
+
cmd = FXMenuCommand.new(submenu, MENU_EXPORT_PDF, nil)
|
925
929
|
cmd.connect(SEL_COMMAND, method(:pdf_export_cb))
|
926
930
|
|
927
|
-
cmd = FXMenuCommand.new(submenu,
|
931
|
+
cmd = FXMenuCommand.new(submenu, MENU_EXPORT_IFM, nil)
|
928
932
|
cmd.connect(SEL_COMMAND, method(:ifm_export_cb))
|
929
933
|
|
930
|
-
cmd = FXMenuCommand.new(submenu,
|
934
|
+
cmd = FXMenuCommand.new(submenu, MENU_EXPORT_INFORM, nil)
|
931
935
|
cmd.connect(SEL_COMMAND, method(:inform_export_cb))
|
932
936
|
|
933
|
-
cmd = FXMenuCommand.new(submenu,
|
937
|
+
cmd = FXMenuCommand.new(submenu, MENU_EXPORT_TADS, nil)
|
934
938
|
cmd.connect(SEL_COMMAND, method(:tads_export_cb))
|
935
939
|
|
936
|
-
FXMenuCascade.new(filemenu,
|
940
|
+
FXMenuCascade.new(filemenu, MENU_EXPORT, nil, submenu)
|
937
941
|
|
938
942
|
|
939
943
|
submenu = FXMenuPane.new(self)
|
940
|
-
cmd = FXMenuCommand.new(submenu,
|
941
|
-
nil)
|
944
|
+
cmd = FXMenuCommand.new(submenu, MENU_PRINT_MAP, nil)
|
942
945
|
cmd.connect(SEL_COMMAND, method(:print_cb))
|
943
946
|
|
944
|
-
cmd = FXMenuCommand.new(submenu,
|
947
|
+
cmd = FXMenuCommand.new(submenu, MENU_PRINT_LOCATIONS, nil)
|
945
948
|
cmd.connect(SEL_COMMAND, method(:print_locations_cb))
|
946
|
-
FXMenuCascade.new(filemenu,
|
947
|
-
|
949
|
+
FXMenuCascade.new(filemenu, MENU_PRINT, nil, submenu)
|
948
950
|
|
949
|
-
cmd = FXMenuCommand.new(filemenu,
|
951
|
+
cmd = FXMenuCommand.new(filemenu, MENU_QUIT, nil)
|
950
952
|
cmd.connect( SEL_COMMAND, method(:close_cb) )
|
951
953
|
|
952
954
|
# Edit Menu
|
953
955
|
editmenu = FXMenuPane.new(self)
|
954
|
-
FXMenuTitle.new(@menubar,
|
955
|
-
cmd = FXMenuCommand.new(editmenu,
|
956
|
+
FXMenuTitle.new(@menubar, MENU_EDIT, nil, editmenu)
|
957
|
+
cmd = FXMenuCommand.new(editmenu, MENU_COPY, nil)
|
956
958
|
cmd.connect(SEL_COMMAND, method(:copy_selected_cb))
|
957
|
-
cmd = FXMenuCommand.new(editmenu,
|
959
|
+
cmd = FXMenuCommand.new(editmenu, MENU_CUT, nil)
|
958
960
|
cmd.connect(SEL_COMMAND, method(:cut_selected_cb))
|
959
|
-
cmd = FXMenuCommand.new(editmenu,
|
960
|
-
nil)
|
961
|
+
cmd = FXMenuCommand.new(editmenu, MENU_PASTE, nil)
|
961
962
|
cmd.connect(SEL_COMMAND, method(:paste_selected_cb))
|
962
963
|
|
963
964
|
# Select submenu
|
964
965
|
FXMenuSeparator.new(editmenu)
|
965
966
|
submenu = FXMenuPane.new(self)
|
966
|
-
cmd = FXMenuCommand.new(submenu,
|
967
|
+
cmd = FXMenuCommand.new( submenu, MENU_SELECT_ALL )
|
967
968
|
cmd.connect(SEL_COMMAND, method(:select_all_cb))
|
968
|
-
cmd = FXMenuCommand.new(submenu,
|
969
|
+
cmd = FXMenuCommand.new( submenu, MENU_SELECT_NONE )
|
969
970
|
cmd.connect(SEL_COMMAND, method(:select_none_cb))
|
970
|
-
FXMenuCascade.new(editmenu,
|
971
|
+
FXMenuCascade.new( editmenu, MENU_SELECT, nil, submenu )
|
971
972
|
|
972
973
|
# Searching submenu
|
973
974
|
FXMenuSeparator.new(editmenu)
|
974
975
|
submenu = FXMenuPane.new(self)
|
975
|
-
cmd = FXMenuCommand.new(submenu,
|
976
|
+
cmd = FXMenuCommand.new(submenu, MENU_SEARCH_MAP)
|
976
977
|
cmd.connect(SEL_COMMAND, method(:find_in_map_cb))
|
977
|
-
cmd = FXMenuCommand.new(submenu,
|
978
|
+
cmd = FXMenuCommand.new(submenu, MENU_SEARCH_SECTION)
|
978
979
|
cmd.connect(SEL_COMMAND, method(:find_in_section_cb))
|
979
|
-
cmd = FXMenuCommand.new(submenu,
|
980
|
+
cmd = FXMenuCommand.new(submenu, MENU_SEARCH_OBJECT)
|
980
981
|
cmd.connect(SEL_COMMAND, method(:find_object_in_map_cb))
|
981
|
-
cmd = FXMenuCommand.new(submenu,
|
982
|
+
cmd = FXMenuCommand.new(submenu, MENU_SEARCH_TASK)
|
982
983
|
cmd.connect(SEL_COMMAND, method(:find_task_in_map_cb))
|
983
|
-
cmd = FXMenuCommand.new(submenu,
|
984
|
+
cmd = FXMenuCommand.new(submenu, MENU_SEARCH_DESCRIPTION)
|
984
985
|
cmd.connect(SEL_COMMAND, method(:find_desc_in_map_cb))
|
985
|
-
FXMenuCascade.new(editmenu,
|
986
|
+
FXMenuCascade.new(editmenu, MENU_SEARCH, nil, submenu)
|
986
987
|
|
987
988
|
# Complex Connection
|
988
989
|
FXMenuSeparator.new(editmenu)
|
989
|
-
cmd = FXMenuCommand.new(editmenu,
|
990
|
-
cmd.connect( SEL_COMMAND, method(:complex_connection_cb))
|
990
|
+
cmd = FXMenuCommand.new(editmenu, MENU_COMPLEX_CONNECTION, nil)
|
991
|
+
cmd.connect( SEL_COMMAND, method(:complex_connection_cb) )
|
991
992
|
|
992
993
|
FXMenuSeparator.new(editmenu)
|
993
|
-
cmd = FXMenuCommand.new(editmenu,
|
994
|
+
cmd = FXMenuCommand.new(editmenu, MENU_DELETE, nil)
|
994
995
|
cmd.connect( SEL_COMMAND, method(:delete_selected_cb) )
|
995
996
|
|
996
997
|
# Map menu
|
997
998
|
mapmenu = FXMenuPane.new(self)
|
998
999
|
|
999
|
-
cmd = FXMenuCommand.new(mapmenu,
|
1000
|
+
cmd = FXMenuCommand.new(mapmenu, MENU_MAP_INFO)
|
1000
1001
|
cmd.connect(SEL_COMMAND) { map_properties }
|
1001
1002
|
|
1002
|
-
cmd = FXMenuCommand.new(mapmenu,
|
1003
|
+
cmd = FXMenuCommand.new(mapmenu, MENU_ROOM_LIST)
|
1003
1004
|
cmd.connect(SEL_COMMAND, method(:roomlist) )
|
1004
1005
|
|
1005
1006
|
# Automap submenu
|
1006
1007
|
#
|
1007
1008
|
submenu = FXMenuPane.new(self)
|
1008
|
-
cmd = FXMenuCommand.new(submenu,
|
1009
|
+
cmd = FXMenuCommand.new(submenu, MENU_AUTOMAP_START)
|
1009
1010
|
cmd.connect(SEL_COMMAND, method(:start_automap_cb))
|
1010
|
-
cmd = FXMenuCommand.new(submenu,
|
1011
|
+
cmd = FXMenuCommand.new(submenu, MENU_AUTOMAP_STOP)
|
1011
1012
|
cmd.connect(SEL_COMMAND, method(:stop_automap_cb))
|
1012
1013
|
FXMenuSeparator.new(submenu)
|
1013
|
-
cmd = FXMenuCommand.new(submenu,
|
1014
|
+
cmd = FXMenuCommand.new(submenu, MENU_AUTOMAP_PROPERTIES)
|
1014
1015
|
cmd.connect(SEL_COMMAND, method(:automap_properties_cb))
|
1015
|
-
FXMenuCascade.new(mapmenu,
|
1016
|
+
FXMenuCascade.new(mapmenu, MENU_AUTOMAP, nil, submenu)
|
1016
1017
|
|
1017
1018
|
# Sections submenu
|
1018
1019
|
submenu = FXMenuPane.new(self)
|
1019
|
-
cmd = FXMenuCommand.new(submenu,
|
1020
|
+
cmd = FXMenuCommand.new(submenu, MENU_NEXT_SECTION)
|
1020
1021
|
cmd.connect(SEL_COMMAND) {
|
1021
1022
|
next_section
|
1022
1023
|
}
|
1023
|
-
cmd = FXMenuCommand.new(submenu,
|
1024
|
+
cmd = FXMenuCommand.new(submenu, MENU_PREVIOUS_SECTION)
|
1024
1025
|
cmd.connect(SEL_COMMAND) {
|
1025
1026
|
previous_section
|
1026
1027
|
}
|
1027
1028
|
FXMenuSeparator.new(submenu)
|
1028
|
-
cmd = FXMenuCommand.new(submenu,
|
1029
|
+
cmd = FXMenuCommand.new(submenu, MENU_ADD_SECTION)
|
1029
1030
|
cmd.connect(SEL_COMMAND) {
|
1030
1031
|
map = current_map
|
1031
1032
|
if map
|
@@ -1034,7 +1035,7 @@ EOF
|
|
1034
1035
|
update_section
|
1035
1036
|
end
|
1036
1037
|
}
|
1037
|
-
cmd = FXMenuCommand.new(submenu,
|
1038
|
+
cmd = FXMenuCommand.new(submenu, MENU_RENAME_SECTION)
|
1038
1039
|
cmd.connect(SEL_COMMAND) {
|
1039
1040
|
map = current_map
|
1040
1041
|
if map
|
@@ -1043,7 +1044,7 @@ EOF
|
|
1043
1044
|
end
|
1044
1045
|
}
|
1045
1046
|
FXMenuSeparator.new(submenu)
|
1046
|
-
cmd = FXMenuCommand.new(submenu,
|
1047
|
+
cmd = FXMenuCommand.new(submenu, MENU_DELETE_SECTION)
|
1047
1048
|
cmd.connect(SEL_COMMAND) {
|
1048
1049
|
map = current_map
|
1049
1050
|
if map
|
@@ -1052,14 +1053,14 @@ EOF
|
|
1052
1053
|
update_section
|
1053
1054
|
end
|
1054
1055
|
}
|
1055
|
-
FXMenuCascade.new(mapmenu,
|
1056
|
+
FXMenuCascade.new(mapmenu, MENU_SECTIONS, nil, submenu)
|
1056
1057
|
|
1057
1058
|
#
|
1058
1059
|
# Zoom submenu
|
1059
1060
|
#
|
1060
1061
|
submenu = FXMenuPane.new(self)
|
1061
1062
|
[25, 50, 75, 100, 125].each { |v|
|
1062
|
-
cmd = FXMenuCommand.new(submenu,
|
1063
|
+
cmd = FXMenuCommand.new(submenu, eval("\"#{MENU_ZOOM_PERCENT}\""))
|
1063
1064
|
cmd.connect(SEL_COMMAND) {
|
1064
1065
|
map = current_map
|
1065
1066
|
if map
|
@@ -1068,11 +1069,11 @@ EOF
|
|
1068
1069
|
end
|
1069
1070
|
}
|
1070
1071
|
}
|
1071
|
-
FXMenuCascade.new(mapmenu,
|
1072
|
+
FXMenuCascade.new(mapmenu, MENU_ZOOM, nil, submenu)
|
1072
1073
|
|
1073
1074
|
submenu = FXMenuPane.new(self)
|
1074
1075
|
|
1075
|
-
cmd = FXMenuCheck.new(submenu,
|
1076
|
+
cmd = FXMenuCheck.new(submenu, MENU_EDIT_ON_CREATION)
|
1076
1077
|
cmd.check = @@default_options['Edit on Creation']
|
1077
1078
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1078
1079
|
map = current_map
|
@@ -1085,7 +1086,7 @@ EOF
|
|
1085
1086
|
s.check = map.options['Edit on Creation'] if map
|
1086
1087
|
}
|
1087
1088
|
|
1088
|
-
cmd = FXMenuCheck.new(submenu,
|
1089
|
+
cmd = FXMenuCheck.new(submenu, MENU_AUTOMATIC_CONNECTION)
|
1089
1090
|
cmd.check = @@default_options['Automatic Connection']
|
1090
1091
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1091
1092
|
map = current_map
|
@@ -1098,7 +1099,7 @@ EOF
|
|
1098
1099
|
s.check = map.options['Automatic Connection'] if map
|
1099
1100
|
}
|
1100
1101
|
|
1101
|
-
cmd = FXMenuCheck.new(submenu,
|
1102
|
+
cmd = FXMenuCheck.new(submenu, MENU_CREATE_ON_CONNECTION)
|
1102
1103
|
cmd.check = @@default_options['Create on Connection']
|
1103
1104
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1104
1105
|
map = current_map
|
@@ -1109,13 +1110,13 @@ EOF
|
|
1109
1110
|
s.check = map.options['Create on Connection'] if map
|
1110
1111
|
}
|
1111
1112
|
|
1112
|
-
FXMenuCascade.new(mapmenu,
|
1113
|
+
FXMenuCascade.new(mapmenu, MENU_OPTIONS, nil, submenu)
|
1113
1114
|
|
1114
1115
|
##########################
|
1115
1116
|
# Display submenu
|
1116
1117
|
#########################
|
1117
1118
|
submenu = FXMenuPane.new(self)
|
1118
|
-
cmd = FXMenuCheck.new(submenu,
|
1119
|
+
cmd = FXMenuCheck.new(submenu, MENU_USE_ROOM_CURSOR)
|
1119
1120
|
cmd.check = @@default_options['Use Room Cursor']
|
1120
1121
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1121
1122
|
map = current_map
|
@@ -1129,7 +1130,7 @@ EOF
|
|
1129
1130
|
s.check = map.options['Use Room Cursor'] if map
|
1130
1131
|
}
|
1131
1132
|
|
1132
|
-
cmd = FXMenuCheck.new(submenu,
|
1133
|
+
cmd = FXMenuCheck.new(submenu, MENU_PATHS_AS_CURVES)
|
1133
1134
|
cmd.check = @@default_options['Paths as Curves']
|
1134
1135
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1135
1136
|
map = current_map
|
@@ -1142,7 +1143,7 @@ EOF
|
|
1142
1143
|
map = current_map
|
1143
1144
|
s.check = map.options['Paths as Curves'] if map
|
1144
1145
|
}
|
1145
|
-
cmd = FXMenuCheck.new(submenu,
|
1146
|
+
cmd = FXMenuCheck.new(submenu, MENU_LOCATION_NUMBERS)
|
1146
1147
|
cmd.check = @@default_options['Location Numbers']
|
1147
1148
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1148
1149
|
map = current_map
|
@@ -1156,7 +1157,7 @@ EOF
|
|
1156
1157
|
s.check = map.options['Location Numbers'] if map
|
1157
1158
|
}
|
1158
1159
|
|
1159
|
-
cmd = FXMenuCheck.new(submenu,
|
1160
|
+
cmd = FXMenuCheck.new(submenu, MENU_LOCATION_TASKS)
|
1160
1161
|
cmd.check = @@default_options['Location Tasks']
|
1161
1162
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1162
1163
|
map = current_map
|
@@ -1170,7 +1171,7 @@ EOF
|
|
1170
1171
|
s.check = map.options['Location Tasks'] if map
|
1171
1172
|
}
|
1172
1173
|
|
1173
|
-
cmd = FXMenuCheck.new(submenu,
|
1174
|
+
cmd = FXMenuCheck.new(submenu, MENU_LOCATION_DESC)
|
1174
1175
|
cmd.check = @@default_options['Location Description']
|
1175
1176
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1176
1177
|
map = current_map
|
@@ -1184,7 +1185,7 @@ EOF
|
|
1184
1185
|
s.check = map.options['Location Description'] if map
|
1185
1186
|
}
|
1186
1187
|
|
1187
|
-
cmd = FXMenuCheck.new(submenu,
|
1188
|
+
cmd = FXMenuCheck.new(submenu, MENU_BOXES)
|
1188
1189
|
cmd.check = @@default_options['Grid Boxes']
|
1189
1190
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1190
1191
|
map = current_map
|
@@ -1198,7 +1199,7 @@ EOF
|
|
1198
1199
|
s.check = map.options['Grid Boxes'] if map
|
1199
1200
|
}
|
1200
1201
|
|
1201
|
-
cmd = FXMenuCheck.new(submenu,
|
1202
|
+
cmd = FXMenuCheck.new(submenu, MENU_STRAIGHT_CONN)
|
1202
1203
|
cmd.check = @@default_options['Grid Straight Connections']
|
1203
1204
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1204
1205
|
map = current_map
|
@@ -1212,7 +1213,7 @@ EOF
|
|
1212
1213
|
s.check = map.options['Grid Straight Connections'] if map
|
1213
1214
|
}
|
1214
1215
|
|
1215
|
-
cmd = FXMenuCheck.new(submenu,
|
1216
|
+
cmd = FXMenuCheck.new(submenu, MENU_DIAGONAL_CONN)
|
1216
1217
|
cmd.check = @@default_options['Grid Diagonal Connections']
|
1217
1218
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1218
1219
|
map = current_map
|
@@ -1226,31 +1227,42 @@ EOF
|
|
1226
1227
|
s.check = map.options['Grid Diagonal Connections'] if map
|
1227
1228
|
}
|
1228
1229
|
|
1229
|
-
FXMenuCascade.new(mapmenu,
|
1230
|
+
FXMenuCascade.new(mapmenu, MENU_DISPLAY, nil, submenu)
|
1230
1231
|
|
1231
1232
|
submenu = FXMenuPane.new(self)
|
1232
|
-
|
1233
|
+
|
1234
|
+
cmd = FXMenuCommand.new(submenu, MENU_COLORS)
|
1233
1235
|
cmd.connect(SEL_COMMAND, method(:colors_cb))
|
1234
1236
|
|
1237
|
+
# langmenu = FXMenuPane.new(self)
|
1238
|
+
# LANGUAGES.each { |k, v|
|
1239
|
+
# next unless File.exists?( "lib/IFMapper/locales/#{v}/Messages.rb" )
|
1240
|
+
# cmd = FXMenuCheck.new(langmenu, k)
|
1241
|
+
# cmd.connect(SEL_COMMAND, method(:language_cb))
|
1242
|
+
# }
|
1243
|
+
|
1244
|
+
# FXMenuCascade.new(mapmenu, MENU_LANGUAGE, nil, langmenu)
|
1245
|
+
|
1246
|
+
|
1235
1247
|
FXMenuSeparator.new(submenu)
|
1236
|
-
cmd = FXMenuCommand.new(submenu,
|
1248
|
+
cmd = FXMenuCommand.new(submenu, MENU_SAVE_PREFS)
|
1237
1249
|
cmd.connect(SEL_COMMAND) {
|
1238
1250
|
map = current_map
|
1239
1251
|
map.options.write if map
|
1240
1252
|
}
|
1241
|
-
FXMenuCascade.new(mapmenu,
|
1253
|
+
FXMenuCascade.new(mapmenu, MENU_PREFS, nil, submenu)
|
1242
1254
|
|
1243
|
-
FXMenuTitle.new(@menubar,
|
1255
|
+
FXMenuTitle.new(@menubar, MENU_MAP, nil, mapmenu)
|
1244
1256
|
|
1245
1257
|
# Window menu
|
1246
1258
|
windowmenu = FXMenuPane.new(self)
|
1247
|
-
FXMenuCommand.new(windowmenu,
|
1259
|
+
FXMenuCommand.new(windowmenu, MENU_TILE_HORIZONTALLY, nil,
|
1248
1260
|
@mdiclient, FXMDIClient::ID_MDI_TILEHORIZONTAL)
|
1249
|
-
FXMenuCommand.new(windowmenu,
|
1261
|
+
FXMenuCommand.new(windowmenu, MENU_TILE_VERTICALLY, nil,
|
1250
1262
|
@mdiclient, FXMDIClient::ID_MDI_TILEVERTICAL)
|
1251
|
-
FXMenuCommand.new(windowmenu,
|
1263
|
+
FXMenuCommand.new(windowmenu, MENU_CASCADE, nil,
|
1252
1264
|
@mdiclient, FXMDIClient::ID_MDI_CASCADE)
|
1253
|
-
FXMenuCommand.new(windowmenu,
|
1265
|
+
FXMenuCommand.new(windowmenu, MENU_CLOSE, nil,
|
1254
1266
|
@mdiclient, FXMDIClient::ID_MDI_CLOSE)
|
1255
1267
|
sep1 = FXMenuSeparator.new(windowmenu)
|
1256
1268
|
sep1.setTarget(@mdiclient)
|
@@ -1259,21 +1271,23 @@ EOF
|
|
1259
1271
|
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_2)
|
1260
1272
|
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_3)
|
1261
1273
|
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_4)
|
1262
|
-
FXMenuCommand.new(windowmenu,
|
1263
|
-
|
1274
|
+
FXMenuCommand.new(windowmenu, MENU_OTHERS, nil, @mdiclient,
|
1275
|
+
FXMDIClient::ID_MDI_OVER_5)
|
1276
|
+
FXMenuTitle.new(@menubar, MENU_WINDOW, nil, windowmenu)
|
1264
1277
|
|
1265
1278
|
# Help menu
|
1266
1279
|
helpmenu = FXMenuPane.new(self)
|
1267
|
-
cmd = FXMenuCommand.new(helpmenu,
|
1280
|
+
cmd = FXMenuCommand.new(helpmenu, MENU_HOTKEYS, nil)
|
1268
1281
|
cmd.connect(SEL_COMMAND, method(:hotkeys))
|
1269
|
-
cmd = FXMenuCommand.new(helpmenu,
|
1282
|
+
cmd = FXMenuCommand.new(helpmenu, MENU_INSTRUCTIONS, nil)
|
1270
1283
|
cmd.connect(SEL_COMMAND, method(:docs))
|
1271
1284
|
FXMenuSeparator.new(helpmenu)
|
1272
|
-
cmd = FXMenuCommand.new(helpmenu,
|
1285
|
+
cmd = FXMenuCommand.new(helpmenu, MENU_ABOUT, nil)
|
1273
1286
|
cmd.connect(SEL_COMMAND, method(:about_cb))
|
1274
1287
|
|
1275
|
-
cmd = FXMenuCommand.new(helpmenu,
|
1288
|
+
cmd = FXMenuCommand.new(helpmenu, MENU_RESOURCE, nil)
|
1276
1289
|
cmd.connect(SEL_COMMAND) {
|
1290
|
+
require 'IFMapper/FXMapFileDialog'
|
1277
1291
|
file = FXMapFileDialog.new(self, "Resource a Ruby File",
|
1278
1292
|
['Ruby File (*.rb)']).filename
|
1279
1293
|
if file != ''
|
@@ -1284,59 +1298,35 @@ EOF
|
|
1284
1298
|
end
|
1285
1299
|
end
|
1286
1300
|
}
|
1287
|
-
FXMenuTitle.new(@menubar,
|
1301
|
+
FXMenuTitle.new(@menubar, MENU_HELP, nil, helpmenu)
|
1288
1302
|
end
|
1289
1303
|
|
1304
|
+
def language
|
1305
|
+
return @@default_options['Language']
|
1306
|
+
end
|
1290
1307
|
|
1291
1308
|
def docs(*opts)
|
1292
|
-
|
1293
|
-
|
1294
|
-
|
1295
|
-
|
1309
|
+
browsers = [ 'firefox', 'opera', 'explorer' ]
|
1310
|
+
address = 'docs/' + language + '/start.html'
|
1311
|
+
status "#{MSG_OPENING_WEB_PAGE} #{address}..."
|
1312
|
+
ok = false
|
1313
|
+
browsers.each { |cmd|
|
1314
|
+
if RUBY_PLATFORM =~ /mswin/
|
1315
|
+
ok = system("start #{cmd} #{address}")
|
1316
|
+
else
|
1317
|
+
ok = system("#{cmd} #{address} &")
|
1318
|
+
end
|
1319
|
+
break if ok
|
1320
|
+
}
|
1321
|
+
if not ok
|
1322
|
+
status ERR_COULD_NOT_OPEN_WEB_BROWSER
|
1323
|
+
end
|
1296
1324
|
end
|
1297
1325
|
|
1298
|
-
def hotkeys(*opts)
|
1299
|
-
FXAboutDialogBox.new(self, "Hotkeys", <<'EOF').show
|
1300
|
-
|
1301
|
-
LMB - Left Mouse Button
|
1302
|
-
MMB - Middle Mouse Button
|
1303
|
-
RMB - Right Mouse Button
|
1304
|
-
|
1305
|
-
Mouse controls
|
1306
|
-
--------------
|
1307
|
-
|
1308
|
-
Use LMB to add new locations or connections among rooms.
|
1309
|
-
|
1310
|
-
Click with LMB on any room or connection to select it.
|
1311
|
-
|
1312
|
-
Double click on rooms or connections to access their properties.
|
1313
|
-
|
1314
|
-
Click several times on an existing connecion to establish a one-way
|
1315
|
-
connection.
|
1316
|
-
|
1317
|
-
Drag with MMB or ALT + LMB to scroll around the page.
|
1318
|
-
|
1319
|
-
Use mousewheel to zoom in and out.
|
1320
|
-
|
1321
|
-
Use RMB after selecting a connection to bring a menu to allow you
|
1322
|
-
to flip its direction or to attach it to some other exit in one
|
1323
|
-
of the rooms.
|
1324
1326
|
|
1325
|
-
|
1326
|
-
|
1327
|
-
|
1328
|
-
Use 'x' to start a new complex connection (ie. a connection across
|
1329
|
-
rooms that are not neighbors), then click on each exit of each room.
|
1330
|
-
|
1331
|
-
Use 'Delete' or 'Backspace' to remove any selected connection or room.
|
1332
|
-
|
1333
|
-
Use arrow keys or numeric keypad to move selected rooms around
|
1334
|
-
the page, one unit at a time.
|
1335
|
-
|
1336
|
-
Use CTRL + LMB when adding a connection to create a dead-end
|
1337
|
-
connection (one that loops onto itself)
|
1338
|
-
|
1339
|
-
EOF
|
1327
|
+
def hotkeys(*opts)
|
1328
|
+
require 'IFMapper/FXAboutDialogBox'
|
1329
|
+
FXAboutDialogBox.new(self, BOX_HOTKEYS, MSG_HOTKEYS).show
|
1340
1330
|
end
|
1341
1331
|
|
1342
1332
|
def create_toolbar(toolbar)
|
@@ -1348,15 +1338,15 @@ EOF
|
|
1348
1338
|
saveasdoc = load_icon("filesaveas")
|
1349
1339
|
|
1350
1340
|
# File manipulation
|
1351
|
-
cmd = FXButton.new(toolbar,
|
1341
|
+
cmd = FXButton.new(toolbar, ICON_NEW, newdoc, nil, 0,
|
1352
1342
|
FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1353
1343
|
cmd.connect(SEL_COMMAND, method(:new_map_cb))
|
1354
1344
|
|
1355
|
-
cmd = FXButton.new(toolbar,
|
1345
|
+
cmd = FXButton.new(toolbar, ICON_OPEN, opendoc, nil, 0,
|
1356
1346
|
FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1357
1347
|
cmd.connect(SEL_COMMAND, method(:open_cb))
|
1358
1348
|
|
1359
|
-
cmd = FXButton.new(toolbar,
|
1349
|
+
cmd = FXButton.new(toolbar, ICON_SAVE, savedoc, nil, 0,
|
1360
1350
|
FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1361
1351
|
cmd.connect(SEL_COMMAND, method(:save_cb))
|
1362
1352
|
cmd.connect(SEL_UPDATE) { |sender, sel, ptr|
|
@@ -1364,7 +1354,7 @@ EOF
|
|
1364
1354
|
message = map ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE
|
1365
1355
|
sender.handle(self, MKUINT(message, SEL_COMMAND), nil)
|
1366
1356
|
}
|
1367
|
-
cmd = FXButton.new(toolbar,
|
1357
|
+
cmd = FXButton.new(toolbar, ICON_SAVE_AS,
|
1368
1358
|
saveasdoc, nil, 0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1369
1359
|
cmd.connect(SEL_COMMAND, method(:save_as_cb))
|
1370
1360
|
cmd.connect(SEL_UPDATE) { |sender, sel, ptr|
|
@@ -1376,7 +1366,7 @@ EOF
|
|
1376
1366
|
# Print
|
1377
1367
|
FXFrame.new(toolbar,
|
1378
1368
|
LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 4, 20)
|
1379
|
-
cmd = FXButton.new(toolbar,
|
1369
|
+
cmd = FXButton.new(toolbar, ICON_PRINT,
|
1380
1370
|
load_icon("printicon"), @mdiclient, FXGLViewer::ID_PRINT_IMAGE,
|
1381
1371
|
BUTTON_AUTOGRAY|FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1382
1372
|
cmd.connect(SEL_COMMAND, method(:print_cb))
|
@@ -1389,7 +1379,7 @@ EOF
|
|
1389
1379
|
# Editing
|
1390
1380
|
FXFrame.new(toolbar,
|
1391
1381
|
LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 4, 20)
|
1392
|
-
cmd = FXButton.new(toolbar,
|
1382
|
+
cmd = FXButton.new(toolbar, ICON_CUT, load_icon("cut"), @mdiclient,
|
1393
1383
|
FXGLViewer::ID_CUT_SEL, (BUTTON_AUTOGRAY|FRAME_THICK|FRAME_RAISED|
|
1394
1384
|
LAYOUT_TOP|LAYOUT_LEFT))
|
1395
1385
|
cmd.connect(SEL_COMMAND, method(:cut_selected_cb))
|
@@ -1398,7 +1388,7 @@ EOF
|
|
1398
1388
|
message = map ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE
|
1399
1389
|
sender.handle(self, MKUINT(message, SEL_COMMAND), nil)
|
1400
1390
|
}
|
1401
|
-
cmd = FXButton.new(toolbar,
|
1391
|
+
cmd = FXButton.new(toolbar, ICON_COPY, load_icon("copy"), @mdiclient,
|
1402
1392
|
FXGLViewer::ID_COPY_SEL, (BUTTON_AUTOGRAY|FRAME_THICK|FRAME_RAISED|
|
1403
1393
|
LAYOUT_TOP|LAYOUT_LEFT))
|
1404
1394
|
cmd.connect(SEL_COMMAND, method(:copy_selected_cb))
|
@@ -1407,7 +1397,7 @@ EOF
|
|
1407
1397
|
message = map ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE
|
1408
1398
|
sender.handle(self, MKUINT(message, SEL_COMMAND), nil)
|
1409
1399
|
}
|
1410
|
-
cmd = FXButton.new(toolbar,
|
1400
|
+
cmd = FXButton.new(toolbar, ICON_PASTE, load_icon("paste"), @mdiclient,
|
1411
1401
|
FXGLViewer::ID_PASTE_SEL, (BUTTON_AUTOGRAY|FRAME_THICK|FRAME_RAISED|
|
1412
1402
|
LAYOUT_TOP|LAYOUT_LEFT))
|
1413
1403
|
cmd.connect(SEL_COMMAND, method(:paste_selected_cb))
|
@@ -1420,11 +1410,11 @@ EOF
|
|
1420
1410
|
# Zooming
|
1421
1411
|
FXFrame.new(toolbar,
|
1422
1412
|
LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 4, 20)
|
1423
|
-
cmd = FXButton.new(toolbar,
|
1413
|
+
cmd = FXButton.new(toolbar, ICON_ZOOM_IN, load_icon("zoom"), @mdiclient,
|
1424
1414
|
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1425
1415
|
cmd.connect(SEL_COMMAND) { zoom_in }
|
1426
1416
|
|
1427
|
-
cmd = FXButton.new(toolbar,
|
1417
|
+
cmd = FXButton.new(toolbar, ICON_ZOOM_OUT, load_icon("zoom"), @mdiclient,
|
1428
1418
|
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1429
1419
|
cmd.connect(SEL_COMMAND) { zoom_out }
|
1430
1420
|
|
@@ -1432,7 +1422,7 @@ EOF
|
|
1432
1422
|
# Section travel
|
1433
1423
|
frame = FXHorizontalFrame.new(toolbar,
|
1434
1424
|
LAYOUT_RIGHT|FRAME_THICK|FRAME_RAISED)
|
1435
|
-
cmd = FXButton.new(frame,
|
1425
|
+
cmd = FXButton.new(frame, ICON_PREV_SECTION, load_icon("prevpage"),
|
1436
1426
|
@mdiclient,
|
1437
1427
|
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1438
1428
|
cmd.connect(SEL_COMMAND) { previous_section }
|
@@ -1455,7 +1445,7 @@ EOF
|
|
1455
1445
|
update_section if map
|
1456
1446
|
}
|
1457
1447
|
|
1458
|
-
cmd = FXButton.new(frame,
|
1448
|
+
cmd = FXButton.new(frame, ICON_NEXT_SECTION, load_icon("nextpage"),
|
1459
1449
|
@mdiclient,
|
1460
1450
|
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1461
1451
|
cmd.connect(SEL_COMMAND) { next_section }
|
@@ -1529,9 +1519,7 @@ EOF
|
|
1529
1519
|
end
|
1530
1520
|
|
1531
1521
|
|
1532
|
-
def
|
1533
|
-
super(app, TITLE, nil, nil, DECOR_ALL, 0, 0, 800, 600)
|
1534
|
-
|
1522
|
+
def create_widgets
|
1535
1523
|
# Menubar
|
1536
1524
|
@menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
|
1537
1525
|
|
@@ -1553,6 +1541,12 @@ EOF
|
|
1553
1541
|
|
1554
1542
|
self.connect(SEL_CLOSE, method(:close_cb))
|
1555
1543
|
show
|
1544
|
+
end
|
1545
|
+
|
1546
|
+
def initialize(app)
|
1547
|
+
super(app, eval("\"#{TITLE}\""), nil, nil, DECOR_ALL, 0, 0, 800, 600)
|
1548
|
+
|
1549
|
+
create_widgets
|
1556
1550
|
|
1557
1551
|
# Trap CTRL-C signals and exit nicely
|
1558
1552
|
trap('SIGINT') {
|
@@ -1573,4 +1567,5 @@ EOF
|
|
1573
1567
|
}
|
1574
1568
|
self.close if exit
|
1575
1569
|
end
|
1570
|
+
|
1576
1571
|
end
|