--- deliantra/Deliantra-Client/bin/cfplus 2006/05/27 20:46:54 1.18 +++ deliantra/Deliantra-Client/bin/cfplus 2006/05/29 20:22:33 1.27 @@ -83,6 +83,7 @@ our $METASERVER; our $LOGIN_BUTTON; our $QUIT_DIALOG; +our $SERVER_SETUP; our $FLOORBOX; our $GAUGES; @@ -99,9 +100,12 @@ our $STATUSBOX; our $DEBUG_STATUS; +our $INV_WINDOW; our $INV; our $INVR; -our $INVR_LBL; +our $INV_RIGHT_HB; + +our $BIND_WINDOW; sub status { $STATUSBOX->add (CFClient::UI::Label::escape $_[0], pri => -10, group => "status", timeout => 10, fg => [1, 1, 0, 1]); @@ -116,6 +120,9 @@ sub start_game { status "logging in..."; + $LOGIN_BUTTON->set_text ("Logout"); + $SERVER_SETUP->hide; + my $mapsize = List::Util::min 32, List::Util::max 11, int $WIDTH * $CFG->{mapsize} * 0.01 / 32; my ($host, $port) = split /:/, $CFG->{host}; @@ -153,12 +160,7 @@ if ($CONN) { CFClient::lowdelay fileno $CONN->{fh}; - $LOGIN_BUTTON->set_text ("Logout"); status "login successful"; - - $BUTTONBAR->{children}[1]->emit ("activate") - if $BUTTONBAR->{children}[1]->{state}; - } else { status "unable to connect"; stop_game(); @@ -166,19 +168,23 @@ } sub stop_game { + $LOGIN_BUTTON->set_text ("Login"); + $SERVER_SETUP->show; + $INV_WINDOW->hide; + $LOGVIEW->hide; + return unless $CONN; status "connection closed"; - $LOGIN_BUTTON->set_text ("Login"); + $CONN->destroy; $CONN = 0; # false, does not autovivify - - $BUTTONBAR->{children}[1]->emit ("activate") - unless $BUTTONBAR->{children}[1]->{state}; } sub client_setup { my $dialog = new CFClient::UI::FancyFrame + req_x => 1, + req_y => $HEIGHT * (1/8), name => "client_setup", title => "Client Setup", child => (my $vbox = new CFClient::UI::VBox); @@ -385,9 +391,10 @@ my $gh = int $HEIGHT * $CFG->{gauge_size}; my $win = new CFClient::UI::Frame ( - req_y => -1, - user_w => $WIDTH, - user_h => $gh, + req_x => 0, + req_y => -1, + def_w => $WIDTH, + def_h => $gh, ); $win->add (my $hbox = new CFClient::UI::HBox @@ -433,8 +440,13 @@ $win } + sub make_stats_window { - my $tgw = new CFClient::UI::FancyFrame title => "Stats", name => "stats_window"; + my $tgw = new CFClient::UI::FancyFrame + req_y => $HEIGHT * (2/8), + req_x => -1, + title => "Stats", + name => "stats_window"; $tgw->add (new CFClient::UI::Window child => my $vb = new CFClient::UI::VBox); $vb->add ($STATWIDS->{title} = new CFClient::UI::Label valign => 0, align => -1, text => "Title:", expand => 1, @@ -706,11 +718,18 @@ } sub server_setup { - my $dialog = new CFClient::UI::FancyFrame - name => "server_setup", - title => "Server Setup", - child => (my $vbox = new CFClient::UI::VBox); - + my $dialog = $SERVER_SETUP = new CFClient::UI::FancyFrame + x => $WIDTH * (1/3), + y => $HEIGHT * (1/8), + name => "server_setup", + title => "Server Setup", + child => (my $vbox = new CFClient::UI::VBox), + on_visibility_change => sub { + my ($self, $visible) = @_; + $self->center if $visible; + }, + ; + $vbox->add (my $table = new CFClient::UI::Table expand => 1, col_expand => [0, 1]); $table->add (0, 2, new CFClient::UI::Label valign => 0, align => 1, text => "Host:Port"); @@ -823,8 +842,10 @@ title => "Messages", border_bg => [1, 1, 1, 1], bg => [0, 0, 0, 0.75], - user_w => int $::WIDTH / 3, - user_h => int $::HEIGHT / 5, + req_x => -1, + req_y => 0, + def_w => int $::WIDTH / 3, + def_h => int $::HEIGHT / 5, child => (my $vbox = new CFClient::UI::VBox); $vbox->add ($LOGVIEW); @@ -848,7 +869,9 @@ my ($input, $text) = @_; $input->set_text (''); - if ($text =~ /^\/(.*)/) { + if ($text =~ /^\/bind\s+(.*)$/) { + CFClient::Recorder::open_binding_dialog ([$1]); + } elsif ($text =~ /^\/(.*)/) { $::CONN->user_send ($1); } else { my $say_cmd = $::CFG->{say_command} || 'say'; @@ -874,7 +897,6 @@ sub open_quit_dialog { unless ($QUIT_DIALOG) { - $QUIT_DIALOG = new CFClient::UI::FancyFrame title => "Really Quit?"; $QUIT_DIALOG->add (my $vb = new CFClient::UI::VBox expand => 1); @@ -895,46 +917,90 @@ expand => 1, on_activate => sub { exit }, ); - - $QUIT_DIALOG->show_centered; - } else { - $QUIT_DIALOG->show_centered; } + + $QUIT_DIALOG->show; + $QUIT_DIALOG->center; } sub make_inventory_window { - my $invwin = new CFClient::UI::FancyFrame - user_w => $WIDTH * (7/8), user_h => $HEIGHT * (7/8), title => "Inventory", name => "inventory_window"; + my $invwin = $INV_WINDOW = new CFClient::UI::FancyFrame + def_w => $WIDTH * 7/8, + def_h => $HEIGHT * 7/8, + title => "Inventory", + name => "inventory_window", + on_visibility_change => sub { + my ($self, $visible) = @_; + $self->center if $visible; + }, + ; - $invwin->add (my $hb = new CFClient::UI::HBox expand => 1); + $invwin->add (my $hb = new CFClient::UI::HBox homogeneous => 1); - $hb->add (my $vb1 = new CFClient::UI::VBox expand => 1); - $vb1->add (my $lbl = new CFClient::UI::Label align => 0); - $lbl->set_text ("Player"); - $vb1->add ($INV = new CFClient::UI::Inventory expand => 1); - - $hb->add (my $vb2 = new CFClient::UI::VBox expand => 1); - - $vb2->add (my $hb2 = new CFClient::UI::HBox); - $hb2->add ($INVR_LBL = new CFClient::UI::Label align => 0, expand => 1); - $hb2->add (new CFClient::UI::Button - text => "Close", - tooltip => "Close the currently open container (if one is open)", - on_activate => sub { - $CONN->send ("apply $CONN->{open_container}") - if $CONN->{open_container} != 0; - }, - ); + $hb->add (my $vb1 = new CFClient::UI::VBox); + $vb1->add (new CFClient::UI::Label align => 0, text => "Player"); + $vb1->add ($INV = new CFClient::UI::Inventory expand => 1); + + $hb->add (my $vb2 = new CFClient::UI::VBox); + + $vb2->add ($INV_RIGHT_HB = new CFClient::UI::HBox); - $INVR_LBL->set_text ("Floor"); $vb2->add ($INVR = new CFClient::UI::Inventory expand => 1); + # XXX: Call after $INVR = ... because set_opencont sets the items + CFClient::Protocol::set_opencont ($::CONN, 0, "Floor"); + $invwin } +sub make_binding_window { + my $binding_list = new CFClient::UI::VBox; + + my $refresh = sub { + $binding_list->clear (); + + for my $mod (keys %{$::CFG->{bindings}}) { + for my $sym (keys %{$::CFG->{bindings}->{$mod}}) { + my $cmds = $::CFG->{bindings}->{$mod}->{$sym}; + next unless ref $cmds eq 'ARRAY' and @$cmds > 0; + + my $lbl = join "; ", @$cmds; + my $nam = CFClient::Recorder::keycombo_to_name ($mod, $sym); + $binding_list->add (my $hb = new CFClient::UI::HBox); + $hb->add (new CFClient::UI::Button + text => "delete", + on_activate => sub { + $binding_list->remove ($hb); + delete $::CFG->{bindings}->{$mod}->{$sym}; + }); + $hb->add (new CFClient::UI::Label text => "($nam)"); + $hb->add (new CFClient::UI::Label text => $lbl, expand => 1); + } + } + }; + + $BIND_WINDOW = new CFClient::UI::FancyFrame + title => "Bindings", + def_w => int $WIDTH * 7/8, + def_h => int $HEIGHT * 7/8, + on_visibility_change => sub { + my ($self, $visible) = @_; + if ($visible) { + $self->center; + $refresh->() + } + }; + + $BIND_WINDOW->add ($binding_list); + $refresh->(); + $BIND_WINDOW +} + sub make_help_window { my $win = new CFClient::UI::FancyFrame - user_w => $WIDTH * (7/8), user_h => $HEIGHT * (7/8), title => "Documentation"; + def_w => int $WIDTH * 7/8, + def_h => int $HEIGHT * 7/8, + title => "Documentation"; $win->add (my $vbox = new CFClient::UI::VBox); @@ -1079,6 +1145,14 @@ $BUTTONBAR->add (new CFClient::UI::Flopper text => "Help!", other => make_help_window, tooltip => "View Documentation"); + $BUTTONBAR->add (new CFClient::UI::Flopper + text => "Bindings", + other => make_binding_window, + tooltip => "Lets you delete bindings you have made with the recorder" + ); + $BUTTONBAR->add (new CFClient::UI::Flopper text => "[Rec]", other => CFClient::Recorder::make_window, + tooltip => "This feature lets you record a series of actions (eg. walking a path or ready a skill) and bind them to keys"); + $BUTTONBAR->add (new CFClient::UI::Button text => "Quit", tooltip => "Terminates the program", @@ -1095,13 +1169,7 @@ $STATUSBOX->add ("Set video mode $WIDTH×$HEIGHT", timeout => 10, fg => [1, 1, 1, 0.5]); - # delay till geometry is constant - $CFClient::UI::ROOT->on_post_alloc (startup => sub { - $BUTTONBAR->{children}[1]->emit ("activate"); # pop up server setup - my $widget = $GAUGES->{win}; - $widget->move (0, $HEIGHT - $widget->{h});#d# to in toplevel - }); - force_refresh (); + $SERVER_SETUP->show; } }