$VERSION
=
"0.15"
;
my
%types
= (
image
=> {
class
=>
'SImageItem'
,
pack
=> [],
},
message
=> {
class
=>
'SMessageItem'
,
pack
=> [
-expand
=> 1,
-fill
=>
'x'
],
},
progress
=> {
class
=>
'SProgressItem'
,
pack
=> [],
},
text
=> {
class
=>
'STextItem'
,
pack
=> [],
},
);
sub
new {
my
$class
=
shift
;
my
$self
=
$class
->SUPER::new(
@_
);
$self
->Require(
'Panels'
);
my
$args
=
$self
->GetArgsRef;
my
$panel
=
delete
$args
->{
'-statusbarpanel'
};
$panel
=
'BOTTOM'
unless
defined
$panel
;
my
$pn
=
$self
->extGet(
'Panels'
);
$pn
->panelAssign(
'status bar'
,
$panel
);
$self
->addPreConfig(
-errorcolor
=> [
'PASSIVE'
,
'errorColor'
,
'ErrorColor'
,
'#FF0000'
],
-warningcolor
=> [
'PASSIVE'
,
'warningColor'
,
'WarningColor'
,
'#0000FF'
],
-statusitemrelief
=> [
'PASSIVE'
,
undef
,
undef
,
'groove'
],
-statusitemborderwidth
=> [
'PASSIVE'
,
undef
,
undef
, 2],
-statusitempadding
=> [
'PASSIVE'
,
undef
,
undef
, 2],
-statusupdatecycle
=>[
'PASSIVE'
,
undef
,
undef
, 500],
-statusmsgitemoninit
=>[
'PASSIVE'
,
undef
,
undef
, 1],
);
$self
->{BALLOON} =
$self
->Balloon;
$self
->{ITEMS} = {};
$self
->addPostConfig(
'InitMsgItem'
,
$self
);
$self
->addPostConfig(
'Cycle'
,
$self
);
return
$self
;
}
sub
Add {
my
$self
=
shift
;
my
$type
=
shift
;
my
$name
=
shift
;
unless
(
exists
$types
{
$type
}) {
warn
"undefined statusbar type: $type"
;
return
}
my
%params
= (
@_
);
my
$pos
=
delete
$params
{
'-position'
};
my
$class
=
$types
{
$type
}->{class};
my
$pack
=
$types
{
$type
}->{
pack
};
my
$itempadding
=
$self
->configGet(
'-statusitempadding'
);
my
$pn
=
$self
->extGet(
'Panels'
);
my
$panel
=
$pn
->panelAssign(
'status bar'
);
if
(
defined
$pos
) {
my
@items
=
$self
->Subwidget(
$panel
)->children;
my
$b
=
$items
[
$pos
];
push
@$pack
,
-before
=>
$b
if
defined
$b
;
}
my
$i
=
$self
->Subwidget(
$panel
)->
$class
(
%params
,
-relief
=>
$self
->configGet(
'-statusitemrelief'
),
-borderwidth
=>
$self
->configGet(
'-statusitemborderwidth'
),
)->
pack
(
@$pack
,
-padx
=>
$itempadding
,
-pady
=>
$itempadding
,
-side
=>
'left'
);
$self
->{ITEMS}->{
$name
} =
$i
;
return
$i
}
sub
AddImageItem {
my
$self
=
shift
;
my
$name
=
shift
;
my
%options
= (
@_
);
my
$imgo
=
delete
$options
{
'-valueimages'
};
my
%vi
= ();
if
(
defined
$imgo
) {
for
(
keys
%$imgo
) {
my
$img
=
$imgo
->{
$_
};
$vi
{
$_
} =
$self
->getArt(
$img
);
}
$options
{
'-valueimages'
} = \
%vi
;
}
return
$self
->Add(
'image'
,
$name
,
%options
);
}
sub
AddMessageItem {
my
$self
=
shift
;
return
$self
->Add(
'message'
,
@_
);
}
sub
AddProgressItem {
my
$self
=
shift
;
return
$self
->Add(
'progress'
,
@_
);
}
sub
AddTextItem {
my
$self
=
shift
;
return
$self
->Add(
'text'
,
@_
);
}
sub
Attach {
my
(
$self
,
$widget
,
$text
) =
@_
;
$self
->{BALLOON}->attach(
$widget
,
-statusmsg
=>
$text
)
}
sub
Cycle {
my
$self
=
shift
;
my
$time
=
$self
->configGet(
'-statusupdatecycle'
);
$self
->
after
(
$time
, [
'Update'
,
$self
])
unless
$time
eq 0;
}
sub
Delete {
my
(
$self
,
$name
) =
@_
;
unless
(
$name
eq
'msg'
) {
if
(
$self
->ItemExists(
$name
)) {
my
$it
=
$self
->Item(
$name
);
$it
->Remove;
$it
->destroy;
my
$ih
=
$self
->{ITEMS};
delete
$ih
->{
$name
}
}
}
}
sub
InitMsgItem {
my
$self
=
shift
;
if
(
$self
->configGet(
'-status barvisible'
)) {
my
$pn
=
$self
->extGet(
'Panels'
);
my
$panel
=
$pn
->panelAssign(
'status bar'
);
$pn
->panelShow(
$panel
);
}
if
(
$self
->configGet(
'-statusmsgitemoninit'
)) {
unless
(
exists
$self
->{MI}) {
my
$mi
=
$self
->AddMessageItem(
'msg'
,
-position
=> 0);
$self
->{MI} =
$mi
;
$self
->{BALLOON}->configure(
-statusbar
=>
$mi
);
$self
->configPut(
-logcall
=>
sub
{
$mi
->Message(
shift
) });
$self
->configPut(
-logerrorcall
=>
sub
{
$mi
->Message(
shift
,
$self
->configGet(
'-errorcolor'
)) });
$self
->configPut(
-logwarningcall
=>
sub
{
$mi
->Message(
shift
,
$self
->configGet(
'-warningcolor'
)) });
return
$mi
;
}
}
}
sub
Item {
my
(
$self
,
$name
) =
@_
;
return
$self
->{ITEMS}->{
$name
}
}
sub
ItemExists {
my
(
$self
,
$name
) =
@_
;
return
exists
$self
->{ITEMS}->{
$name
}
}
sub
Message {
my
$self
=
shift
;
my
$msg
=
$self
->{MI};
$msg
->Message(
@_
)
if
defined
$msg
;
}
sub
Update {
my
$self
=
shift
;
my
$items
=
$self
->{ITEMS};
for
(
keys
%$items
) {
$self
->Item(
$_
)->Update
}
$self
->Cycle;
}
1;