--- deliantra/server/ext/widget.ext 2007/07/20 22:34:56 1.9 +++ deliantra/server/ext/widget.ext 2007/07/24 19:33:57 1.16 @@ -1,17 +1,19 @@ #! perl # mandatory depends=login # sends the following ext message types -# ws_n id # widgetset new -# ws_d id # widgetset destroy +# ws_n ws # widgetset new +# ws_d ws # widgetset destroy # ws_c ws id class args # widgetset create -# w_c id [rid] name args # widget method call -# w_s id name value # widget member set -# w_g id rid name # widget member get +# w_c id rid name args # widget method call +# w_s id @attr # widget member set +# w_g id rid @attr # widget member get # # and expects the following exti message types # w_r rid res # widget call return # w_e id name args # widget_event +our $DEBUG = 1; + cf::client->attach ( on_connect => sub { my ($ns) = @_; @@ -19,7 +21,7 @@ Scalar::Util::weaken (my $weakns = $ns); $ns->{id} = "a"; - $ns->{json_coder}->filter_json_single_key_object (__widget_ref__ => sub { + $ns->{json_coder}->filter_json_single_key_object (__w_ => sub { # cannot deserialise ATM undef }); @@ -34,34 +36,6 @@ } } -sub demo_map { - my ($ns) = @_; - - my $ws = $ns->{csc} = $ns->new_widgetset; - - my $w = $ws->new (Toplevel => - w => 200, - h => 200, - x => "center", - y => "center", - title => "Worldmap", - has_close_button => 1, - on_delete => sub { - $ws->destroy; - }, - ); - - my $face = cf::face::find "res/worldmap.jpg"; - $ns->send_face ($face); - - $w->add (my $sw = $ws->new (ScrolledWindow => scroll_x => 1, scroll_y => 1)); - $sw->add (my $fixed = $ws->new (Fixed => expand => 1)); - $fixed->add ($ws->new (Face => expand => 1, size_w => undef, size_h => undef, face => $face), abs => 0, 0, rel => 1, 1); - $fixed->add ($ws->new (Label => text => "lb1"), abs => 10, 10, rel => 1, 1); - - $w->show; -} - sub csc_start { my ($ns) = @_; @@ -120,18 +94,16 @@ my $ns = $pl->ns; return unless $ns->{can_widget}; - - demo_map $ns; #csc_start $ns; }, ); cf::register_exticmd w_e => sub { - my ($ns, $pkt) = @_; + my ($ns, $id, $name, $args) = @_; - if (my $w = $ns->{widget}{$pkt->{id}}) { - if (my $cb = $w->{ev}{$pkt->{name}}) { - $_->($w, @{ $pkt->{args} || [] }) + if (my $w = $ns->{widget}{$id}) { + if (my $cb = $w->{ev}{$name}) { + $_->($w, @$args) for @$cb; } } @@ -140,10 +112,10 @@ }; cf::register_exticmd w_r => sub { - my ($ns, $pkt) = @_; + my ($ns, $rid, $res) = @_; - if (my $cb = delete $ns->{widget_return}{$pkt->{rid}}) { - $cb->(@{$pkt->{res} || [] }); + if (my $cb = delete $ns->{widget_return}{$rid}) { + $cb->(@$res); } () @@ -157,10 +129,10 @@ my $ws = bless { id => $id, ns => $self, - w => {}, + _w => {}, }, "ext::widget::set"; - $ws->msg (ws_n => id => $id); + $ws->msg (ws_n => $id); $ws } @@ -176,18 +148,18 @@ sub destroy { my ($self) = @_; - $self->msg (ws_d => id => $self->{id}); + $self->msg (ws_d => $self->{id}); delete $self->{ns}; $_->destroy for values %{ $self->{w} }; } sub msg { - my ($self, $type, %msg) = @_; + my ($self, @msg) = @_; if (my $ns = shift->{ns}) { - $msg{msgtype} = $type; - $ns->send_packet ("ext " . $ns->{json_coder}->encode (\%msg)); + warn "msg " . $ns->{json_coder}->encode (\@msg) if $DEBUG;#d# + $ns->send_packet ("ext " . $ns->{json_coder}->encode (\@msg)); } } @@ -196,10 +168,11 @@ my $id = ++$self->{ns}{id}; - my $proxy = $self->{w}{$id} = bless { + my $proxy = bless { id => $id, }, "ext::widget::proxy"; + Scalar::Util::weaken ($self->{_w}{$id} = $proxy); Scalar::Util::weaken ($proxy->{ws} = $self); Scalar::Util::weaken ($proxy->{ns} = $self->{ns}); Scalar::Util::weaken ($self->{ns}{widget}{$id} = $proxy); @@ -210,10 +183,10 @@ } $self->msg (ws_c => - ws => $self->{w}{id}, - id => $id, - class => $class, - args => \%args, + $self->{id}, + $id, + $class, + \%args, ); $proxy @@ -229,30 +202,26 @@ delete $self->{ns}{widget}{$self->{id}}; if (my $ws = $self->{ws}) { - delete $ws->{w}{$self->{id}}; - $self->msg (w_c => name => "destroy"); + $self->msg (w_c => 0, "destroy"); + delete $ws->{_w}{$self->{id}}; } } sub msg { - my ($self, $type, %msg) = @_; + my ($self, $type, @arg) = @_; if (my $ws = $self->{ws}) { - $ws->msg ($type, - %msg, - id => $self->{id}, - ); + $ws->msg ($type, $self->{id}, @arg); } } sub msg_cb { - my ($self, $cb, $type, %msg) = @_; + my ($self, $cb, $type, @arg) = @_; if (my $ws = $self->{ws}) { - my $rid = ++$ws->{ns}{id}; - $self->msg ($type, %msg, rid => $rid); + $self->msg ($type, $rid, @arg); if ($cb) { $ws->{ns}{widget_return}{$rid} = $cb; @@ -275,19 +244,19 @@ } sub set { - my ($self, $member, $value) = @_; + my ($self, @kv) = @_; - $self->msg (w_s => name => $member, value => $value); + $self->msg (w_s => \@kv); } sub get { my ($self, $member, $cb) = @_; - $self->msg_cb ($cb, w_g => name => $member); + $self->msg_cb ($cb, w_g => [$member]); } sub TO_JSON { - { __widget_ref__ => $_[0]{id} } + { __w_ => $_[0]{id} } } our $AUTOLOAD; @@ -298,7 +267,7 @@ my $self = shift; - $self->msg (w_c => name => $AUTOLOAD, args => \@_); + $self->msg (w_c => 0, $AUTOLOAD, \@_); () }