Theme configuration can be stored in an rc file, ~/.prima/themes, and is loaded automatically, unless $Prima::Themes::load_rc_file explicitly set to 0 before loading the "Prima::Themes" module. In effect, any Prima application not aware of themes can be coupled with themes in the rc file by the following:
perl -MPrima::Themes program
"Prima::Themes" namespace provides registration and execution functionality. "Prima::Themes::Proxy" is a class for overriding certain methods, for internal realization of a theme.
For interactive theme selection use examples/theme.pl sample program.
# register a theme file
use Prima::Themes qw(color);
# or
use Prima::Themes; load('color');
# list registered themes
print Prima::Themes::list;
# install a theme
Prima::Themes::install('cyan');
# list installed themes
print Prima::Themes::list_active;
# create object with another theme while 'cyan' is active
Class->create( theme => 'yellow');
# remove a theme
Prima::Themes::uninstall('cyan');
A loaded theme file may register one or more themes.
If $CALLBACK is "undef", the default merger routine is called, which treats the second items of the pairs as hashes of the same format as the default and user profiles.
The theme is inactive until "install" is called. If $INSTALLER subroutine is passed, it is called during install and uninstall, with two parameters, the name of the theme and boolean install/uninstall flag. When install flag is 1, the theme is about to be installed; the subroutine is expected to return a boolean success flag. Otherwise, subroutine return value is not used.
$FILE is used to indicate the file in which the theme is stored.
Prima::Themes::Proxy-> new( $OBJECT)
is a non-functional wrapper for any Perl object $OBJECT. All methods of $OBJECT, except "AUTOLOAD", "DESTROY", and "new", are forwarded to $OBJECT itself transparently. The class can be used, for example, to deny all changes to "lineWidth" inside object's painting routine:
package ConstLineWidth;
use vars qw(@ISA);
@ISA = qw(Prima::Themes::Proxy);
sub lineWidth { 1 } # line width is always 1 now!
Prima::Themes::register( '~/lib/constlinewidth.pm', 'constlinewidth',
[ 'Prima::Widget' => {
onPaint => sub {
my ( $object, $canvas) = @_;
$object-> on_paint( ConstLineWidth-> new( $canvas));
},
} ]
);