ifmapper 2.0.9 → 2.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/HISTORY.txt +89 -76
- data/IFMapper.gemspec +32 -28
- data/IFMapper.rbw +1 -2
- data/bin/IFMapper +4 -3
- data/docs/en/index.html +45 -24
- data/docs/en/start.html +729 -517
- data/docs/es/start.html +808 -1191
- data/docs/images/svg_export.gif +0 -0
- data/lib/IFMapper/FXMapperSettings.rb +1 -1
- data/lib/IFMapper/FXMapperWindow.rb +211 -217
- data/lib/IFMapper/FXSVGMapExporterOptionsDialogBox.rb +335 -107
- data/lib/IFMapper/IFMWriter.rb +1 -2
- data/lib/IFMapper/Inform7Writer.rb +2 -2
- data/lib/IFMapper/InformWriter.rb +2 -2
- data/lib/IFMapper/MapPrinting.rb +104 -101
- data/lib/IFMapper/PDFMapExporter.rb +2 -521
- data/lib/IFMapper/PDFMapExporter_prawn.rb +132 -103
- data/lib/IFMapper/SVGMapAppend.rb +155 -0
- data/lib/IFMapper/SVGMapExporter.rb +1303 -1091
- data/lib/IFMapper/TADSWriter.rb +4 -3
- data/lib/IFMapper/locales/en/Messages.rb +84 -39
- data/lib/IFMapper/locales/es/Messages.rb +94 -29
- data/lib/IFMapper/locales/es/Messages_iso-8859-1.rb +69 -15
- data/maps/CityOfSecrets.map +0 -0
- metadata +32 -10
Binary file
|
@@ -8,6 +8,8 @@ begin
|
|
8
8
|
rescue LoadError
|
9
9
|
end
|
10
10
|
|
11
|
+
load "IFMapper.gemspec"
|
12
|
+
|
11
13
|
def no_fox
|
12
14
|
require "IFMapper/locales/en/Messages.rb"
|
13
15
|
$stderr.puts ERR_NO_FOX
|
@@ -20,7 +22,7 @@ end
|
|
20
22
|
def get_fox
|
21
23
|
##### ARRRGH!!!! Why does Lyle keep changing the fxruby name on each
|
22
24
|
##### release!
|
23
|
-
foxes = [ 'fox16', 'fox14', 'fox12', 'fox' ]
|
25
|
+
foxes = [ 'fox18', 'fox17', 'fox16', 'fox14', 'fox12', 'fox' ]
|
24
26
|
foxes.each { |fox|
|
25
27
|
begin
|
26
28
|
require "#{fox}"
|
@@ -30,7 +32,7 @@ def get_fox
|
|
30
32
|
no_fox if fox == foxes[-1]
|
31
33
|
end
|
32
34
|
}
|
33
|
-
|
35
|
+
|
34
36
|
# verify fxruby version
|
35
37
|
ver, rev, = Fox::fxrubyversion().split('.')
|
36
38
|
no_fox if ver.to_i < 1 or rev.to_i < 2
|
@@ -40,7 +42,6 @@ end
|
|
40
42
|
get_fox
|
41
43
|
include Fox
|
42
44
|
|
43
|
-
load "IFMapper.gemspec"
|
44
45
|
require 'IFMapper/FXMap'
|
45
46
|
require 'IFMapper/FXMapperSettings'
|
46
47
|
require 'IFMapper/FXWarningBox'
|
@@ -58,9 +59,6 @@ end
|
|
58
59
|
|
59
60
|
class FXMapperWindow < FXMainWindow
|
60
61
|
|
61
|
-
PROGRAM_NAME = "Interactive Fiction Mapper"
|
62
|
-
AUTHOR = "Gonzalo Garramuno"
|
63
|
-
|
64
62
|
@@copy_buffer = nil
|
65
63
|
@@default_options = FXMapperSettings.new
|
66
64
|
|
@@ -188,8 +186,8 @@ class FXMapperWindow < FXMainWindow
|
|
188
186
|
# First, make sure we don't have it loaded already...
|
189
187
|
@maps.each { |m|
|
190
188
|
if m.filename == file
|
191
|
-
|
192
|
-
|
189
|
+
@mdiclient.setActiveChild(m.window)
|
190
|
+
return
|
193
191
|
end
|
194
192
|
}
|
195
193
|
|
@@ -199,10 +197,10 @@ class FXMapperWindow < FXMainWindow
|
|
199
197
|
make_new_map = false
|
200
198
|
if @maps.size == 1
|
201
199
|
@maps[0].sections.each { |p|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
200
|
+
if p.rooms.size != 0
|
201
|
+
make_new_map = true
|
202
|
+
break
|
203
|
+
end
|
206
204
|
}
|
207
205
|
else
|
208
206
|
make_new_map = true
|
@@ -232,20 +230,20 @@ class FXMapperWindow < FXMainWindow
|
|
232
230
|
|
233
231
|
if not tmp.kind_of?(Map) and not tmp.kind_of?(FXMap)
|
234
232
|
$stderr.puts tmp
|
235
|
-
w = FXWarningBox.new( self,
|
236
|
-
|
233
|
+
w = FXWarningBox.new( self,
|
234
|
+
"#{tmp}")
|
237
235
|
w.execute
|
238
|
-
status "#{ERR_COULD_NOT_LOAD} '#{file}'."
|
236
|
+
status "#{ERR_COULD_NOT_LOAD} '#{file}'."
|
239
237
|
if make_new_map
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
238
|
+
if map.close_cb
|
239
|
+
@maps.delete(map)
|
240
|
+
GC.start
|
241
|
+
end
|
244
242
|
end
|
245
243
|
sleep 2
|
246
244
|
return
|
247
245
|
end
|
248
|
-
|
246
|
+
|
249
247
|
copy_map(map, tmp, file)
|
250
248
|
end
|
251
249
|
|
@@ -311,7 +309,7 @@ class FXMapperWindow < FXMainWindow
|
|
311
309
|
#
|
312
310
|
def language_cb(sender, msg, opts)
|
313
311
|
@@default_options['Language'] = LANGUAGES[sender.text]
|
314
|
-
|
312
|
+
|
315
313
|
require "IFMapper/locales/#{language}/Messages.rb"
|
316
314
|
recreate
|
317
315
|
end
|
@@ -322,19 +320,19 @@ class FXMapperWindow < FXMainWindow
|
|
322
320
|
def new_map
|
323
321
|
mapname = "#{MSG_EMPTY_MAP} \##{@maps.size+1}"
|
324
322
|
@maps.push( FXMap.new(mapname, @mdiclient, @@default_options.dup,
|
325
|
-
|
323
|
+
@mdiicon, @mdimenu, MDI_NORMAL, 0, 0, 790, 500) )
|
326
324
|
map = @maps[-1]
|
327
325
|
map.window.connect(SEL_PAINT) {
|
328
326
|
map.draw
|
329
327
|
}
|
330
328
|
map.window.connect(SEL_CLOSE) {
|
331
329
|
if map.close_cb
|
332
|
-
|
330
|
+
@maps.delete(map)
|
333
331
|
end
|
334
332
|
if @maps[-1]
|
335
|
-
|
333
|
+
@maps[-1].update_roomlist
|
336
334
|
else
|
337
|
-
|
335
|
+
FXMap::no_maps
|
338
336
|
end
|
339
337
|
}
|
340
338
|
|
@@ -384,7 +382,7 @@ class FXMapperWindow < FXMainWindow
|
|
384
382
|
def printer_dialog(title = MSG_PRINT_MAP)
|
385
383
|
map = current_map
|
386
384
|
dlg = FXPrintDialog.new(self, title + " for #{map.name}")
|
387
|
-
dlg.printer.flags |= PRINT_DEST_PAPER
|
385
|
+
dlg.printer.flags |= PRINT_DEST_PAPER
|
388
386
|
return dlg.printer if dlg.execute != 0
|
389
387
|
return false
|
390
388
|
end
|
@@ -412,10 +410,10 @@ class FXMapperWindow < FXMainWindow
|
|
412
410
|
return unless map
|
413
411
|
|
414
412
|
require 'IFMapper/FXMapFileDialog'
|
415
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_IFM,
|
416
|
-
|
417
|
-
|
418
|
-
|
413
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_IFM,
|
414
|
+
[
|
415
|
+
FMT_IFM
|
416
|
+
])
|
419
417
|
map.export_ifm(d.filename) if d.filename != ''
|
420
418
|
end
|
421
419
|
|
@@ -427,10 +425,10 @@ class FXMapperWindow < FXMainWindow
|
|
427
425
|
return unless map
|
428
426
|
|
429
427
|
require 'IFMapper/FXMapFileDialog'
|
430
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_TRIZBORT,
|
431
|
-
|
432
|
-
|
433
|
-
|
428
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_TRIZBORT,
|
429
|
+
[
|
430
|
+
FMT_TRIZBORT
|
431
|
+
])
|
434
432
|
map.export_trizbort(d.filename) if d.filename != ''
|
435
433
|
end
|
436
434
|
|
@@ -442,10 +440,10 @@ class FXMapperWindow < FXMainWindow
|
|
442
440
|
return unless map
|
443
441
|
|
444
442
|
require 'IFMapper/FXMapFileDialog'
|
445
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_INFORM6,
|
446
|
-
|
447
|
-
|
448
|
-
|
443
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_INFORM6,
|
444
|
+
[
|
445
|
+
FMT_INFORM6,
|
446
|
+
])
|
449
447
|
map.export_inform( d.filename ) if d.filename != ''
|
450
448
|
end
|
451
449
|
|
@@ -457,10 +455,10 @@ class FXMapperWindow < FXMainWindow
|
|
457
455
|
return unless map
|
458
456
|
|
459
457
|
require 'IFMapper/FXMapFileDialog'
|
460
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_INFORM7,
|
461
|
-
|
462
|
-
|
463
|
-
|
458
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_INFORM7,
|
459
|
+
[
|
460
|
+
FMT_INFORM7,
|
461
|
+
])
|
464
462
|
map.export_inform7( d.filename ) if d.filename != ''
|
465
463
|
end
|
466
464
|
|
@@ -474,15 +472,15 @@ class FXMapperWindow < FXMainWindow
|
|
474
472
|
|
475
473
|
require 'IFMapper/TADSWriter'
|
476
474
|
require 'IFMapper/FXMapFileDialog'
|
477
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_TADS,
|
478
|
-
|
479
|
-
|
480
|
-
|
475
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_TADS,
|
476
|
+
[
|
477
|
+
FMT_TADS
|
478
|
+
])
|
481
479
|
map.export_tads( d.filename ) if d.filename != ''
|
482
480
|
end
|
483
481
|
|
484
482
|
#
|
485
|
-
# Export current map as
|
483
|
+
# Export current map as Scalable Vector Graphics (SVG)
|
486
484
|
#
|
487
485
|
def svg_export_cb(sender, sel, msg)
|
488
486
|
map = current_map
|
@@ -495,15 +493,15 @@ class FXMapperWindow < FXMainWindow
|
|
495
493
|
w.execute
|
496
494
|
return
|
497
495
|
end
|
498
|
-
|
496
|
+
|
499
497
|
require 'IFMapper/FXSVGMapExporterOptionsDialogBox'
|
500
|
-
cmd = FXSVGMapExporterOptionsDialogBox.new(self, MSG_SAVE_MAP_AS_SVG,
|
498
|
+
cmd = FXSVGMapExporterOptionsDialogBox.new(self, MSG_SAVE_MAP_AS_SVG,
|
501
499
|
map).execute
|
502
500
|
|
503
501
|
return if cmd == 0
|
504
502
|
|
505
503
|
require 'IFMapper/FXMapFileDialog'
|
506
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_SVG,
|
504
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_SVG,
|
507
505
|
[
|
508
506
|
FMT_SVG
|
509
507
|
])
|
@@ -527,22 +525,22 @@ class FXMapperWindow < FXMainWindow
|
|
527
525
|
w.execute
|
528
526
|
return
|
529
527
|
end
|
530
|
-
|
528
|
+
|
531
529
|
# PRE: Let's ask for a page size and orientation for the PDF
|
532
530
|
# and whether the user wants to include location numbers
|
533
531
|
map.pdfpapersize = 0
|
534
532
|
map.pdflocationnos = 1
|
535
533
|
require 'IFMapper/FXPDFMapExporterOptionsDialogBox'
|
536
|
-
cmd = FXPDFMapExporterOptionsDialogBox.new(self, MSG_SAVE_MAP_AS_PDF,
|
534
|
+
cmd = FXPDFMapExporterOptionsDialogBox.new(self, MSG_SAVE_MAP_AS_PDF,
|
537
535
|
map).execute
|
538
536
|
|
539
537
|
return if cmd == 0
|
540
538
|
|
541
539
|
require 'IFMapper/FXMapFileDialog'
|
542
|
-
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_PDF,
|
543
|
-
|
544
|
-
|
545
|
-
|
540
|
+
d = FXMapFileDialog.new(self, MSG_SAVE_MAP_AS_PDF,
|
541
|
+
[
|
542
|
+
FMT_PDF
|
543
|
+
])
|
546
544
|
if d.filename != ''
|
547
545
|
map.pdf_export(d.filename)
|
548
546
|
end
|
@@ -579,7 +577,7 @@ class FXMapperWindow < FXMainWindow
|
|
579
577
|
@maps = []
|
580
578
|
|
581
579
|
@mdiclient = FXMDIClient.new(self, LAYOUT_FILL_X|LAYOUT_FILL_Y)
|
582
|
-
@mdiclient.connect(SEL_CHANGED) {
|
580
|
+
@mdiclient.connect(SEL_CHANGED) {
|
583
581
|
update_map
|
584
582
|
}
|
585
583
|
|
@@ -604,7 +602,7 @@ class FXMapperWindow < FXMainWindow
|
|
604
602
|
end
|
605
603
|
|
606
604
|
#
|
607
|
-
# Return the copied elements
|
605
|
+
# Return the copied elements
|
608
606
|
#
|
609
607
|
def self.copy_buffer
|
610
608
|
return @@copy_buffer
|
@@ -627,9 +625,9 @@ class FXMapperWindow < FXMainWindow
|
|
627
625
|
# those rooms we selected
|
628
626
|
delete = []
|
629
627
|
links.each { |c|
|
630
|
-
if not rooms.include?(c.roomA) or
|
631
|
-
|
632
|
-
|
628
|
+
if not rooms.include?(c.roomA) or
|
629
|
+
(c.roomB and not rooms.include?(c.roomB))
|
630
|
+
delete << c
|
633
631
|
end
|
634
632
|
}
|
635
633
|
links -= delete
|
@@ -668,52 +666,52 @@ class FXMapperWindow < FXMainWindow
|
|
668
666
|
r_to_nr = {} # orig room to new room hash
|
669
667
|
rooms = sel[0]
|
670
668
|
rooms.each { |r|
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
669
|
+
nr = map.new_room(r.x + pos[0], r.y + pos[1])
|
670
|
+
nr.selected = true
|
671
|
+
nr.copy(r) # copy the room data
|
672
|
+
r_to_nr[r] = nr
|
675
673
|
}
|
676
674
|
|
677
675
|
if rooms.empty?
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
|
690
|
-
|
691
|
-
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
676
|
+
# Add connections only (no rooms copied)
|
677
|
+
sel[1].each { |c|
|
678
|
+
exitA, exitB = c.dirs
|
679
|
+
roomA = c.roomA
|
680
|
+
roomB = c.roomB
|
681
|
+
sect = map.sections[map.section]
|
682
|
+
if not sect.rooms.include?(roomA) or
|
683
|
+
(roomB and not sect.rooms.include?(roomB))
|
684
|
+
next
|
685
|
+
end
|
686
|
+
begin
|
687
|
+
nc = map.new_connection(roomA, exitA, roomB, exitB)
|
688
|
+
nc.selected = true
|
689
|
+
nc.dir = c.dir
|
690
|
+
nc.type = c.type
|
691
|
+
rescue
|
692
|
+
end
|
693
|
+
}
|
696
694
|
else
|
697
|
-
|
698
|
-
|
699
|
-
|
700
|
-
|
701
|
-
|
702
|
-
|
703
|
-
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
|
712
|
-
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
|
695
|
+
# Add connections
|
696
|
+
sel[1].each { |c|
|
697
|
+
exitA, exitB = c.dirs
|
698
|
+
roomA = r_to_nr[c.roomA]
|
699
|
+
if c.roomB
|
700
|
+
roomB = r_to_nr[c.roomB]
|
701
|
+
else
|
702
|
+
roomB = nil
|
703
|
+
end
|
704
|
+
next if not roomA
|
705
|
+
begin
|
706
|
+
nc = map.new_connection(roomA, exitA, roomB, exitB)
|
707
|
+
nc.selected = true
|
708
|
+
nc.dir = c.dir
|
709
|
+
nc.type = c.type
|
710
|
+
rescue Section::ConnectionError => e
|
711
|
+
puts c
|
712
|
+
puts e
|
713
|
+
end
|
714
|
+
}
|
717
715
|
end
|
718
716
|
|
719
717
|
map.create_pathmap
|
@@ -759,7 +757,7 @@ class FXMapperWindow < FXMainWindow
|
|
759
757
|
s.rooms.each { |r| r.selected = false }
|
760
758
|
}
|
761
759
|
|
762
|
-
matches.each { |p, r|
|
760
|
+
matches.each { |p, r|
|
763
761
|
next if p != map.section
|
764
762
|
r.selected = true
|
765
763
|
}
|
@@ -784,8 +782,8 @@ class FXMapperWindow < FXMainWindow
|
|
784
782
|
matches = []
|
785
783
|
(0...map.sections.size).each { |p|
|
786
784
|
map.sections[p].rooms.each { |r|
|
787
|
-
|
788
|
-
|
785
|
+
next unless r.name =~ re
|
786
|
+
matches.push( [p, r] )
|
789
787
|
}
|
790
788
|
}
|
791
789
|
idx = @search.index
|
@@ -853,8 +851,8 @@ class FXMapperWindow < FXMainWindow
|
|
853
851
|
matches = []
|
854
852
|
(0...map.sections.size).each { |p|
|
855
853
|
map.sections[p].rooms.each { |r|
|
856
|
-
|
857
|
-
|
854
|
+
next unless r.objects =~ re
|
855
|
+
matches.push( [p, r] )
|
858
856
|
}
|
859
857
|
}
|
860
858
|
idx = @search.index
|
@@ -873,8 +871,8 @@ class FXMapperWindow < FXMainWindow
|
|
873
871
|
matches = []
|
874
872
|
(0...map.sections.size).each { |p|
|
875
873
|
map.sections[p].rooms.each { |r|
|
876
|
-
|
877
|
-
|
874
|
+
next unless r.tasks =~ re
|
875
|
+
matches.push( [p, r] )
|
878
876
|
}
|
879
877
|
}
|
880
878
|
idx = @search.index
|
@@ -929,8 +927,8 @@ class FXMapperWindow < FXMainWindow
|
|
929
927
|
matches = []
|
930
928
|
(0...map.sections.size).each { |p|
|
931
929
|
map.sections[p].rooms.each { |r|
|
932
|
-
|
933
|
-
|
930
|
+
next unless r.desc =~ re
|
931
|
+
matches.push( [p, r] )
|
934
932
|
}
|
935
933
|
}
|
936
934
|
idx = @search.index
|
@@ -1006,8 +1004,8 @@ class FXMapperWindow < FXMainWindow
|
|
1006
1004
|
|
1007
1005
|
def about_cb(sender, id, event )
|
1008
1006
|
require 'IFMapper/FXAboutDialogBox'
|
1009
|
-
FXAboutDialogBox.new(self, MSG_ABOUT_SOFTWARE,
|
1010
|
-
|
1007
|
+
FXAboutDialogBox.new(self, MSG_ABOUT_SOFTWARE,
|
1008
|
+
eval("\"#{MSG_ABOUT}\"")).execute
|
1011
1009
|
end
|
1012
1010
|
|
1013
1011
|
|
@@ -1029,7 +1027,7 @@ class FXMapperWindow < FXMainWindow
|
|
1029
1027
|
cmd = FXMenuCommand.new(filemenu, MENU_SAVE, savedoc)
|
1030
1028
|
cmd.connect(SEL_COMMAND, method(:save_cb))
|
1031
1029
|
cmd = FXMenuCommand.new(filemenu, MENU_SAVE_AS,
|
1032
|
-
|
1030
|
+
saveasdoc)
|
1033
1031
|
cmd.connect(SEL_COMMAND, method(:save_as_cb))
|
1034
1032
|
|
1035
1033
|
# Export submenu
|
@@ -1037,7 +1035,7 @@ class FXMapperWindow < FXMainWindow
|
|
1037
1035
|
|
1038
1036
|
cmd = FXMenuCommand.new(submenu, MENU_EXPORT_PDF, nil)
|
1039
1037
|
cmd.connect(SEL_COMMAND, method(:pdf_export_cb))
|
1040
|
-
|
1038
|
+
|
1041
1039
|
cmd = FXMenuCommand.new(submenu, MENU_EXPORT_SVG, nil)
|
1042
1040
|
cmd.connect(SEL_COMMAND, method(:svg_export_cb))
|
1043
1041
|
|
@@ -1065,7 +1063,7 @@ class FXMapperWindow < FXMainWindow
|
|
1065
1063
|
|
1066
1064
|
cmd = FXMenuCommand.new(submenu, MENU_PRINT_LOCATIONS, nil)
|
1067
1065
|
cmd.connect(SEL_COMMAND, method(:print_locations_cb))
|
1068
|
-
FXMenuCascade.new(filemenu, MENU_PRINT, nil, submenu)
|
1066
|
+
#FXMenuCascade.new(filemenu, MENU_PRINT, nil, submenu)
|
1069
1067
|
|
1070
1068
|
cmd = FXMenuCommand.new(filemenu, MENU_QUIT, nil)
|
1071
1069
|
cmd.connect( SEL_COMMAND, method(:close_cb) )
|
@@ -1077,9 +1075,9 @@ class FXMapperWindow < FXMainWindow
|
|
1077
1075
|
cmd.connect(SEL_COMMAND, method(:copy_selected_cb))
|
1078
1076
|
cmd = FXMenuCommand.new(editmenu, MENU_CUT, nil)
|
1079
1077
|
cmd.connect(SEL_COMMAND, method(:cut_selected_cb))
|
1080
|
-
cmd = FXMenuCommand.new(editmenu, MENU_PASTE, nil)
|
1078
|
+
cmd = FXMenuCommand.new(editmenu, MENU_PASTE, nil)
|
1081
1079
|
cmd.connect(SEL_COMMAND, method(:paste_selected_cb))
|
1082
|
-
#cmd = FXMenuCommand.new(editmenu, MENU_UNDO, nil)
|
1080
|
+
#cmd = FXMenuCommand.new(editmenu, MENU_UNDO, nil)
|
1083
1081
|
#cmd.connect(SEL_COMMAND, method(:undo_cb))
|
1084
1082
|
|
1085
1083
|
# Select submenu
|
@@ -1142,55 +1140,55 @@ class FXMapperWindow < FXMainWindow
|
|
1142
1140
|
# Sections submenu
|
1143
1141
|
submenu = FXMenuPane.new(self)
|
1144
1142
|
cmd = FXMenuCommand.new(submenu, MENU_NEXT_SECTION)
|
1145
|
-
cmd.connect(SEL_COMMAND) {
|
1143
|
+
cmd.connect(SEL_COMMAND) {
|
1146
1144
|
next_section
|
1147
1145
|
}
|
1148
1146
|
cmd = FXMenuCommand.new(submenu, MENU_PREVIOUS_SECTION)
|
1149
|
-
cmd.connect(SEL_COMMAND) {
|
1147
|
+
cmd.connect(SEL_COMMAND) {
|
1150
1148
|
previous_section
|
1151
1149
|
}
|
1152
1150
|
FXMenuSeparator.new(submenu)
|
1153
1151
|
cmd = FXMenuCommand.new(submenu, MENU_ADD_SECTION)
|
1154
|
-
cmd.connect(SEL_COMMAND) {
|
1152
|
+
cmd.connect(SEL_COMMAND) {
|
1155
1153
|
map = current_map
|
1156
1154
|
if map
|
1157
|
-
|
1158
|
-
|
1159
|
-
|
1155
|
+
map.new_section
|
1156
|
+
map.modified = true
|
1157
|
+
update_section
|
1160
1158
|
end
|
1161
1159
|
}
|
1162
1160
|
cmd = FXMenuCommand.new(submenu, MENU_SECTION_INFO)
|
1163
|
-
cmd.connect(SEL_COMMAND) {
|
1161
|
+
cmd.connect(SEL_COMMAND) {
|
1164
1162
|
map = current_map
|
1165
1163
|
if map
|
1166
|
-
|
1167
|
-
|
1164
|
+
map.rename_section
|
1165
|
+
map.modified = true
|
1168
1166
|
end
|
1169
1167
|
}
|
1170
1168
|
FXMenuSeparator.new(submenu)
|
1171
1169
|
cmd = FXMenuCommand.new(submenu, MENU_DELETE_SECTION)
|
1172
|
-
cmd.connect(SEL_COMMAND) {
|
1170
|
+
cmd.connect(SEL_COMMAND) {
|
1173
1171
|
map = current_map
|
1174
1172
|
if map
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1173
|
+
map.delete_section
|
1174
|
+
map.modified = true
|
1175
|
+
update_section
|
1178
1176
|
end
|
1179
1177
|
}
|
1180
1178
|
FXMenuCascade.new(mapmenu, MENU_SECTIONS, nil, submenu)
|
1181
|
-
|
1179
|
+
|
1182
1180
|
#
|
1183
1181
|
# Zoom submenu
|
1184
1182
|
#
|
1185
1183
|
submenu = FXMenuPane.new(self)
|
1186
|
-
[25, 50, 75, 100, 125].each { |v|
|
1184
|
+
[25, 50, 75, 100, 125].each { |v|
|
1187
1185
|
cmd = FXMenuCommand.new(submenu, eval("\"#{MENU_ZOOM_PERCENT}\""))
|
1188
|
-
cmd.connect(SEL_COMMAND) {
|
1189
|
-
|
1190
|
-
|
1191
|
-
|
1192
|
-
|
1193
|
-
|
1186
|
+
cmd.connect(SEL_COMMAND) {
|
1187
|
+
map = current_map
|
1188
|
+
if map
|
1189
|
+
map.zoom = v / 100.0
|
1190
|
+
map.draw
|
1191
|
+
end
|
1194
1192
|
}
|
1195
1193
|
}
|
1196
1194
|
FXMenuCascade.new(mapmenu, MENU_ZOOM, nil, submenu)
|
@@ -1202,7 +1200,7 @@ class FXMapperWindow < FXMainWindow
|
|
1202
1200
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1203
1201
|
map = current_map
|
1204
1202
|
if map
|
1205
|
-
|
1203
|
+
map.options['Edit on Creation'] = (s.check == true)
|
1206
1204
|
end
|
1207
1205
|
}
|
1208
1206
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1215,7 +1213,7 @@ class FXMapperWindow < FXMainWindow
|
|
1215
1213
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1216
1214
|
map = current_map
|
1217
1215
|
if map
|
1218
|
-
|
1216
|
+
map.options['Automatic Connection'] = (s.check == true)
|
1219
1217
|
end
|
1220
1218
|
}
|
1221
1219
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1245,8 +1243,8 @@ class FXMapperWindow < FXMainWindow
|
|
1245
1243
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1246
1244
|
map = current_map
|
1247
1245
|
if map
|
1248
|
-
|
1249
|
-
|
1246
|
+
map.options['Use Room Cursor'] = (s.check == true)
|
1247
|
+
map.draw
|
1250
1248
|
end
|
1251
1249
|
}
|
1252
1250
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1259,8 +1257,8 @@ class FXMapperWindow < FXMainWindow
|
|
1259
1257
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1260
1258
|
map = current_map
|
1261
1259
|
if map
|
1262
|
-
|
1263
|
-
|
1260
|
+
map.options['Paths as Curves'] = (s.check == true)
|
1261
|
+
map.draw
|
1264
1262
|
end
|
1265
1263
|
}
|
1266
1264
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1272,8 +1270,8 @@ class FXMapperWindow < FXMainWindow
|
|
1272
1270
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1273
1271
|
map = current_map
|
1274
1272
|
if map
|
1275
|
-
|
1276
|
-
|
1273
|
+
map.options['Location Numbers'] = (s.check == true)
|
1274
|
+
map.draw
|
1277
1275
|
end
|
1278
1276
|
}
|
1279
1277
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1286,8 +1284,8 @@ class FXMapperWindow < FXMainWindow
|
|
1286
1284
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1287
1285
|
map = current_map
|
1288
1286
|
if map
|
1289
|
-
|
1290
|
-
|
1287
|
+
map.options['Location Tasks'] = (s.check == true)
|
1288
|
+
map.draw
|
1291
1289
|
end
|
1292
1290
|
}
|
1293
1291
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1300,8 +1298,8 @@ class FXMapperWindow < FXMainWindow
|
|
1300
1298
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1301
1299
|
map = current_map
|
1302
1300
|
if map
|
1303
|
-
|
1304
|
-
|
1301
|
+
map.options['Location Description'] = (s.check == true)
|
1302
|
+
map.draw
|
1305
1303
|
end
|
1306
1304
|
}
|
1307
1305
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1314,8 +1312,8 @@ class FXMapperWindow < FXMainWindow
|
|
1314
1312
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1315
1313
|
map = current_map
|
1316
1314
|
if map
|
1317
|
-
|
1318
|
-
|
1315
|
+
map.options['Grid Boxes'] = (s.check == true)
|
1316
|
+
map.draw
|
1319
1317
|
end
|
1320
1318
|
}
|
1321
1319
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1328,8 +1326,8 @@ class FXMapperWindow < FXMainWindow
|
|
1328
1326
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1329
1327
|
map = current_map
|
1330
1328
|
if map
|
1331
|
-
|
1332
|
-
|
1329
|
+
map.options['Grid Straight Connections'] = (s.check == true)
|
1330
|
+
map.draw
|
1333
1331
|
end
|
1334
1332
|
}
|
1335
1333
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1342,8 +1340,8 @@ class FXMapperWindow < FXMainWindow
|
|
1342
1340
|
cmd.connect(SEL_COMMAND) { |s, m, e|
|
1343
1341
|
map = current_map
|
1344
1342
|
if map
|
1345
|
-
|
1346
|
-
|
1343
|
+
map.options['Grid Diagonal Connections'] = s.check
|
1344
|
+
map.draw
|
1347
1345
|
end
|
1348
1346
|
}
|
1349
1347
|
cmd.connect(SEL_UPDATE) { |s, m, e|
|
@@ -1366,11 +1364,11 @@ class FXMapperWindow < FXMainWindow
|
|
1366
1364
|
# }
|
1367
1365
|
|
1368
1366
|
# FXMenuCascade.new(mapmenu, MENU_LANGUAGE, nil, langmenu)
|
1369
|
-
|
1367
|
+
|
1370
1368
|
|
1371
1369
|
FXMenuSeparator.new(submenu)
|
1372
1370
|
cmd = FXMenuCommand.new(submenu, MENU_SAVE_PREFS)
|
1373
|
-
cmd.connect(SEL_COMMAND) {
|
1371
|
+
cmd.connect(SEL_COMMAND) {
|
1374
1372
|
map = current_map
|
1375
1373
|
map.options.write if map
|
1376
1374
|
}
|
@@ -1395,8 +1393,8 @@ class FXMapperWindow < FXMainWindow
|
|
1395
1393
|
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_2)
|
1396
1394
|
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_3)
|
1397
1395
|
FXMenuCommand.new(windowmenu, nil, nil, @mdiclient, FXMDIClient::ID_MDI_4)
|
1398
|
-
FXMenuCommand.new(windowmenu, MENU_OTHERS, nil, @mdiclient,
|
1399
|
-
|
1396
|
+
FXMenuCommand.new(windowmenu, MENU_OTHERS, nil, @mdiclient,
|
1397
|
+
FXMDIClient::ID_MDI_OVER_5)
|
1400
1398
|
FXMenuTitle.new(@menubar, MENU_WINDOW, nil, windowmenu)
|
1401
1399
|
|
1402
1400
|
# Help menu
|
@@ -1412,14 +1410,14 @@ class FXMapperWindow < FXMainWindow
|
|
1412
1410
|
cmd = FXMenuCommand.new(helpmenu, MENU_RESOURCE, nil)
|
1413
1411
|
cmd.connect(SEL_COMMAND) {
|
1414
1412
|
require 'IFMapper/FXMapFileDialog'
|
1415
|
-
file = FXMapFileDialog.new(self, "Resource a Ruby File",
|
1416
|
-
|
1413
|
+
file = FXMapFileDialog.new(self, "Resource a Ruby File",
|
1414
|
+
['Ruby File (*.rb)']).filename
|
1417
1415
|
if file != ''
|
1418
|
-
|
1419
|
-
|
1420
|
-
|
1421
|
-
|
1422
|
-
|
1416
|
+
begin
|
1417
|
+
Kernel.load file
|
1418
|
+
rescue => e
|
1419
|
+
p e
|
1420
|
+
end
|
1423
1421
|
end
|
1424
1422
|
}
|
1425
1423
|
FXMenuTitle.new(@menubar, MENU_HELP, nil, helpmenu)
|
@@ -1430,19 +1428,15 @@ class FXMapperWindow < FXMainWindow
|
|
1430
1428
|
end
|
1431
1429
|
|
1432
1430
|
def docs(*opts)
|
1433
|
-
browsers = [ 'chrome', 'chromium', 'firefox', 'opera', 'explorer' ]
|
1434
1431
|
address = 'docs/' + language + '/start.html'
|
1435
1432
|
status "#{MSG_OPENING_WEB_PAGE} #{address}..."
|
1436
|
-
|
1437
|
-
|
1438
|
-
|
1439
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
1443
|
-
break if ok
|
1444
|
-
}
|
1445
|
-
if not ok
|
1433
|
+
if RUBY_PLATFORM =~ /mswin|mingw|cygwin/
|
1434
|
+
system("rundll32 url.dll,FileProtocolHandler \"#{address}\"")
|
1435
|
+
elsif RUBY_PLATFORM =~ /darwin/
|
1436
|
+
system("open \"#{address}\"")
|
1437
|
+
elsif RUBY_PLATFORM =~ /linux|bsd/
|
1438
|
+
system("xdg-open \"#{address}\"")
|
1439
|
+
else
|
1446
1440
|
status ERR_COULD_NOT_OPEN_WEB_BROWSER
|
1447
1441
|
end
|
1448
1442
|
end
|
@@ -1463,7 +1457,7 @@ class FXMapperWindow < FXMainWindow
|
|
1463
1457
|
|
1464
1458
|
# File manipulation
|
1465
1459
|
cmd = FXButton.new(toolbar, ICON_NEW, newdoc, nil, 0,
|
1466
|
-
|
1460
|
+
FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1467
1461
|
cmd.connect(SEL_COMMAND, method(:new_map_cb))
|
1468
1462
|
|
1469
1463
|
cmd = FXButton.new(toolbar, ICON_OPEN, opendoc, nil, 0,
|
@@ -1491,15 +1485,15 @@ class FXMapperWindow < FXMainWindow
|
|
1491
1485
|
FXFrame.new(toolbar,
|
1492
1486
|
LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 4, 20)
|
1493
1487
|
cmd = FXButton.new(toolbar, ICON_PRINT,
|
1494
|
-
|
1495
|
-
|
1488
|
+
load_icon("printicon"), @mdiclient, FXGLViewer::ID_PRINT_IMAGE,
|
1489
|
+
BUTTON_AUTOGRAY|FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1496
1490
|
cmd.connect(SEL_COMMAND, method(:print_cb))
|
1497
1491
|
cmd.connect(SEL_UPDATE) { |sender, sel, ptr|
|
1498
1492
|
map = current_map
|
1499
1493
|
message = map ? FXWindow::ID_ENABLE : FXWindow::ID_DISABLE
|
1500
1494
|
sender.handle(self, MKUINT(message, SEL_COMMAND), nil)
|
1501
1495
|
}
|
1502
|
-
|
1496
|
+
|
1503
1497
|
# Editing
|
1504
1498
|
FXFrame.new(toolbar,
|
1505
1499
|
LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 4, 20)
|
@@ -1535,43 +1529,43 @@ class FXMapperWindow < FXMainWindow
|
|
1535
1529
|
FXFrame.new(toolbar,
|
1536
1530
|
LAYOUT_TOP|LAYOUT_LEFT|LAYOUT_FIX_WIDTH|LAYOUT_FIX_HEIGHT, 0, 0, 4, 20)
|
1537
1531
|
cmd = FXButton.new(toolbar, ICON_ZOOM_IN, load_icon("zoom"), @mdiclient,
|
1538
|
-
|
1532
|
+
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1539
1533
|
cmd.connect(SEL_COMMAND) { zoom_in }
|
1540
1534
|
|
1541
|
-
cmd = FXButton.new(toolbar, ICON_ZOOM_OUT, load_icon("zoom"), @mdiclient,
|
1542
|
-
|
1535
|
+
cmd = FXButton.new(toolbar, ICON_ZOOM_OUT, load_icon("zoom"), @mdiclient,
|
1536
|
+
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1543
1537
|
cmd.connect(SEL_COMMAND) { zoom_out }
|
1544
1538
|
|
1545
1539
|
|
1546
1540
|
# Section travel
|
1547
1541
|
frame = FXHorizontalFrame.new(toolbar,
|
1548
|
-
|
1549
|
-
cmd = FXButton.new(frame, ICON_PREV_SECTION, load_icon("prevpage"),
|
1550
|
-
|
1551
|
-
|
1542
|
+
LAYOUT_RIGHT|FRAME_THICK|FRAME_RAISED)
|
1543
|
+
cmd = FXButton.new(frame, ICON_PREV_SECTION, load_icon("prevpage"),
|
1544
|
+
@mdiclient,
|
1545
|
+
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1552
1546
|
cmd.connect(SEL_COMMAND) { previous_section }
|
1553
1547
|
|
1554
|
-
@section = FXTextField.new(frame, 5, nil, 0,
|
1555
|
-
|
1548
|
+
@section = FXTextField.new(frame, 5, nil, 0,
|
1549
|
+
TEXTFIELD_INTEGER|LAYOUT_FILL_ROW)
|
1556
1550
|
@section.text = '1'
|
1557
|
-
@section.connect(SEL_COMMAND) { |s,m,e|
|
1551
|
+
@section.connect(SEL_COMMAND) { |s,m,e|
|
1558
1552
|
v = s.text.to_i
|
1559
1553
|
map = current_map
|
1560
1554
|
if map
|
1561
|
-
|
1562
|
-
|
1563
|
-
|
1555
|
+
map.section = v - 1
|
1556
|
+
map.draw
|
1557
|
+
update_section
|
1564
1558
|
end
|
1565
1559
|
}
|
1566
|
-
@section.connect(SEL_UPDATE) { |s,m,e|
|
1560
|
+
@section.connect(SEL_UPDATE) { |s,m,e|
|
1567
1561
|
map = current_map
|
1568
1562
|
update_section if map
|
1569
1563
|
}
|
1570
1564
|
|
1571
|
-
cmd = FXButton.new(frame, ICON_NEXT_SECTION, load_icon("nextpage"),
|
1572
|
-
|
1573
|
-
|
1574
|
-
cmd.connect(SEL_COMMAND) { next_section }
|
1565
|
+
cmd = FXButton.new(frame, ICON_NEXT_SECTION, load_icon("nextpage"),
|
1566
|
+
@mdiclient,
|
1567
|
+
0, FRAME_THICK|FRAME_RAISED|LAYOUT_TOP|LAYOUT_LEFT)
|
1568
|
+
cmd.connect(SEL_COMMAND) { next_section }
|
1575
1569
|
end
|
1576
1570
|
|
1577
1571
|
#
|
@@ -1595,7 +1589,7 @@ class FXMapperWindow < FXMainWindow
|
|
1595
1589
|
#
|
1596
1590
|
# Go to previous section in current map
|
1597
1591
|
#
|
1598
|
-
def previous_section
|
1592
|
+
def previous_section
|
1599
1593
|
map = current_map
|
1600
1594
|
map.previous_section if map
|
1601
1595
|
update_section
|
@@ -1647,20 +1641,20 @@ class FXMapperWindow < FXMainWindow
|
|
1647
1641
|
@menubar = FXMenuBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X)
|
1648
1642
|
|
1649
1643
|
FXHorizontalSeparator.new(self,
|
1650
|
-
|
1644
|
+
LAYOUT_SIDE_TOP|SEPARATOR_GROOVE|LAYOUT_FILL_X)
|
1651
1645
|
toolbar = FXToolBar.new(self, LAYOUT_SIDE_TOP|LAYOUT_FILL_X,
|
1652
1646
|
0, 0, 0, 0, 4, 4, 0, 0, 0, 0)
|
1653
|
-
|
1647
|
+
|
1654
1648
|
# Status bar
|
1655
1649
|
@statusbar = FXStatusBar.new(self,
|
1656
|
-
|
1657
|
-
|
1650
|
+
LAYOUT_SIDE_BOTTOM|LAYOUT_FILL_X|
|
1651
|
+
STATUSBAR_WITH_DRAGCORNER)
|
1658
1652
|
|
1659
1653
|
|
1660
1654
|
create_mdiclient
|
1661
1655
|
create_menus
|
1662
1656
|
create_toolbar(toolbar)
|
1663
|
-
|
1657
|
+
|
1664
1658
|
|
1665
1659
|
self.connect(SEL_CLOSE, method(:close_cb))
|
1666
1660
|
show
|
@@ -1670,13 +1664,13 @@ class FXMapperWindow < FXMainWindow
|
|
1670
1664
|
|
1671
1665
|
def initialize(app)
|
1672
1666
|
super(app, eval("\"#{TITLE}\""), nil, nil, DECOR_ALL, 0, 0, 800, 600)
|
1673
|
-
|
1667
|
+
|
1674
1668
|
@colors = nil
|
1675
1669
|
@mdimenu = nil
|
1676
1670
|
@search = nil
|
1677
1671
|
|
1678
1672
|
create_widgets
|
1679
|
-
|
1673
|
+
|
1680
1674
|
|
1681
1675
|
# Trap CTRL-C signals and exit nicely
|
1682
1676
|
trap('SIGINT') {
|
@@ -1687,13 +1681,13 @@ class FXMapperWindow < FXMainWindow
|
|
1687
1681
|
|
1688
1682
|
def close_cb(*args)
|
1689
1683
|
exit = true
|
1690
|
-
@maps.each { |m|
|
1691
|
-
|
1692
|
-
|
1693
|
-
|
1694
|
-
|
1695
|
-
|
1696
|
-
|
1684
|
+
@maps.each { |m|
|
1685
|
+
if not m.close_cb
|
1686
|
+
exit = false
|
1687
|
+
break
|
1688
|
+
else
|
1689
|
+
@maps.delete(m)
|
1690
|
+
end
|
1697
1691
|
}
|
1698
1692
|
self.close if exit
|
1699
1693
|
end
|