ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/Deliantra-Client/DC/UI/Dockable.pm
Revision: 1.5
Committed: Sun Jan 13 08:47:00 2008 UTC (16 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-0_9965, rel-0_9964, rel-0_9968, rel-0_9972, rel-0_9973, rel-0_9974, rel-0_9975, rel-0_9976, rel-0_9977, rel-0_9978, rel-0_9971, rel-0_9967, rel-1_21, rel-0_9966
Changes since 1.4: +1 -1 lines
Log Message:
fix chatbox label padding (probably not the correct fix)

File Contents

# Content
1 package DC::UI::Dockable;
2
3 use strict;
4 use utf8;
5
6 our @ISA = DC::UI::Bin::;
7
8
9 # A dockable can be docked into a DC::UI::Dockbar
10 # Attributes:
11 # 'can_close' says: This dockable has a close button as tab.
12 # 'can_undock' says that the dockable tab has a 'undock' button.
13 # 'title' is the title of the tab label or the title of the undocket window
14
15 sub new {
16 my $class = shift;
17
18 my $self = $class->SUPER::new (
19 title => "unset",
20 can_close => 1,
21 can_undock => 0, # temporarily deactivated!
22 @_,
23 );
24
25 $self->init;
26
27 $self
28 }
29
30 # a setup method for the constructor
31 sub init {
32 my ($self) = @_;
33
34 my $bb = $self->{c_tab} = DC::UI::ButtonBin->new (tooltip => $self->{tooltip});
35 $bb->add (my $vb = DC::UI::Box->new);
36 $vb->add (
37 my $b =
38 $self->{tab_label} =
39 DC::UI::Label->new (expand => 1, valign => 0.5, align => 0, padding_x => 8, padding_y => 4)
40 );
41
42 if ($self->{can_close}) {
43 $vb->add (
44 my $ib = DC::UI::ImageButton->new (path => 'x1_close.png', scale => 0.3)
45 );
46 $ib->connect (activate => sub {
47 $self->close;
48 0
49 });
50 }
51
52 if ($self->{can_undock}) {
53 $vb->add (
54 my $ib2 = DC::UI::ImageButton->new (path => 'x1_close.png', scale => 0.3)
55 );
56 $ib2->connect (activate => sub {
57 $self->emit ("undock");
58 0
59 });
60 }
61
62
63 $self->set_title ($self->{title});
64 }
65
66 # This sets the title of the dockable. The title is displayed
67 sub set_title {
68 my ($self, $title) = @_;
69 $self->{title} = $title;
70 $self->update_tab;
71 }
72
73 # Returns the title
74 sub get_title { $_[0]->{title} }
75
76 # This method activates the tab of the dockable if it is docked
77 sub select_my_tab {
78 my ($self) = @_;
79 if ($self->is_docked) {
80 $self->{dockbar}->select_dockable ($self);
81 }
82 }
83
84 # (private) This method is used by Dockbar to tell the dockable
85 # it's position in the dockbar (if it has one, if it has no position,
86 # $pos is undef).
87 sub set_dockbar_pos {
88 my ($self, $pos) = @_;
89 $self->{dockbar_pos} = $pos;
90 $self->update_tab;
91 }
92
93 # (private) This method tells the dockable that it is 'active', which means:
94 # it is docked and it's tab has been activated and it is currently shown.
95 sub set_dockbar_tab_active {
96 my ($self, $active) = @_;
97 $self->{dockbar_active} = $active;
98 $self->update_tab;
99 }
100
101 # (private) This method updates the tab and other things of the dockable
102 # whenever something has been changed (title, color, ...)
103 sub update_tab {
104 my ($self) = @_;
105 # TODO: set color according to dockbar_active
106
107 my $oldcolor = $self->{tab_label}->{fg};
108 if ($self->is_docked_active) {
109 $self->{tab_label}->{fg} = $self->{active_fg} || [1, 1, 1];
110 } else {
111 $self->{tab_label}->{fg} = $self->{inactive_fg} || [1, 1, 1,];
112 }
113 if (join (',', @$oldcolor) ne join (',', @{$self->{tab_label}->{fg}})) {
114 # update colors
115 $self->{tab_label}->realloc;
116 $self->{tab_label}->update;
117 }
118
119 $self->{tab_label}->set_markup (
120 $self->get_title
121 . (defined $self->{dockbar_pos}
122 ? "-" . ($self->{dockbar_pos} + 1)
123 : "")
124 );
125 }
126
127 # This method sets the active foreground color of the dockable tab
128 sub set_active_fg {
129 my ($self, $fg) = @_;
130 $self->{active_fg} = $fg;
131 $self->update_tab;
132 }
133
134 # This method sets the inactive foreground color of the dockable tab
135 sub set_inactive_fg {
136 my ($self, $fg) = @_;
137 $self->{inactive_fg} = $fg;
138 $self->update_tab;
139 }
140
141 # (private) This method is used by the Dockbar to tell the Dockable which
142 # Dockbar it belongs to. Do not call this method yourself, use the dockbars
143 # add_dock and remove_dock methods instead.
144 sub set_dockbar {
145 my ($self, $dockbar) = @_;
146 $self->{dockbar} = $dockbar;
147 Scalar::Util::weaken $self->{dockbar};
148 }
149
150 # This method is called when someone wants to 'activate' the dockable,
151 # the meaning of being 'activated' is given by subclasses that inherit
152 # from Dockable. Eg. In ChatView the 'activation' means that the entry field
153 # of for chat is activated for input.
154 sub activate {
155 my ($self) = @_;
156 $self->emit ("activate");
157 }
158
159 # Returns whether this dockable is docked on a Dockbar.
160 sub is_docked {
161 my ($self) = @_;
162 $self->{dockbar} or return 0;
163 return $self->{dockbar}->is_docked ($self);
164 }
165
166 # Returns whether this dockable is docked _and_ it's tab
167 # is active.
168 sub is_docked_active {
169 my ($self) = @_;
170 $self->{dockbar} or return 0;
171 return $self->{dockbar_active};
172 }
173
174 # This method is called when the Dockable wants to be closed, which means
175 # that it's window is closed or tab is removed from the dockbar and it
176 # is removed from the dockbar.
177 sub close {
178 my ($self) = @_;
179 $self->emit ("close_dock");
180 }
181
182 1