--- deliantra/Deliantra-Client/DC/UI.pm 2006/06/05 03:48:49 1.286
+++ deliantra/Deliantra-Client/DC/UI.pm 2006/06/12 12:28:06 1.301
@@ -317,8 +317,8 @@
sub move_abs {
my ($self, $x, $y, $z) = @_;
- $self->{x} = List::Util::max 0, int $x;
- $self->{y} = List::Util::max 0, int $y;
+ $self->{x} = List::Util::max 0, List::Util::min $self->{root}{w} - $self->{w}, int $x;
+ $self->{y} = List::Util::max 0, List::Util::min $self->{root}{h} - $self->{h}, int $y;
$self->{z} = $z if defined $z;
$self->update;
@@ -1556,8 +1556,8 @@
$self->{layout} = new CFClient::Layout if $self->{layout}->is_rgba;
$self->{layout}->set_text ($text);
- delete $self->{req_h};
+ delete $self->{size_req};
$self->realloc;
$self->update;
}
@@ -1572,8 +1572,8 @@
$self->{layout} = new CFClient::Layout $rgba if $self->{layout}->is_rgba != $rgba;
$self->{layout}->set_markup ($markup);
- delete $self->{req_h};
+ delete $self->{size_req};
$self->realloc;
$self->update;
}
@@ -1581,9 +1581,7 @@
sub size_request {
my ($self) = @_;
- if (exists $self->{req_h}) {
- @$self{qw(req_w req_h)}
- } else {
+ $self->{size_req} ||= do {
$self->{layout}->set_font ($self->{font}) if $self->{font};
$self->{layout}->set_width ($self->{max_w} || -1);
$self->{layout}->set_ellipsise ($self->{ellipsise});
@@ -1602,8 +1600,10 @@
$h = List::Util::max $h, $h2;
}
- ($w, $h)
- }
+ [$w, $h]
+ };
+
+ @{ $self->{size_req} }
}
sub size_allocate {
@@ -1624,6 +1624,14 @@
$self->realloc;
}
+sub reconfigure {
+ my ($self) = @_;
+
+ delete $self->{size_req};
+
+ $self->SUPER::reconfigure;
+}
+
sub _draw {
my ($self) = @_;
@@ -1651,13 +1659,17 @@
};
glEnable GL_TEXTURE_2D;
- glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE;
+
+ my $w = List::Util::min $self->{w} + 4, $tex->{w};
+ my $h = List::Util::min $self->{h} + 2, $tex->{h};
if ($tex->{format} == GL_ALPHA) {
+ glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE;
glColor @{$self->{fg}};
- $tex->draw_quad_alpha ($self->{ox}, $self->{oy});
+ $tex->draw_quad_alpha ($self->{ox}, $self->{oy}, $w, $h);
} else {
- $tex->draw_quad_alpha_premultiplied ($self->{ox}, $self->{oy});
+ glTexEnv GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE;
+ $tex->draw_quad_alpha_premultiplied ($self->{ox}, $self->{oy}, $w, $h);
}
glDisable GL_TEXTURE_2D;
@@ -1684,6 +1696,7 @@
valign => 0,
can_events => 1,
#text => ...
+ #hidden => "*",
@_
)
}
@@ -1700,7 +1713,7 @@
$text =~ s/./*/g if $self->{hidden};
$self->{layout}->set_text ("$text ");
- delete $self->{req_h};
+ delete $self->{size_req};
$self->_emit (changed => $self->{text});
@@ -2296,8 +2309,10 @@
($range, $self->{range}) = ($self->{range}, $range);
- $self->update
- if "@$range" ne "@{$self->{range}}";
+ if ("@$range" ne "@{$self->{range}}") {
+ $self->update;
+ $self->set_value ($self->{range}[0]);
+ }
}
sub set_value {
@@ -2454,7 +2469,7 @@
#############################################################################
-package CFClient::UI::TextView;
+package CFClient::UI::TextScroller;
our @ISA = CFClient::UI::HBox::;
@@ -2466,6 +2481,7 @@
my $self = $class->SUPER::new (
fontsize => 1,
can_events => 0,
+ indent => 0,
#font => default_font
@_,
@@ -2498,6 +2514,7 @@
$self->{layout}->set_font ($self->{font}) if $self->{font};
$self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE);
$self->{layout}->set_width ($self->{children}[0]{w});
+ $self->{layout}->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent});
$self->reflow;
}
@@ -2509,6 +2526,7 @@
$layout->set_height ($self->{fontsize} * $::FONTSIZE);
$layout->set_width ($self->{children}[0]{w} - $indent);
+ $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent});
$layout->set_markup ($text);
$layout->size
@@ -2557,7 +2575,7 @@
delete $self->{texture};
- $ROOT->on_post_alloc ($self, sub {
+ $ROOT->on_post_alloc ($self => sub {
my ($W, $H) = @{$self->{children}[0]}{qw(w h)};
if (delete $self->{need_reflow}) {
@@ -2570,6 +2588,7 @@
for (@{$self->{par}}) {
if (1 || $_->[0] >= $W) { # TODO: works,but needs reconfigure etc. support
$layout->set_width ($W - $_->[3]);
+ $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent});
$layout->set_markup ($_->[4]);
my ($w, $h) = $layout->size;
$_->[0] = $w + $_->[3];
@@ -2582,7 +2601,7 @@
$self->{height} = $height;
$self->{children}[1]->set_range ([$height, 0, $height, $H, 1]);
-
+
delete $self->{texture};
}
@@ -2611,6 +2630,7 @@
if ($y0 < $y + $h && $y < $y1) {
$layout->set_foreground (@{ $par->[2] });
$layout->set_width ($W - $par->[3]);
+ $layout->set_indent ($self->{fontsize} * $::FONTSIZE * $self->{indent});
$layout->set_markup ($par->[4]);
my ($w, $h, $data, $format, $internalformat) = $layout->render;
@@ -2735,6 +2755,9 @@
. "visible $widget->{visible}";
}
+ $tooltip =~ s/^\n+//;
+ $tooltip =~ s/\n+$//;
+
$self->add (new CFClient::UI::Label
markup => $tooltip,
max_w => ($widget->{tooltip_width} || 0.25) * $::WIDTH,
@@ -2771,7 +2794,7 @@
my ($x, $y) = $widget->coord2global ($widget->{w}, 0);
($x, $y) = $widget->coord2global (-$self->{w}, 0)
- if $x + $self->{w} > $::WIDTH;
+ if $x + $self->{w} > $self->{root}{w};
$self->move_abs ($x, $y);
});
@@ -2913,14 +2936,15 @@
$self->add ($self->{vbox} = new CFClient::UI::VBox);
for my $item (@{ $self->{items} }) {
- my ($widget, $cb) = @$item;
+ my ($widget, $cb, $tooltip) = @$item;
# handle various types of items, only text for now
if (!ref $widget) {
$widget = new CFClient::UI::Label
can_hover => 1,
can_events => 1,
- text => $widget;
+ markup => $widget,
+ tooltip => $tooltip
}
$self->{item}{$widget} = $item;
@@ -3081,6 +3105,62 @@
#############################################################################
+package CFClient::UI::Combobox;
+
+use utf8;
+
+our @ISA = CFClient::UI::Button::;
+
+sub new {
+ my $class = shift;
+
+ my $self = $class->SUPER::new (
+ options => [], # [value, title, longdesc], ...
+ value => undef,
+ @_,
+ );
+
+ $self->_set_value ($self->{value});
+
+ $self
+}
+
+sub button_down {
+ my ($self, $ev) = @_;
+
+ my @menu_items;
+
+ for (@{ $self->{options} }) {
+ my ($value, $title, $tooltip) = @$_;
+
+ push @menu_items, [$tooltip || $title, sub { $self->set_value ($value) }];
+ }
+
+ CFClient::UI::Menu->new (items => \@menu_items)->popup ($ev);
+}
+
+sub _set_value {
+ my ($self, $value) = @_;
+
+ my ($item) = grep $_->[0] eq $value, @{ $self->{options} }
+ or return;
+
+ $self->{value} = $item->[0];
+ $self->set_markup ("$item->[1] ⇓");
+ $self->set_tooltip ($item->[2]);
+}
+
+sub set_value {
+ my ($self, $value) = @_;
+
+ return unless $self->{value} ne $value;
+
+ $self->_set_value ($value);
+ $self->_emit (changed => $value);
+}
+
+#############################################################################
+
package CFClient::UI::Statusbox;
our @ISA = CFClient::UI::VBox::;
@@ -3185,7 +3265,7 @@
$item->{count} = 1;
$item->{text} = $item->{tooltip} = $text;
}
- $item->{id} = ++$self->{id};
+ $item->{id} += 0.2;#d#
$item->{timeout} = $timeout;
delete $item->{label};
} else {
@@ -3477,43 +3557,107 @@
)
}
-# XXX: Do sorting? Argl...
-sub add_spell {
- my ($self, $spell) = @_;
- $self->{spells}->{$spell->{name}} = $spell;
+my $TOOLTIP_ALL = "\n\nLeft click - ready spell\nMiddle click - invoke spell\nRight click - further options";
- $self->add (0, $self->{tbl_idx}, new CFClient::UI::Face
- face => $spell->{face},
- can_hover => 1,
- can_events => 1,
- tooltip => $spell->{message});
+my @TOOLTIP_NAME = (align => -1, can_events => 1, can_hover => 1, tooltip =>
+ "Name. The name of the spell.$TOOLTIP_ALL");
+my @TOOLTIP_SKILL = (align => -1, can_events => 1, can_hover => 1, tooltip =>
+ "Skill. The skill (or magic school) required to be able to attempt casting this spell.$TOOLTIP_ALL");
+my @TOOLTIP_LVL = (align => 1, can_events => 1, can_hover => 1, tooltip =>
+ "Level. Minimum level the caster needs in the associated skill to be able to attempt casting this spell.$TOOLTIP_ALL");
+my @TOOLTIP_SP = (align => 1, can_events => 1, can_hover => 1, tooltip =>
+ "Spell points / Grace points. Amount of spell or grace points used by each invocation.$TOOLTIP_ALL");
+my @TOOLTIP_DMG = (align => 1, can_events => 1, can_hover => 1, tooltip =>
+ "Damage. The amount of damage the spell deals when it hits.$TOOLTIP_ALL");
- $self->add (1, $self->{tbl_idx}, new CFClient::UI::Label
- text => $spell->{name},
- can_hover => 1,
- can_events => 1,
- tooltip => $spell->{message},
- expand => 1);
+sub rebuild_spell_list {
+ my ($self) = @_;
- $self->add (2, $self->{tbl_idx}, new CFClient::UI::Label
- text => (sprintf "lvl: %2d sp: %2d dmg: %2d",
- $spell->{level}, ($spell->{mana} || $spell->{grace}), $spell->{damage}),
- expand => 1);
-
- $self->add (3, $self->{tbl_idx}++, new CFClient::UI::Button
- text => "bind to key",
- on_activate => sub { $::BIND_EDITOR->do_quick_binding (["cast $spell->{name}"]) });
+ $CFClient::UI::ROOT->on_refresh ($self => sub {
+ $self->clear;
+
+ $self->add (1, 0, new CFClient::UI::Label text => "Spell Name", @TOOLTIP_NAME);
+ $self->add (2, 0, new CFClient::UI::Label text => "Skill", @TOOLTIP_SKILL);
+ $self->add (3, 0, new CFClient::UI::Label text => "Lvl" , @TOOLTIP_LVL);
+ $self->add (4, 0, new CFClient::UI::Label text => "Sp/Gp", @TOOLTIP_SP);
+ $self->add (5, 0, new CFClient::UI::Label text => "Dmg" , @TOOLTIP_DMG);
+
+ my $row = 0;
+
+ for (sort { $a cmp $b } keys %{ $self->{spell} }) {
+ my $spell = $self->{spell}{$_};
+
+ $row++;
+
+ my $spell_cb = sub {
+ my ($widget, $ev) = @_;
+
+ if ($ev->{button} == 1) {
+ $::CONN->user_send ("cast $spell->{name}");
+ } elsif ($ev->{button} == 2) {
+ $::CONN->user_send ("invoke $spell->{name}");
+ } elsif ($ev->{button} == 3) {
+ (new CFClient::UI::Menu
+ items => [
+ ["bind cast $spell->{name} to a key" => sub { $::BIND_EDITOR->do_quick_binding (["cast $spell->{name}"]) }],
+ ["bind invoke $spell->{name} to a key" => sub { $::BIND_EDITOR->do_quick_binding (["invoke $spell->{name}"]) }],
+ ],
+ )->popup ($ev);
+ } else {
+ return 0;
+ }
+
+ 1
+ };
+
+ my $tooltip = "$spell->{message}$TOOLTIP_ALL";
+
+ #TODO: add path info to tooltip
+ #$self->add (6, $row, new CFClient::UI::Label text => $spell->{path});
+
+ $self->add (0, $row, new CFClient::UI::Face
+ face => $spell->{face},
+ can_hover => 1,
+ can_events => 1,
+ tooltip => $tooltip,
+ on_button_down => $spell_cb,
+ );
+
+ $self->add (1, $row, new CFClient::UI::Label
+ expand => 1,
+ text => $spell->{name},
+ can_hover => 1,
+ can_events => 1,
+ tooltip => $tooltip,
+ on_button_down => $spell_cb,
+ );
+
+ $self->add (2, $row, new CFClient::UI::Label text => $::CONN->{skill_info}{$spell->{skill}}, @TOOLTIP_SKILL);
+ $self->add (3, $row, new CFClient::UI::Label text => $spell->{level}, @TOOLTIP_LVL);
+ $self->add (4, $row, new CFClient::UI::Label text => $spell->{mana} || $spell->{grace}, @TOOLTIP_SP);
+ $self->add (5, $row, new CFClient::UI::Label text => $spell->{damage}, @TOOLTIP_DMG);
+ }
+ });
}
-sub rebuild_spell_list {
- my ($self) = @_;
- $self->{tbl_idx} = 0;
- $self->add_spell ($_) for values %{$self->{spells}};
+sub add_spell {
+ my ($self, $spell) = @_;
+
+ $self->{spell}->{$spell->{name}} = $spell;
+ $self->rebuild_spell_list;
}
sub remove_spell {
my ($self, $spell) = @_;
- delete $self->{spells}->{$spell->{name}};
+
+ delete $self->{spell}->{$spell->{name}};
+ $self->rebuild_spell_list;
+}
+
+sub clear_spells {
+ my ($self) = @_;
+
+ $self->{spell} = {};
$self->rebuild_spell_list;
}