# Example of how to implement mirror to VB widget palette.
# In fact, you don't need to keep runtime package and VB
# implementation in one file.
#
# Package Prima::VB::examples::Widgety must be presented
# first in file, located in Prima/VB/examples/Widgety.pm,
# but runtime package could be located somewhere else, like
# Prima::VB::CoreClasses.pm is a shell to Prima/*.pm
#
# Another example here is to introduce custom property editor,
# included into Object Inspector. Here's defined 'lineRoundStyle',
# property, same as rare-used 'lineEnd'.
#
########################## VB mirror package #########################
package Prima::VB::examples::Widgety;
use strict;
use warnings;
sub classes
{
return (
'Prima::SampleWidget' => {
RTModule => 'Prima::VB::examples::Widgety',
class => 'Prima::VB::examples::SampleWidget',
page => 'Samples',
module => 'Prima::VB::examples::Widgety',
icon => 'VB::VB.gif:0',
},
);
}
use Prima::VB::Classes;
package Prima::VB::examples::SampleWidget;
use vars qw(@ISA);
@ISA = qw( Prima::VB::CommonControl);
sub prf_types
{
my $pt = $_[ 0]-> SUPER::prf_types;
my %de = (
lineRoundStyle => ['lineRoundStyle'],
);
$_[0]-> prf_types_add( $pt, \%de);
return $pt;
}
sub on_paint
{
my ( $self, $canvas) = @_;
my @sz = $self-> size;
my $c = $self-> color;
$canvas-> color( $self-> backColor);
$canvas-> bar( 0, 0, @sz);
$canvas-> color( $c);
$canvas-> lineWidth( 8);
$canvas-> lineEnd( $self-> prf('lineRoundStyle'));
$canvas-> line( 20, 20, $sz[0] - 21, $sz[1] - 21);
$canvas-> draw_text( $self-> prf('text'), 0, 0, @sz, dt::Center | dt::VCenter);
$canvas-> lineWidth( 1);
$self-> common_paint($canvas);
}
sub prf_lineRoundStyle { $_[0]-> repaint; }
package Prima::VB::Types::lineRoundStyle;
use vars qw(@ISA);
@ISA = qw(Prima::VB::Types::radio);
sub IDS { qw( Flat Square Round); }
sub packID { 'le'; }
sub open
{
my $self = shift;
$self-> SUPER::open( @_);
$self-> {A}-> set(
bottom => $self-> {A}-> bottom + 36,
height => $self-> {A}-> height - 36,
);
$self-> {B} = $self-> {container}-> insert( Widget =>
origin => [ 5, 5],
size => [ $self-> {A}-> width, 32],
growMode => gm::GrowHiX,
onPaint => sub {
my ( $me, $canvas) = @_;
my @sz = $canvas-> size;
$canvas-> color( cl::White);
$canvas-> bar(0,0,@sz);
$canvas-> lineEnd( $self-> get);
$canvas-> lineWidth( 14);
$canvas-> color( cl::Gray);
$canvas-> line( 14, $sz[1]/2, $sz[0]-14, $sz[1]/2);
$canvas-> lineWidth( 2);
$canvas-> color( cl::Black);
$canvas-> lineEnd( le::Round);
$canvas-> line( 8, $sz[1]/2, 20, $sz[1]/2);
$canvas-> line( $sz[0]-20, $sz[1]/2, $sz[0]-8, $sz[1]/2);
$canvas-> line( 14, $sz[1]/2-6, 14, $sz[1]/2+6);
$canvas-> line( $sz[0]-14, $sz[1]/2-6, $sz[0]-14, $sz[1]/2+6);
},
);
}
sub on_change
{
my $self = $_[0];
$self-> {B}-> repaint;
}
############################### runtime package ##########################################
use Prima::Classes;
package Prima::SampleWidget;
use vars qw(@ISA);
@ISA = qw( Prima::Widget);
sub profile_default
{
my $def = $_[ 0]-> SUPER::profile_default;
my %prf = (
lineRoundStyle => le::Round,
);
@$def{keys %prf} = values %prf;
return $def;
}
sub init
{
my $self = shift;
my %profile = $self-> SUPER::init( @_);
$self-> lineRoundStyle( $profile{lineRoundStyle});
return %profile;
}
sub on_paint
{
my ( $self, $canvas) = @_;
my @sz = $self-> size;
my $c = $self-> color;
$canvas-> color( $self-> backColor);
$canvas-> bar( 0, 0, @sz);
$canvas-> color( $c);
$canvas-> lineWidth( 8);
$canvas-> lineEnd( $self-> lineRoundStyle);
$canvas-> line( 20, 20, $sz[0] - 21, $sz[1] - 21);
$canvas-> draw_text( $self-> text, 0, 0, @sz, dt::Center | dt::VCenter);
}
sub lineRoundStyle
{
return $_[0]-> {lineRoundStyle} unless $#_;
$_[0]-> {lineRoundStyle} = $_[1];
$_[0]-> repaint;
}
1;