--- deliantra/Deliantra-Client/DC/UI.pm 2006/06/24 00:24:09 1.313
+++ deliantra/Deliantra-Client/DC/UI.pm 2006/07/23 04:37:51 1.330
@@ -81,11 +81,24 @@
if $FOCUS;
}
+sub check_hover {
+ my ($widget) = @_;
+
+ if ($widget != $HOVER) {
+ my $hover = $HOVER; $HOVER = $widget;
+
+ $hover->update if $hover && $hover->{can_hover};
+ $HOVER->update if $HOVER && $HOVER->{can_hover};
+
+ $TOOLTIP_WATCHER->start;
+ }
+}
+
sub feed_sdl_button_down_event {
my ($ev) = @_;
my ($x, $y) = ($ev->{x}, $ev->{y});
- if (!$BUTTON_STATE) {
+ unless ($BUTTON_STATE) {
my $widget = $ROOT->find_widget ($x, $y);
$GRAB = $widget;
@@ -96,26 +109,34 @@
$BUTTON_STATE |= 1 << ($ev->{button} - 1);
- $GRAB->emit (button_down => $ev, $GRAB->coord2local ($x, $y))
- if $GRAB;
+ if ($GRAB) {
+ if ($ev->{button} == 4 || $ev->{button} == 5) {
+ # mousewheel
+ $ev->{dx} = 0;
+ $ev->{dy} = $ev->{button} * 2 - 9;
+ $GRAB->emit (mouse_wheel => $ev);
+ } else {
+ $GRAB->emit (button_down => $ev)
+ }
+ }
}
sub feed_sdl_button_up_event {
my ($ev) = @_;
- my ($x, $y) = ($ev->{x}, $ev->{y});
- my $widget = $GRAB || $ROOT->find_widget ($x, $y);
+ my $widget = $GRAB || $ROOT->find_widget ($ev->{x}, $ev->{y});
$BUTTON_STATE &= ~(1 << ($ev->{button} - 1));
- $GRAB->emit (button_up => $ev, $GRAB->coord2local ($x, $y))
- if $GRAB;
+ $GRAB->emit (button_up => $ev)
+ if $GRAB && $ev->{button} != 4 && $ev->{button} != 5;
- if (!$BUTTON_STATE) {
+ unless ($BUTTON_STATE) {
my $grab = $GRAB; undef $GRAB;
$grab->update if $grab;
$GRAB->update if $GRAB;
+ check_hover $widget;
$TOOLTIP_WATCHER->cb->();
}
}
@@ -126,16 +147,9 @@
my $widget = $GRAB || $ROOT->find_widget ($x, $y);
- if ($widget != $HOVER) {
- my $hover = $HOVER; $HOVER = $widget;
-
- $hover->update if $hover && $hover->{can_hover};
- $HOVER->update if $HOVER && $HOVER->{can_hover};
-
- $TOOLTIP_WATCHER->start;
- }
+ check_hover $widget;
- $HOVER->emit (mouse_motion => $ev, $HOVER->coord2local ($x, $y))
+ $HOVER->emit (mouse_motion => $ev)
if $HOVER;
}
@@ -195,6 +209,14 @@
#############################################################################
+package CFClient::UI::Event;
+
+sub xy {
+ $_[1]->coord2local ($_[0]{x}, $_[0]{y})
+}
+
+#############################################################################
+
package CFClient::UI::Base;
use strict;
@@ -425,10 +447,9 @@
return if $FOCUS == $self;
return unless $self->{can_focus};
- my $focus = $FOCUS; $FOCUS = $self;
+ $FOCUS = $self;
- $focus->update if $focus;
- $FOCUS->update;
+ $self->update;
0
}
@@ -438,9 +459,9 @@
return unless $FOCUS == $self;
- my $focus = $FOCUS; undef $FOCUS;
+ undef $FOCUS;
- $focus->update if $focus; #?
+ $self->update;
$::MAPWIDGET->grab_focus #d# focus mapwidget if no other widget has focus
unless $FOCUS;
@@ -451,20 +472,22 @@
sub grab_focus {
my ($self) = @_;
+ $FOCUS->emit ("focus_out") if $FOCUS;
$self->emit ("focus_in");
}
-sub invoke_mouse_motion { 1 }
-sub invoke_button_up { 1 }
-sub invoke_key_down { 1 }
-sub invoke_key_up { 1 }
+sub invoke_mouse_motion { 0 }
+sub invoke_button_up { 0 }
+sub invoke_key_down { 0 }
+sub invoke_key_up { 0 }
+sub invoke_mouse_wheel { 0 }
sub invoke_button_down {
my ($self, $ev, $x, $y) = @_;
$self->grab_focus;
- 1
+ 0
}
sub connect {
@@ -476,10 +499,17 @@
sub emit {
my ($self, $signal, @args) = @_;
+ my @append
+ = ref $args[0] && $args[0]->isa ("CFClient::UI::Event")
+ ? $args[0]->xy ($self)
+ : ();
+
+ #warn +(caller(1))[3] . "emit $signal on $self (parent $self->{parent})\n";#d#
+
#d##TODO# stop propagating at first true, do not use sum
- (List::Util::sum map $_->($self, @args), @{$self->{signal_cb}{$signal} || []}) # before
- || ($self->can ("invoke_$signal") || sub { 1 })->($self, @args) # closure
- || ($self->{parent} && $self->{parent}->emit ($signal, @args)) # parent
+ (List::Util::sum map $_->($self, @args, @append), @{$self->{signal_cb}{$signal} || []}) # before
+ || ($self->can ("invoke_$signal") || sub { 1 })->($self, @args, @append) # closure
+ || ($self->{parent} && $self->{parent}->emit ($signal, @args)) # parent
}
sub find_widget {
@@ -589,6 +619,8 @@
sub DESTROY {
my ($self) = @_;
+ return if CFClient::in_destruct;
+
delete $WIDGET{$self+0};
eval { $self->destroy };
@@ -977,8 +1009,9 @@
;
$self = $class->SUPER::new (
- vp => (new CFClient::UI::ViewPort expand => 1),
- slider => $slider,
+ vp => (new CFClient::UI::ViewPort expand => 1),
+ can_events => 1,
+ slider => $slider,
%arg,
);
@@ -988,34 +1021,46 @@
$self
}
+#TODO# update range on size_allocate depending on child
+
sub add {
my ($self, $widget) = @_;
$self->{vp}->add ($self->{child} = $widget);
}
+sub invoke_mouse_wheel {
+ my ($self, $ev) = @_;
+
+ return 0 unless $ev->{dy}; # only vertical movements
+
+ $self->{slider}->emit (mouse_wheel => $ev);
+
+ 1
+}
+
+sub update_slider {
+ my ($self) = @_;
+
+ $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $self->{vp}->child->{h}, $self->{vp}{h}, 1]);
+}
+
sub update {
my ($self) = @_;
$self->SUPER::update;
- # todo: overwrite size_allocate of child
- my $child = $self->{vp}->child;
- $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $child->{h}, $self->{vp}{h}, 1]);
+ $self->update_slider;
}
sub invoke_size_allocate {
my ($self, $w, $h) = @_;
- my $child = $self->{vp}->child;
- $self->{slider}->set_range ([$self->{slider}{range}[0], 0, $child->{h}, $self->{vp}{h}, 1]);
+ $self->update_slider;
$self->SUPER::invoke_size_allocate ($w, $h)
}
-#TODO# update range on size_allocate depending on child
-# update viewport offset on scroll
-
#############################################################################
package CFClient::UI::Frame;
@@ -1080,8 +1125,8 @@
border_bg => [1, 1, 1, 1],
border => 0.6,
can_events => 1,
- min_w => 16,
- min_h => 16,
+ min_w => 64,
+ min_h => 32,
%arg,
);
@@ -1096,7 +1141,7 @@
$self->{close_button} =
new CFClient::UI::ImageButton
path => 'x1_close.png',
- on_activate => sub { $self->hide };
+ on_activate => sub { $self->emit ("delete") };
$self->CFClient::UI::Container::add ($self->{close_button});
}
@@ -1155,6 +1200,14 @@
1
}
+sub invoke_delete {
+ my ($self) = @_;
+
+ $self->hide;
+
+ 1
+}
+
sub invoke_button_down {
my ($self, $ev, $x, $y) = @_;
@@ -1583,7 +1636,6 @@
return if $self->{text} eq "T$text";
$self->{text} = "T$text";
- $self->{layout} = new CFClient::Layout if $self->{layout}->is_rgba;
$self->{layout}->set_text ($text);
delete $self->{size_req};
@@ -1599,7 +1651,6 @@
my $rgba = $markup =~ /span.*(?:foreground|background)/;
- $self->{layout} = new CFClient::Layout $rgba if $self->{layout}->is_rgba != $rgba;
$self->{layout}->set_markup ($markup);
delete $self->{size_req};
@@ -1621,6 +1672,7 @@
if (exists $self->{template}) {
$self->{template}->set_font ($self->{font}) if $self->{font};
+ $self->{template}->set_width ($self->{max_w} || -1);
$self->{template}->set_height ($self->{fontsize} * $::FONTSIZE);
my ($w2, $h2) = $self->{template}->size;
@@ -1654,6 +1706,7 @@
my ($self, $fontsize) = @_;
$self->{fontsize} = $fontsize;
+ delete $self->{size_req};
delete $self->{texture};
$self->realloc;
@@ -1663,6 +1716,7 @@
my ($self) = @_;
delete $self->{size_req};
+ delete $self->{texture};
$self->SUPER::reconfigure;
}
@@ -1672,7 +1726,7 @@
$self->SUPER::_draw; # draw background, if applicable
- my $tex = $self->{texture} ||= do {
+ my $size = $self->{texture} ||= do {
$self->{layout}->set_foreground (@{$self->{fg}});
$self->{layout}->set_font ($self->{font}) if $self->{font};
$self->{layout}->set_width ($self->{w});
@@ -1680,34 +1734,23 @@
$self->{layout}->set_single_paragraph_mode ($self->{ellipsise});
$self->{layout}->set_height ($self->{fontsize} * $::FONTSIZE);
- new_from_layout CFClient::Texture $self->{layout}
+ [$self->{layout}->size]
};
unless (exists $self->{ox}) {
$self->{ox} = int ($self->{align} < 0 ? $self->{padding_x}
- : $self->{align} > 0 ? $self->{w} - $tex->{w} - $self->{padding_x}
- : ($self->{w} - $tex->{w}) * 0.5);
+ : $self->{align} > 0 ? $self->{w} - $size->[0] - $self->{padding_x}
+ : ($self->{w} - $size->[0]) * 0.5);
$self->{oy} = int ($self->{valign} < 0 ? $self->{padding_y}
- : $self->{valign} > 0 ? $self->{h} - $tex->{h} - $self->{padding_y}
- : ($self->{h} - $tex->{h}) * 0.5);
+ : $self->{valign} > 0 ? $self->{h} - $size->[1] - $self->{padding_y}
+ : ($self->{h} - $size->[1]) * 0.5);
};
- glEnable GL_TEXTURE_2D;
-
- my $w = List::Util::min $self->{w} + 4, $tex->{w};
- my $h = List::Util::min $self->{h} + 2, $tex->{h};
+ my $w = List::Util::min $self->{w} + 4, $size->[0];
+ my $h = List::Util::min $self->{h} + 2, $size->[1];
- 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}, $w, $h);
- } else {
- 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;
+ $self->{layout}->render ($self->{ox}, $self->{oy});
}
#############################################################################
@@ -1828,8 +1871,8 @@
# byte-index to char-index
my $text = $self->{text};
- utf8::encode $text;
- $self->{cursor} = length substr $text, 0, $idx;
+ utf8::encode $text; $text = substr $text, 0, $idx; utf8::decode $text;
+ $self->{cursor} = length $text;
$self->_set_text ($self->{text});
$self->update;
@@ -2059,13 +2102,20 @@
(6) x 2
}
+sub toggle {
+ my ($self) = @_;
+
+ $self->{state} = !$self->{state};
+ $self->emit (changed => $self->{state});
+ $self->update;
+}
+
sub invoke_button_down {
my ($self, $ev, $x, $y) = @_;
if ($x >= $self->{padding_x} && $x < $self->{w} - $self->{padding_x}
&& $y >= $self->{padding_y} && $y < $self->{h} - $self->{padding_y}) {
- $self->{state} = !$self->{state};
- $self->emit (changed => $self->{state});
+ $self->toggle;
} else {
return 0
}
@@ -2111,10 +2161,10 @@
@_,
);
- $self->{path}
- or Carp::croak "required attribute 'path' not set";
+ $self->{path} || $self->{tex}
+ or Carp::croak "'path' or 'tex' attributes required";
- $self->{tex} = $texture_cache{$self->{path}} ||=
+ $self->{tex} ||= $texture_cache{$self->{path}} ||=
new_from_file CFClient::Texture CFClient::find_rcfile $self->{path}, mipmap => 1;
Scalar::Util::weaken $texture_cache{$self->{path}};
@@ -2246,6 +2296,9 @@
my $h1 = $self->{h} * (1 - $ycut1);
my $h2 = $self->{h} * (1 - $ycut2);
+ my $h3 = $self->{h};
+
+ $_ = $_ * (284-4)/288 + 4/288 for ($h1, $h2, $h3);
glEnable GL_BLEND;
glBlendFuncSeparate GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA,
@@ -2274,8 +2327,8 @@
glBindTexture GL_TEXTURE_2D, $t3->{name};
glBegin GL_QUADS;
glTexCoord 0 , $t3->{t} * (1 - $ycut2); glVertex 0 , $h2;
- glTexCoord 0 , $t3->{t}; glVertex 0 , $self->{h};
- glTexCoord $t3->{s}, $t3->{t}; glVertex $w, $self->{h};
+ glTexCoord 0 , $t3->{t}; glVertex 0 , $h3;
+ glTexCoord $t3->{s}, $t3->{t}; glVertex $w, $h3;
glTexCoord $t3->{s}, $t3->{t} * (1 - $ycut2); glVertex $w, $h2;
glEnd;
}
@@ -2441,6 +2494,16 @@
1
}
+sub invoke_mouse_wheel {
+ my ($self, $ev) = @_;
+
+ my $delta = $self->{vertical} ? $ev->{dy} : $ev->{dx};
+
+ $self->set_value ($self->{range}[0] + $delta * $self->{range}[3] * 0.1);
+
+ ! ! $delta
+}
+
sub update {
my ($self) = @_;
@@ -2549,12 +2612,12 @@
my $self = $class->SUPER::new (
fontsize => 1,
- can_events => 0,
+ can_events => 1,
indent => 0,
#font => default_font
@_,
- layout => (new CFClient::Layout 1),
+ layout => (new CFClient::Layout),
par => [],
height => 0,
children => [
@@ -2601,6 +2664,16 @@
$self->SUPER::invoke_size_allocate ($w, $h)
}
+sub invoke_mouse_wheel {
+ my ($self, $ev) = @_;
+
+ return 0 unless $ev->{dy}; # only vertical movements
+
+ $self->{children}[1]->emit (mouse_wheel => $ev);
+
+ 1
+}
+
sub get_layout {
my ($self, $para) = @_;
@@ -2725,10 +2798,6 @@
my $y = 0;
- glEnable GL_BLEND;
- #TODO# not correct in windows where rgba is forced off
- glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA;
-
for my $para (@{$self->{par}}) {
my $h = $para->{h};
@@ -2736,15 +2805,11 @@
my $layout = $self->get_layout ($para);
- my ($w, $h, $data, $format, $internalformat) = $layout->render;
-
- glRasterPos $para->{indent}, $y - $y0;
- glDrawPixels $w, $h, $format, GL_UNSIGNED_BYTE, $data;
+ $layout->render ($para->{indent}, $y - $y0);
if (my @w = @{ $para->{widget} }) {
my @s = $layout->get_shapes;
- glDisable GL_BLEND;
for (@w) {
my ($dx, $dy) = splice @s, 0, 2, ();
@@ -2753,15 +2818,11 @@
$_->draw;
}
- glEnable GL_BLEND;
- glBlendFunc GL_ONE, GL_ONE_MINUS_SRC_ALPHA;
}
}
$y += $h;
}
-
- glDisable GL_BLEND;
};
});
}
@@ -3067,11 +3128,26 @@
# handle various types of items, only text for now
if (!ref $widget) {
- $widget = new CFClient::UI::Label
- can_hover => 1,
- can_events => 1,
- markup => $widget,
- tooltip => $tooltip
+ if ($widget =~ /\t/) {
+ my ($left, $right) = split /\t/, $widget, 2;
+
+ $widget = new CFClient::UI::HBox
+ can_hover => 1,
+ can_events => 1,
+ tooltip => $tooltip,
+ children => [
+ (new CFClient::UI::Label markup => $left, expand => 1),
+ (new CFClient::UI::Label markup => $right, align => +1),
+ ],
+ ;
+
+ } else {
+ $widget = new CFClient::UI::Label
+ can_hover => 1,
+ can_events => 1,
+ markup => $widget,
+ tooltip => $tooltip;
+ }
}
$self->{item}{$widget} = $item;
@@ -3150,6 +3226,12 @@
if @{ $self->{children} };
}
+sub get_current_page {
+ my ($self) = @_;
+
+ $self->{current}
+}
+
sub set_current_page {
my ($self, $page_or_widget) = @_;
@@ -3225,6 +3307,12 @@
$self->{multiplexer}->add ($widget);
}
+sub get_current_page {
+ my ($self) = @_;
+
+ $self->{multiplexer}->get_current_page
+}
+
sub set_current_page {
my ($self, $page) = @_;
@@ -3410,7 +3498,9 @@
};
}
- $self->reorder;
+ $ROOT->on_refresh (reorder => sub {
+ $self->reorder;
+ });
}
sub reconfigure {
@@ -3435,13 +3525,13 @@
package CFClient::UI::Inventory;
-our @ISA = CFClient::UI::ScrolledWindow::;
+our @ISA = CFClient::UI::Table::;
sub new {
my $class = shift;
my $self = $class->SUPER::new (
- child => (new CFClient::UI::Table col_expand => [0, 1, 0]),
+ col_expand => [0, 1, 0],
@_,
);
@@ -3451,13 +3541,13 @@
sub set_items {
my ($self, $items) = @_;
- $self->{child}->clear;
+ $self->clear;
return unless $items;
my @items = sort {
($a->{type} <=> $b->{type})
or ($a->{name} cmp $b->{name})
- } @$items;
+ } values %$items;
$self->{real_items} = \@items;
@@ -3465,9 +3555,9 @@
for my $item (@items) {
CFClient::Item::update_widgets $item;
- $self->{child}->add (0, $row, $item->{face_widget});
- $self->{child}->add (1, $row, $item->{desc_widget});
- $self->{child}->add (2, $row, $item->{weight_widget});
+ $self->add (0, $row, $item->{face_widget});
+ $self->add (1, $row, $item->{desc_widget});
+ $self->add (2, $row, $item->{weight_widget});
$row++;
}
@@ -3475,214 +3565,6 @@
#############################################################################
-package CFClient::UI::BindEditor;
-
-our @ISA = CFClient::UI::FancyFrame::;
-
-sub new {
- my $class = shift;
-
- my $self = $class->SUPER::new (binding => [], commands => [], @_);
-
- $self->add (my $vb = new CFClient::UI::VBox);
-
-
- $vb->add ($self->{rec_btn} = new CFClient::UI::Button
- text => "start recording",
- tooltip => "Start/Stops recording of actions."
- ."All subsequent actions after the recording started will be captured."
- ."The actions are displayed after the record was stopped."
- ."To bind the action you have to click on the 'Bind' button",
- on_activate => sub {
- unless ($self->{recording}) {
- $self->start;
- } else {
- $self->stop;
- }
- });
-
- $vb->add (new CFClient::UI::Label text => "Actions:");
- $vb->add ($self->{cmdbox} = new CFClient::UI::VBox);
-
- $vb->add (new CFClient::UI::Label text => "Bound to: ");
- $vb->add (my $hb = new CFClient::UI::HBox);
- $hb->add ($self->{keylbl} = new CFClient::UI::Label expand => 1);
- $hb->add (new CFClient::UI::Button
- text => "bind",
- tooltip => "This opens a query where you have to press the key combination to bind the recorded actions",
- on_activate => sub {
- $self->ask_for_bind;
- });
-
- $vb->add (my $hb = new CFClient::UI::HBox);
- $hb->add (new CFClient::UI::Button
- text => "ok",
- expand => 1,
- tooltip => "This closes the binding editor and saves the binding",
- on_activate => sub {
- $self->hide;
- $self->commit;
- });
-
- $hb->add (new CFClient::UI::Button
- text => "cancel",
- expand => 1,
- tooltip => "This closes the binding editor without saving",
- on_activate => sub {
- $self->hide;
- $self->{binding_cancel}->()
- if $self->{binding_cancel};
- });
-
- $self->update_binding_widgets;
-
- $self
-}
-
-sub cfg_bind {
- my ($self, $mod, $sym, $cmds) = @_;
- $::CFG->{profile}{default}{bindings}{$mod}{$sym} = $cmds;
- ::update_bindings ();
-}
-
-sub cfg_unbind {
- my ($self, $mod, $sym, $cmds) = @_;
- delete $::CFG->{profile}{default}{bindings}{$mod}{$sym};
- ::update_bindings ();
-}
-
-sub commit {
- my ($self) = @_;
- my ($mod, $sym, $cmds) = $self->get_binding;
- if ($sym != 0 && @$cmds > 0) {
- $::STATUSBOX->add ("Bound actions to '".CFClient::Binder::keycombo_to_name ($mod, $sym)
- ."'. Don't forget 'Save Config'!");
- $self->{binding_change}->($mod, $sym, $cmds)
- if $self->{binding_change};
- } else {
- $::STATUSBOX->add ("No action bound, no key or action specified!");
- $self->{binding_cancel}->()
- if $self->{binding_cancel};
- }
-}
-
-sub start {
- my ($self) = @_;
-
- $self->{rec_btn}->set_text ("stop recording");
- $self->{recording} = 1;
- $self->clear_command_list;
- $::CONN->start_record if $::CONN;
-}
-
-sub stop {
- my ($self) = @_;
-
- $self->{rec_btn}->set_text ("start recording");
- $self->{recording} = 0;
-
- my $rec;
- $rec = $::CONN->stop_record if $::CONN;
- return unless ref $rec eq 'ARRAY';
- $self->set_command_list ($rec);
-}
-
-
-sub ask_for_bind_and_commit {
- my ($self) = @_;
- $self->ask_for_bind (1);
-}
-
-sub ask_for_bind {
- my ($self, $commit, $end_cb) = @_;
-
- CFClient::Binder::open_binding_dialog (sub {
- my ($mod, $sym) = @_;
- $self->{binding} = [$mod, $sym]; # XXX: how to stop that memleak?
- $self->update_binding_widgets;
- $self->commit if $commit;
- $end_cb->() if $end_cb;
- });
-}
-
-# $mod and $sym are the modifiers and key symbol
-# $cmds is a array ref of strings (the commands)
-# $cb is the callback that is executed on OK
-# $ccb is the callback that is executed on CANCEL and
-# when the binding was unsuccessful on OK
-sub set_binding {
- my ($self, $mod, $sym, $cmds, $cb, $ccb) = @_;
-
- $self->clear_command_list;
- $self->{recording} = 0;
- $self->{rec_btn}->set_text ("start recording");
-
- $self->{binding} = [$mod, $sym];
- $self->{commands} = $cmds;
-
- $self->{binding_change} = $cb;
- $self->{binding_cancel} = $ccb;
-
- $self->update_binding_widgets;
-}
-
-# this is a shortcut method that asks for a binding
-# and then just binds it.
-sub do_quick_binding {
- my ($self, $cmds, $end_cb) = @_;
- $self->set_binding (undef, undef, $cmds, sub { $self->cfg_bind (@_) });
- $self->ask_for_bind (1, $end_cb);
-}
-
-sub update_binding_widgets {
- my ($self) = @_;
- my ($mod, $sym, $cmds) = $self->get_binding;
- $self->{keylbl}->set_text (CFClient::Binder::keycombo_to_name ($mod, $sym));
- $self->set_command_list ($cmds);
-}
-
-sub get_binding {
- my ($self) = @_;
- return (
- $self->{binding}->[0],
- $self->{binding}->[1],
- [ grep { defined $_ } @{$self->{commands}} ]
- );
-}
-
-sub clear_command_list {
- my ($self) = @_;
- $self->{cmdbox}->clear ();
-}
-
-sub set_command_list {
- my ($self, $cmds) = @_;
-
- $self->{cmdbox}->clear ();
- $self->{commands} = $cmds;
-
- my $idx = 0;
-
- for (@$cmds) {
- $self->{cmdbox}->add (my $hb = new CFClient::UI::HBox);
-
- my $i = $idx;
- $hb->add (new CFClient::UI::Label text => $_);
- $hb->add (new CFClient::UI::Button
- text => "delete",
- tooltip => "Deletes the action from the record",
- on_activate => sub {
- $self->{cmdbox}->remove ($hb);
- $cmds->[$i] = undef;
- });
-
-
- $idx++
- }
-}
-
-#############################################################################
-
package CFClient::UI::SpellList;
our @ISA = CFClient::UI::Table::;
@@ -3741,7 +3623,7 @@
} 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 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);
@@ -3997,6 +3879,12 @@
$w = 0 if $w < 0;
$h = 0 if $h < 0;
+ $w = max $widget->{min_w}, $w;
+ $h = max $widget->{min_h}, $h;
+
+ $w = min $widget->{max_w}, $w if exists $widget->{max_w};
+ $h = min $widget->{max_h}, $h if exists $widget->{max_h};
+
$w = int $w + 0.5;
$h = int $h + 0.5;