ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/bin/cfplus
(Generate patch)

Comparing deliantra/Deliantra-Client/bin/cfplus (file contents):
Revision 1.111 by root, Sun Aug 13 19:47:05 2006 UTC vs.
Revision 1.124 by root, Tue Nov 7 22:41:27 2006 UTC

1#!/opt/bin/perl 1#!/opt/bin/perl
2
3my $startup_done = sub { };
4
5# do splash-screen thingy on win32
6BEGIN {
7 if (%PAR::LibCache && $^O eq "MSWin32") {
8 while (my ($filename, $zip) = each %PAR::LibCache) {
9 $zip->extractMember ("SPLASH.bmp", "$ENV{PAR_TEMP}/SPLASH.bmp");
10 }
11
12 require Win32::GUI::SplashScreen;
13
14 Win32::GUI::SplashScreen::Show (
15 -file => "$ENV{PAR_TEMP}/SPLASH.bmp",
16 );
17
18 $startup_done = sub {
19 Win32::GUI::SplashScreen::Done (1);
20 };
21 }
22}
2 23
3use strict; 24use strict;
4use utf8; 25use utf8;
5 26
6# do things only needed for single-binary version (par) 27# do things only needed for single-binary version (par)
8 if (%PAR::LibCache) { 29 if (%PAR::LibCache) {
9 @INC = grep ref, @INC; # weed out all paths except pars loader refs 30 @INC = grep ref, @INC; # weed out all paths except pars loader refs
10 31
11 while (my ($filename, $zip) = each %PAR::LibCache) { 32 while (my ($filename, $zip) = each %PAR::LibCache) {
12 for ($zip->memberNames) { 33 for ($zip->memberNames) {
13 next unless /^\/root\/(.*)/; 34 next unless /^root\/(.*)/;
14 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1") 35 $zip->extractMember ($_, "$ENV{PAR_TEMP}/$1")
15 unless -e "$ENV{PAR_TEMP}/$1"; 36 unless -e "$ENV{PAR_TEMP}/$1";
16 } 37 }
17 } 38 }
18 39
47 68
48$Event::Eval = 0; 69$Event::Eval = 0;
49$Event::DIED = sub { 70$Event::DIED = sub {
50 # TODO: display dialog box or so 71 # TODO: display dialog box or so
51 Carp::cluck $_[1];#d#TODO: remove when stable 72 Carp::cluck $_[1];#d#TODO: remove when stable
52 CFPlus::error $_[1]; 73 return;#d#
74 CFPlus::fatal ($_[1]);
53}; 75};
54
55$SIG{__DIE__} = sub {
56 return if CFPlus::in_destruct;
57 Carp::cluck $_[0];
58 CFPlus::error $_[0];
59 return;#d#
60 #return unless defined $^S && !$^S;
61 $Event::DIED->(undef, $_[0]);
62};
63
64our $VERSION = '0.1';
65 76
66my $MAX_FPS = 60; 77my $MAX_FPS = 60;
67my $MIN_FPS = 5; # unused as of yet 78my $MIN_FPS = 5; # unused as of yet
68 79
69our $META_SERVER = "crossfire.real-time.com:13326"; 80our $META_SERVER = "crossfire.real-time.com:13326";
71our $LAST_REFRESH; 82our $LAST_REFRESH;
72our $NOW; 83our $NOW;
73 84
74our $CFG; 85our $CFG;
75our $CONN; 86our $CONN;
87our $PROFILE; # current profile
76our $FAST; # fast, low-quality mode, possibly useful for software-rendering 88our $FAST; # fast, low-quality mode, possibly useful for software-rendering
77 89
78our $WANT_REFRESH; 90our $WANT_REFRESH;
79our $CAN_REFRESH; 91our $CAN_REFRESH;
80 92
146 158
147sub debug { 159sub debug {
148 $DEBUG_STATUS->set_text ($_[0]); 160 $DEBUG_STATUS->set_text ($_[0]);
149} 161}
150 162
163sub message {
164 my ($para) = @_;
165
166 my $time = sprintf "%02d:%02d:%02d", (localtime time)[2,1,0];
167
168 $para->{markup} = "<span foreground='#ffffff'>$time</span> $para->{markup}";
169
170 $LOGVIEW->add_paragraph ($para);
171 $LOGVIEW->scroll_to_bottom;
172}
173
151sub destroy_query_dialog { 174sub destroy_query_dialog {
152 (delete $_[0]{query_dialog})->destroy 175 (delete $_[0]{query_dialog})->destroy
153 if $_[0]{query_dialog}; 176 if $_[0]{query_dialog};
154} 177}
155 178
156# server query dialog 179# server query dialog
157sub server_query { 180sub server_query {
158 my ($conn, $flags, $prompt) = @_; 181 my ($conn, $flags, $prompt) = @_;
159 182
160 $conn->{query_dialog} = my $dialog = new CFPlus::UI::FancyFrame 183 $conn->{query_dialog} = my $dialog = new CFPlus::UI::Toplevel
161 x => "center", 184 x => "center",
162 y => "center", 185 y => "center",
163 title => "Server Query", 186 title => "Server Query",
164 child => my $vbox = new CFPlus::UI::VBox, 187 child => my $vbox = new CFPlus::UI::VBox,
165 ; 188 ;
352 status "logging in..."; 375 status "logging in...";
353 376
354 $LOGIN_BUTTON->set_text ("Logout"); 377 $LOGIN_BUTTON->set_text ("Logout");
355 $SETUP_DIALOG->hide; 378 $SETUP_DIALOG->hide;
356 379
380 $PROFILE = $CFG->{profile}{default};
381
357 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; 382 my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32;
358 383
359 my ($host, $port) = split /:/, $CFG->{profile}{default}{host}; 384 my ($host, $port) = split /:/, $PROFILE->{host};
360 385
361 $MAP = new CFPlus::Map $mapsize, $mapsize; 386 $MAP = new CFPlus::Map;
362 387
363 $CONN = eval { 388 $CONN = eval {
364 new CFPlus::Protocol 389 new CFPlus::Protocol
365 host => $host, 390 host => $host,
366 port => $port || 13327, 391 port => $port || 13327,
367 user => $CFG->{profile}{default}{user}, 392 user => $PROFILE->{user},
368 pass => $CFG->{profile}{default}{password}, 393 pass => $PROFILE->{password},
369 mapw => $mapsize, 394 mapw => $mapsize,
370 maph => $mapsize, 395 maph => $mapsize,
396
397 client => "cfplus $CFPlus::VERSION $] $^O",
371 398
372 map_widget => $MAPWIDGET, 399 map_widget => $MAPWIDGET,
373 logview => $LOGVIEW, 400 logview => $LOGVIEW,
374 statusbox => $STATUSBOX, 401 statusbox => $STATUSBOX,
375 map => $MAP, 402 map => $MAP,
663 expand => 1, 690 expand => 1,
664 scroll_y => 1 691 scroll_y => 1
665 ); 692 );
666 $r->add (my $vb = new CFPlus::UI::VBox); 693 $r->add (my $vb = new CFPlus::UI::VBox);
667 694
695 $vb->add (new CFPlus::UI::FancyFrame
696 label => "Player",
697 child => (my $pi = new CFPlus::UI::VBox),
698 );
699
668 $vb->add ($STATWIDS->{title} = new CFPlus::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, 700 $pi->add ($STATWIDS->{title} = new CFPlus::UI::Label valign => 0, align => -1, text => "Title:", expand => 1,
669 can_hover => 1, can_events => 1, 701 can_hover => 1, can_events => 1,
670 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server."); 702 tooltip => "Your name and title. You can change your title by using the <b>title</b> command, if supported by the server.");
671 $vb->add ($STATWIDS->{map} = new CFPlus::UI::Label valign => 0, align => -1, text => "Map:", expand => 1, 703 $pi->add ($STATWIDS->{map} = new CFPlus::UI::Label valign => 0, align => -1, text => "Map:", expand => 1,
672 can_hover => 1, can_events => 1, 704 can_hover => 1, can_events => 1,
673 tooltip => "The map you are currently on (if supported by the server)."); 705 tooltip => "The map you are currently on (if supported by the server).");
674 706
675 $vb->add (my $hb0 = new CFPlus::UI::HBox); 707 $pi->add (my $hb0 = new CFPlus::UI::HBox);
676 $hb0->add ($STATWIDS->{weight} = new CFPlus::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1, 708 $hb0->add ($STATWIDS->{weight} = new CFPlus::UI::Label valign => 0, align => -1, text => "Weight:", expand => 1,
677 can_hover => 1, can_events => 1, 709 can_hover => 1, can_events => 1,
678 tooltip => "The weight of the player including all inventory items."); 710 tooltip => "The weight of the player including all inventory items.");
679 $hb0->add ($STATWIDS->{m_weight} = new CFPlus::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1, 711 $hb0->add ($STATWIDS->{m_weight} = new CFPlus::UI::Label valign => 0, align => -1, text => "Max weight:", expand => 1,
680 can_hover => 1, can_events => 1, 712 can_hover => 1, can_events => 1,
681 tooltip => "The weight limit: you cannot carry more than this."); 713 tooltip => "The weight limit: you cannot carry more than this.");
682 714
715 $vb->add (new CFPlus::UI::FancyFrame
716 label => "Primary/Secondary Statistics",
683 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1); 717 child => (my $hb = new CFPlus::UI::HBox expand => 1),
718 );
684 $hb->add (my $tbl = new CFPlus::UI::Table expand => 1); 719 $hb->add (my $tbl = new CFPlus::UI::Table expand => 1);
685 720
686 my $color2 = [1, 1, 0]; 721 my $color2 = [1, 1, 0];
687 722
688 for ( 723 for (
709 $tbl->add ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFPlus::UI::Label 744 $tbl->add ($col + 1, $row, $STATWIDS->{"$id\_lbl"} = new CFPlus::UI::Label
710 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0, 745 font => $FONT_FIXED, can_hover => 1, can_events => 1, fg => $color2, valign => 0,
711 align => -1, text => $label, tooltip => "#stat_$label"); 746 align => -1, text => $label, tooltip => "#stat_$label");
712 } 747 }
713 748
749 $vb->add (new CFPlus::UI::FancyFrame
750 label => "Resistancies",
714 $vb->add (my $tbl2 = new CFPlus::UI::Table expand => 1); 751 child => (my $tbl2 = new CFPlus::UI::Table expand => 1),
752 );
715 753
716 my $row = 0; 754 my $row = 0;
717 my $col = 0; 755 my $col = 0;
718 756
719 my %resist_names = ( 757 my %resist_names = (
913sub metaserver_dialog { 951sub metaserver_dialog {
914 my $vbox = new CFPlus::UI::VBox; 952 my $vbox = new CFPlus::UI::VBox;
915 my $table = new CFPlus::UI::Table; 953 my $table = new CFPlus::UI::Table;
916 $vbox->add (new CFPlus::UI::ScrolledWindow expand => 1, child => $table); 954 $vbox->add (new CFPlus::UI::ScrolledWindow expand => 1, child => $table);
917 955
918 my $dialog = new CFPlus::UI::FancyFrame 956 my $dialog = new CFPlus::UI::Toplevel
919 title => "Server List", 957 title => "Server List",
920 name => 'metaserver_dialog', 958 name => 'metaserver_dialog',
921 x => 'center', 959 x => 'center',
922 y => 'center', 960 y => 'center',
923 z => 3, 961 z => 3,
935} 973}
936 974
937sub server_setup { 975sub server_setup {
938 my $vbox = new CFPlus::UI::VBox; 976 my $vbox = new CFPlus::UI::VBox;
939 977
978 $vbox->add (new CFPlus::UI::FancyFrame
979 label => "Connection Settings",
940 $vbox->add (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]); 980 child => (my $table = new CFPlus::UI::Table expand => 1, col_expand => [0, 1]),
981 );
941 $table->add (0, 2, new CFPlus::UI::Label valign => 0, align => 1, text => "Host:Port"); 982 $table->add (0, 2, new CFPlus::UI::Label valign => 0, align => 1, text => "Host:Port");
942 983
943 { 984 {
944 $table->add (1, 2, my $vbox = new CFPlus::UI::VBox); 985 $table->add (1, 2, my $vbox = new CFPlus::UI::VBox);
945 986
1029 }, 1070 },
1030 ); 1071 );
1031 1072
1032 $table->add (0, 12, new CFPlus::UI::Label valign => 0, align => 1, text => "Chat Command"); 1073 $table->add (0, 12, new CFPlus::UI::Label valign => 0, align => 1, text => "Chat Command");
1033 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry 1074 $table->add (1, 12, my $saycmd = new CFPlus::UI::Entry
1034 text => $CFG->{say_command}, 1075 text => $CFG->{say_command},
1035 tooltip => "This is the command that will be used if you write a line in the message window entry or press <b>\"</b> in the map window. " 1076 tooltip => "This is the command that will be used if you write a line in the message window entry or press <b>\"</b> in the map window. "
1036 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. " 1077 . "Usually you want to enter something like 'say' or 'shout' or 'gsay' here. "
1037 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.", 1078 . "But you could also set it to <b>tell <i>playername</i></b> to only chat with that user.",
1038 on_changed => sub { 1079 on_changed => sub {
1039 my ($self, $value) = @_; 1080 my ($self, $value) = @_;
1040 $CFG->{say_command} = $value; 1081 $CFG->{say_command} = $value;
1041 0 1082 0
1042 } 1083 }
1043 ); 1084 );
1044 1085
1086 $table->add (0, 13, new CFPlus::UI::Label valign => 0, align => 1, text => "Tip of the day");
1087 $table->add (1, 13, my $saycmd = new CFPlus::UI::CheckBox
1088 state => $CFG->{show_tips},
1089 tooltip => "Show the <b>Tip of the day</b> window at startup?",
1090 on_changed => sub {
1091 my ($self, $value) = @_;
1092 $CFG->{show_tips} = $value;
1093 0
1094 }
1095 );
1096
1045 $vbox->add (new CFPlus::UI::Label 1097 $vbox->add (new CFPlus::UI::FancyFrame
1046 text => "Server Info", 1098 label => "Server Info",
1047 fontsize => 1.2,
1048 padding_y => 8,
1049 fg => [1, 1, 0, 1],
1050 );
1051
1052 $vbox->add ($SERVER_INFO = new CFPlus::UI::Label ellipsise => 0); 1099 child => ($SERVER_INFO = new CFPlus::UI::Label ellipsise => 0),
1100 );
1053 1101
1054 $vbox 1102 $vbox
1055} 1103}
1056 1104
1057sub message_window { 1105sub message_window {
1058 my $window = new CFPlus::UI::FancyFrame 1106 my $window = new CFPlus::UI::Toplevel
1059 name => "message_window", 1107 name => "message_window",
1060 title => "Messages", 1108 title => "Messages",
1061 border_bg => [1, 1, 1, 1], 1109 border_bg => [1, 1, 1, 1],
1062 x => "max", 1110 x => "max",
1063 y => 0, 1111 y => 0,
1113 window => $window, 1161 window => $window,
1114 input => $input, 1162 input => $input,
1115 }; 1163 };
1116 1164
1117 $window 1165 $window
1118}
1119
1120sub open_string_query {
1121 my $cb = $_[1];
1122 my $dialog = new CFPlus::UI::FancyFrame
1123 x => "center",
1124 y => "center",
1125 z => 50,
1126 force_w => $WIDTH * 4/5,
1127 title => $_[0];
1128
1129 $dialog->add (
1130 my $e = new CFPlus::UI::Entry
1131 on_activate => sub { $cb->(@_); $dialog->hide; 0 },
1132 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 },
1133 );
1134
1135 $e->grab_focus;
1136 $dialog->show;
1137}
1138
1139sub open_quit_dialog {
1140 unless ($QUIT_DIALOG) {
1141 $QUIT_DIALOG = new CFPlus::UI::FancyFrame
1142 x => "center",
1143 y => "center",
1144 z => 50,
1145 title => "Really Quit?",
1146 on_key_down => sub {
1147 my ($dialog, $ev) = @_;
1148 $ev->{sym} == 27 and $dialog->hide;
1149 }
1150 ;
1151
1152 $QUIT_DIALOG->add (my $vb = new CFPlus::UI::VBox expand => 1);
1153
1154 $vb->add (new CFPlus::UI::Label
1155 text => "You should find a savebed and apply it first!",
1156 max_w => $WIDTH * 0.25,
1157 ellipsize => 0,
1158 );
1159 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
1160 $hb->add (new CFPlus::UI::Button
1161 text => "Ok",
1162 expand => 1,
1163 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1164 );
1165 $hb->add (new CFPlus::UI::Button
1166 text => "Quit anyway",
1167 expand => 1,
1168 on_activate => sub { exit },
1169 );
1170 }
1171
1172 $QUIT_DIALOG->show;
1173 $QUIT_DIALOG->grab_focus;
1174} 1166}
1175 1167
1176sub autopickup_setup { 1168sub autopickup_setup {
1177 my $table = new CFPlus::UI::Table; 1169 my $table = new CFPlus::UI::Table;
1178 1170
1335 $PL_WINDOW->show; 1327 $PL_WINDOW->show;
1336 } 1328 }
1337} 1329}
1338 1330
1339sub player_window { 1331sub player_window {
1340 my $plwin = $PL_WINDOW = new CFPlus::UI::FancyFrame 1332 my $plwin = $PL_WINDOW = new CFPlus::UI::Toplevel
1341 x => "center", 1333 x => "center",
1342 y => "center", 1334 y => "center",
1343 force_w => $WIDTH * 9/10, 1335 force_w => $WIDTH * 9/10,
1344 force_h => $HEIGHT * 9/10, 1336 force_h => $HEIGHT * 9/10,
1345 title => "Player", 1337 title => "Player",
1387 1379
1388 my $refresh; 1380 my $refresh;
1389 $refresh = $BIND_UPD_CB = sub { 1381 $refresh = $BIND_UPD_CB = sub {
1390 $binding_list->clear (); 1382 $binding_list->clear ();
1391 1383
1384 return unless $PROFILE;
1385
1392 for my $mod (keys %{$::CFG->{profile}{default}{bindings}}) { 1386 for my $mod (keys %{$PROFILE->{bindings}}) {
1393 for my $sym (keys %{$::CFG->{profile}{default}{bindings}{$mod}}) { 1387 for my $sym (keys %{$PROFILE->{bindings}{$mod}}) {
1394 my $cmds = $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1388 my $cmds = $PROFILE->{bindings}{$mod}{$sym};
1395 next unless ref $cmds eq 'ARRAY' and @$cmds > 0; 1389 next unless ref $cmds eq 'ARRAY' and @$cmds > 0;
1396 1390
1397 my $lbl = join "; ", @$cmds; 1391 my $lbl = join "; ", @$cmds;
1398 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym); 1392 my $nam = CFPlus::BindingEditor::keycombo_to_name ($mod, $sym);
1399 $binding_list->add (my $hb = new CFPlus::UI::HBox); 1393 $binding_list->add (my $hb = new CFPlus::UI::HBox);
1400 $hb->add (new CFPlus::UI::Button 1394 $hb->add (new CFPlus::UI::Button
1401 text => "delete", 1395 text => "delete",
1402 tooltip => "Deletes the binding", 1396 tooltip => "Deletes the binding",
1403 on_activate => sub { 1397 on_activate => sub {
1404 $binding_list->remove ($hb); 1398 $binding_list->remove ($hb);
1405 delete $::CFG->{profile}{default}{bindings}{$mod}{$sym}; 1399 delete $PROFILE->{bindings}{$mod}{$sym};
1406 0 1400 0
1407 }); 1401 });
1408 1402
1409 $hb->add (new CFPlus::UI::Button 1403 $hb->add (new CFPlus::UI::Button
1410 text => "edit", 1404 text => "edit",
1411 tooltip => "Edits the binding", 1405 tooltip => "Edits the binding",
1412 on_activate => sub { 1406 on_activate => sub {
1413 $::BIND_EDITOR->set_binding ( 1407 $::BIND_EDITOR->set_binding (
1414 $mod, $sym, $::CFG->{profile}{default}{bindings}{$mod}{$sym}, 1408 $mod, $sym, $PROFILE->{bindings}{$mod}{$sym},
1415 sub { 1409 sub {
1416 my ($nmod, $nsym, $ncmds) = @_; 1410 my ($nmod, $nsym, $ncmds) = @_;
1417 $::BIND_EDITOR->cfg_unbind ($mod, $sym); 1411 $::BIND_EDITOR->cfg_unbind ($mod, $sym);
1418 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds); 1412 $::BIND_EDITOR->cfg_bind ($nmod, $nsym, $ncmds);
1419 $refresh->(); 1413 $refresh->();
1434 } 1428 }
1435 } 1429 }
1436 }; 1430 };
1437 1431
1438 my $vb = new CFPlus::UI::VBox; 1432 my $vb = new CFPlus::UI::VBox;
1433 $vb->add (new CFPlus::UI::FancyFrame
1434 label => "Options",
1439 $vb->add (my $hb = new CFPlus::UI::HBox); 1435 child => (my $hb = new CFPlus::UI::HBox),
1436 );
1440 $hb->add (new CFPlus::UI::Label text => "only shift-up stops fire"); 1437 $hb->add (new CFPlus::UI::Label text => "only shift-up stops fire");
1441 $hb->add (new CFPlus::UI::CheckBox 1438 $hb->add (new CFPlus::UI::CheckBox
1442 expand => 1, 1439 expand => 1,
1443 state => $CFG->{shift_fire_stop}, 1440 state => $CFG->{shift_fire_stop},
1444 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift", 1441 tooltip => "If this checkbox is enabled you will stop fire only if you stop pressing shift",
1446 my ($cbox, $value) = @_; 1443 my ($cbox, $value) = @_;
1447 $CFG->{shift_fire_stop} = $value; 1444 $CFG->{shift_fire_stop} = $value;
1448 0 1445 0
1449 }); 1446 });
1450 1447
1451 $vb->add ($binding_list); 1448 $vb->add (new CFPlus::UI::FancyFrame
1449 label => "Bindings",
1450 child => $binding_list);
1452 $vb->add (my $hb = new CFPlus::UI::HBox); 1451 $vb->add (my $hb = new CFPlus::UI::HBox);
1453 1452
1454 $hb->add (new CFPlus::UI::Button 1453 $hb->add (new CFPlus::UI::Button
1455 text => "record new", 1454 text => "record new",
1456 expand => 1, 1455 expand => 1,
1489 1488
1490 $vb 1489 $vb
1491} 1490}
1492 1491
1493sub help_window { 1492sub help_window {
1494 my $win = new CFPlus::UI::FancyFrame 1493 my $win = new CFPlus::UI::Toplevel
1495 x => 'center', 1494 x => 'center',
1496 y => 'center', 1495 y => 'center',
1497 z => 2, 1496 z => 4,
1498 name => 'doc_browser', 1497 name => 'doc_browser',
1499 force_w => int $WIDTH * 7/8, 1498 force_w => int $WIDTH * 7/8,
1500 force_h => int $HEIGHT * 7/8, 1499 force_h => int $HEIGHT * 7/8,
1501 title => "Help Browser", 1500 title => "Help Browser",
1502 has_close_button => 1; 1501 has_close_button => 1;
1503 1502
1504 $win->add (my $vbox = new CFPlus::UI::VBox); 1503 $win->add (my $vbox = new CFPlus::UI::VBox);
1505 1504
1505 $vbox->add (new CFPlus::UI::FancyFrame
1506 label => "Navigation",
1506 $vbox->add (my $buttons = new CFPlus::UI::HBox); 1507 child => (my $buttons = new CFPlus::UI::HBox),
1508 );
1507 $vbox->add (my $viewer = new CFPlus::UI::TextScroller 1509 $vbox->add (my $viewer = new CFPlus::UI::TextScroller
1508 expand => 1, fontsize => 0.8, padding_x => 4); 1510 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4);
1509 1511
1510 my @history; 1512 my @history;
1511 my @future; 1513 my @future;
1512 my $node; 1514 my $curnode;
1513 1515
1514 my $load_node; $load_node = sub { 1516 my $load_node; $load_node = sub {
1515 my ($node) = @_; 1517 my ($node, $para) = @_;
1516 1518
1517 $buttons->clear; 1519 $buttons->clear;
1518 1520
1521 $buttons->add (new CFPlus::UI::Button
1522 text => "⇤",
1523 tooltip => "back to the starting page",
1524 on_activate => sub {
1525 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode;
1526 unshift @future, @history;
1527 @history = ();
1528 $load_node->(@{shift @future});
1529 },
1530 );
1531
1519 if (@history) { 1532 if (@history) {
1520 $buttons->add (new CFPlus::UI::Button label => "&lt;", on_activate => sub { 1533 $buttons->add (new CFPlus::UI::Button
1521 unshift @future, $node if $node; 1534 text => "⋘",
1535 tooltip => "back to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $history[-1][0]) . "</i>",
1536 on_activate => sub {
1537 unshift @future, [$curnode, $viewer->current_paragraph] if $curnode;
1522 $node = pop @history; 1538 $load_node->(@{pop @history});
1523 1539 },
1524 }); 1540 );
1525 } 1541 }
1542
1543 if (@future) {
1544 $buttons->add (new CFPlus::UI::Button
1545 text => "⋙",
1546 tooltip => "forward to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $future[0][0]) . "</i>",
1547 on_activate => sub {
1548 push @history, [$curnode, $viewer->current_paragraph];
1549 $load_node->(@{shift @future});
1550 },
1551 );
1552 }
1553
1554 $buttons->add (new CFPlus::UI::Label text => " ");
1555
1556 my @path = CFPlus::Pod::full_path_of $node;
1557 pop @path; # drop current node
1558
1559 for my $node (@path) {
1560 $buttons->add (new CFPlus::UI::Button
1561 text => $node->{kw}[0],
1562 tooltip => "go to <i>" . (CFPlus::asxml CFPlus::Pod::full_path $node) . "</i>",
1563 on_activate => sub {
1564 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = ();
1565 $load_node->($node);
1566 },
1567 );
1568 $buttons->add (new CFPlus::UI::Label text => "/");
1569 }
1570
1571 $buttons->add (new CFPlus::UI::Label text => $node->{kw}[0], padding_x => 4, padding_y => 4);
1572
1573 $curnode = $node;
1574
1526 $viewer->clear; 1575 $viewer->clear;
1527 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $node); 1576 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $curnode);
1528 $viewer->set_offset (0); 1577 $viewer->scroll_to ($para);
1529 }; 1578 };
1530 1579
1531 $load_node->(CFPlus::Pod::find pod => "mainpage"); 1580 $load_node->(CFPlus::Pod::find pod => "mainpage");
1532 1581
1533 $CFPlus::Pod::on_link = sub { 1582 $CFPlus::Pod::goto_document = sub {
1534 my (@path) = @_; 1583 my (@path) = @_;
1535 1584
1536 push @history, $node if $node; 1585 push @history, [$curnode, $viewer->current_paragraph] if $curnode; @future = ();
1537 @future = ();
1538 1586
1539 $load_node->(CFPlus::Pod::find @path); 1587 $load_node->((CFPlus::Pod::find @path)[0]);
1540 $win->show; 1588 $win->show;
1541 }; 1589 };
1542 1590
1543 $win 1591 $win
1592}
1593
1594sub open_string_query {
1595 my ($title, $cb, $txt, $tooltip) = @_;
1596 my $dialog = new CFPlus::UI::Toplevel
1597 x => "center",
1598 y => "center",
1599 z => 50,
1600 force_w => $WIDTH * 4/5,
1601 title => $title;
1602
1603 $dialog->add (
1604 my $e = new CFPlus::UI::Entry
1605 on_activate => sub { $cb->(@_); $dialog->hide; 0 },
1606 on_key_down => sub { $_[1]->{sym} == 27 and $dialog->hide; 0 },
1607 tooltip => $tooltip
1608 );
1609
1610 $e->grab_focus;
1611 $e->set_text ($txt) if $txt;
1612 $dialog->show;
1613}
1614
1615sub open_quit_dialog {
1616 unless ($QUIT_DIALOG) {
1617 $QUIT_DIALOG = new CFPlus::UI::Toplevel
1618 x => "center",
1619 y => "center",
1620 z => 50,
1621 title => "Really Quit?",
1622 on_key_down => sub {
1623 my ($dialog, $ev) = @_;
1624 $ev->{sym} == 27 and $dialog->hide;
1625 }
1626 ;
1627
1628 $QUIT_DIALOG->add (my $vb = new CFPlus::UI::VBox expand => 1);
1629
1630 $vb->add (new CFPlus::UI::Label
1631 text => "You should find a savebed and apply it first!",
1632 max_w => $WIDTH * 0.25,
1633 ellipsize => 0,
1634 );
1635 $vb->add (my $hb = new CFPlus::UI::HBox expand => 1);
1636 $hb->add (new CFPlus::UI::Button
1637 text => "Ok",
1638 expand => 1,
1639 on_activate => sub { $QUIT_DIALOG->hide; 0 },
1640 );
1641 $hb->add (new CFPlus::UI::Button
1642 text => "Quit anyway",
1643 expand => 1,
1644 on_activate => sub { exit },
1645 );
1646 }
1647
1648 $QUIT_DIALOG->show;
1649 $QUIT_DIALOG->grab_focus;
1650}
1651
1652sub show_tip_of_the_day {
1653 # find all tips
1654 my @tod = CFPlus::Pod::find tip_of_the_day => "*";
1655
1656 my $todindex = $CFPlus::DB_STATE->get ("tip_of_the_day");
1657 $todindex = 0 if $todindex >= @tod;
1658 $CFPlus::DB_STATE->put (tip_of_the_day => $todindex + 1);
1659
1660 # create dialog
1661 my $dialog;
1662
1663 my $close = sub {
1664 $dialog->destroy;
1665 };
1666
1667 $dialog = new CFPlus::UI::Toplevel
1668 x => "center",
1669 y => "center",
1670 z => 3,
1671 name => 'tip_of_the_day',
1672 force_w => int $WIDTH * 4/9,
1673 force_h => int $WIDTH * 2/9,
1674 title => "Tip of the day #" . (1 + $todindex),
1675 child => my $vbox = new CFPlus::UI::VBox,
1676 has_close_button => 1,
1677 on_delete => $close,
1678 ;
1679
1680 $vbox->add (my $viewer = new CFPlus::UI::TextScroller
1681 expand => 1, fontsize => 0.8, padding_x => 4, padding_y => 4);
1682 $viewer->add_paragraph (CFPlus::Pod::as_paragraphs CFPlus::Pod::section_of $tod[$todindex]);
1683
1684 $vbox->add (my $table = new CFPlus::UI::Table);
1685
1686 $table->add (0, 0, new CFPlus::UI::Button
1687 text => "Close",
1688 tooltip => "Close the tip of the day window. To never see it again, disable the tip of the day in the <b>Server Setup</b>.",
1689 on_activate => $close,
1690 );
1691
1692 $table->add (2, 0, new CFPlus::UI::Button
1693 text => "Next",
1694 tooltip => "Show the next <b>Tip of the day</b>.",
1695 on_activate => sub {
1696 $close->();
1697 &show_tip_of_the_day;
1698 },
1699 );
1700
1701 $dialog->show;
1544} 1702}
1545 1703
1546sub sdl_init { 1704sub sdl_init {
1547 CFPlus::SDL_Init 1705 CFPlus::SDL_Init
1548 and die "SDL::Init failed!\n"; 1706 and die "SDL::Init failed!\n";
1595 force_x => 0, 1753 force_x => 0,
1596 force_y => "max", 1754 force_y => "max",
1597 child => $STATUSBOX, 1755 child => $STATUSBOX,
1598 )->show; 1756 )->show;
1599 1757
1600 CFPlus::UI::FancyFrame->new ( 1758 CFPlus::UI::Toplevel->new (
1601 title => "Map", 1759 title => "Map",
1602 name => "mapmap", 1760 name => "mapmap",
1603 x => 0, 1761 x => 0,
1604 y => $FONTSIZE + 8, 1762 y => $FONTSIZE + 8,
1605 border_bg => [1, 1, 1, 192/255], 1763 border_bg => [1, 1, 1, 192/255],
1633 can_hover => 1, 1791 can_hover => 1,
1634 can_events => 1, 1792 can_events => 1,
1635 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.", 1793 tooltip => "<b>Server Log</b>. This text viewer contains all the messages sent by the server.",
1636 ; 1794 ;
1637 1795
1638 $SETUP_DIALOG = new CFPlus::UI::FancyFrame 1796 $SETUP_DIALOG = new CFPlus::UI::Toplevel
1639 title => "Setup", 1797 title => "Setup",
1640 name => "setup_dialog", 1798 name => "setup_dialog",
1641 x => 'center', 1799 x => 'center',
1642 y => 'center', 1800 y => 'center',
1643 z => 2, 1801 z => 2,
1907 output_sync => 1, 2065 output_sync => 1,
1908 output_count => 1, 2066 output_count => 1,
1909 pickup => 0, 2067 pickup => 0,
1910 inv_sort => "mtime", 2068 inv_sort => "mtime",
1911 default => "profile", # default profile 2069 default => "profile", # default profile
2070 show_tips => 1,
1912 ); 2071 );
1913 2072
1914 while (my ($k, $v) = each %DEF_CFG) { 2073 while (my ($k, $v) = each %DEF_CFG) {
1915 $CFG->{$k} = $v unless exists $CFG->{$k}; 2074 $CFG->{$k} = $v unless exists $CFG->{$k};
1916 } 2075 }
1960# } 2119# }
1961# my $t2 = Time::HiRes::time; 2120# my $t2 = Time::HiRes::time;
1962# warn $t2-$t1; 2121# warn $t2-$t1;
1963# } 2122# }
1964 2123
2124 $startup_done->();
2125
1965 video_init; 2126 video_init;
1966 audio_init; 2127 audio_init;
1967} 2128}
2129
2130show_tip_of_the_day if $CFG->{show_tips};
1968 2131
1969Event::loop; 2132Event::loop;
1970#CFPlus::SDL_Quit; 2133#CFPlus::SDL_Quit;
1971#CFPlus::_exit 0; 2134#CFPlus::_exit 0;
1972 2135

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines