our
@ISA
= DC::UI::Bin::;
sub
new {
my
$class
=
shift
;
my
$self
=
$class
->SUPER::new (
title
=>
"unset"
,
can_close
=> 1,
can_undock
=> 0,
@_
,
);
$self
->init;
$self
}
sub
init {
my
(
$self
) =
@_
;
my
$bb
=
$self
->{c_tab} = DC::UI::ButtonBin->new (
tooltip
=>
$self
->{tooltip});
$bb
->add (
my
$vb
= DC::UI::Box->new);
$vb
->add (
my
$b
=
$self
->{tab_label} =
DC::UI::Label->new (
expand
=> 1,
valign
=> 0.5,
align
=> 0,
padding_x
=> 8,
padding_y
=> 4)
);
if
(
$self
->{can_close}) {
$vb
->add (
my
$ib
= DC::UI::ImageButton->new (
path
=>
'x1_close.png'
,
scale
=> 0.3)
);
$ib
->
connect
(
activate
=>
sub
{
$self
->
close
;
0
});
}
if
(
$self
->{can_undock}) {
$vb
->add (
my
$ib2
= DC::UI::ImageButton->new (
path
=>
'x1_close.png'
,
scale
=> 0.3)
);
$ib2
->
connect
(
activate
=>
sub
{
$self
->emit (
"undock"
);
0
});
}
$self
->set_title (
$self
->{title});
}
sub
set_title {
my
(
$self
,
$title
) =
@_
;
$self
->{title} =
$title
;
$self
->update_tab;
}
sub
get_title {
$_
[0]->{title} }
sub
select_my_tab {
my
(
$self
) =
@_
;
if
(
$self
->is_docked) {
$self
->{dockbar}->select_dockable (
$self
);
}
}
sub
set_dockbar_pos {
my
(
$self
,
$pos
) =
@_
;
$self
->{dockbar_pos} =
$pos
;
$self
->update_tab;
}
sub
set_dockbar_tab_active {
my
(
$self
,
$active
) =
@_
;
$self
->{dockbar_active} =
$active
;
$self
->update_tab;
}
sub
update_tab {
my
(
$self
) =
@_
;
my
$oldcolor
=
$self
->{tab_label}->{fg};
if
(
$self
->is_docked_active) {
$self
->{tab_label}->{fg} =
$self
->{active_fg} || [1, 1, 1];
}
else
{
$self
->{tab_label}->{fg} =
$self
->{inactive_fg} || [1, 1, 1,];
}
if
(
join
(
','
,
@$oldcolor
) ne
join
(
','
, @{
$self
->{tab_label}->{fg}})) {
$self
->{tab_label}->realloc;
$self
->{tab_label}->update;
}
$self
->{tab_label}->set_markup (
$self
->get_title
. (
defined
$self
->{dockbar_pos}
?
"-"
. (
$self
->{dockbar_pos} + 1)
:
""
)
);
}
sub
set_active_fg {
my
(
$self
,
$fg
) =
@_
;
$self
->{active_fg} =
$fg
;
$self
->update_tab;
}
sub
set_inactive_fg {
my
(
$self
,
$fg
) =
@_
;
$self
->{inactive_fg} =
$fg
;
$self
->update_tab;
}
sub
set_dockbar {
my
(
$self
,
$dockbar
) =
@_
;
$self
->{dockbar} =
$dockbar
;
Scalar::Util::weaken
$self
->{dockbar};
}
sub
activate {
my
(
$self
) =
@_
;
$self
->emit (
"activate"
);
}
sub
is_docked {
my
(
$self
) =
@_
;
$self
->{dockbar} or
return
0;
return
$self
->{dockbar}->is_docked (
$self
);
}
sub
is_docked_active {
my
(
$self
) =
@_
;
$self
->{dockbar} or
return
0;
return
$self
->{dockbar_active};
}
sub
close
{
my
(
$self
) =
@_
;
return
if
!
$self
->{can_close};
$self
->emit (
"close_dock"
);
}
1