package Kephra::App::EditPanel::Indicator;
$VERSION = '0.01';
use strict;
use warnings;
sub _ref { Kephra::App::EditPanel::_ref() }
sub _all_ref { Kephra::Document::Data::get_all_ep() }
sub _config { Kephra::API::settings()->{editpanel}{indicator} }
# aply all indicator setting to this edit panel
sub apply_all_here {
my $ep = shift || _ref();
my $indicator = _config();
my $color = \&Kephra::Config::color;
$ep->SetCaretLineBack( &$color( $indicator->{caret_line}{color} ) );
$ep->SetCaretPeriod( $indicator->{caret}{period} );
$ep->SetCaretWidth( $indicator->{caret}{width} );
$ep->SetCaretForeground( &$color( $indicator->{caret}{color} ) );
if ( $indicator->{selection}{fore_color} ne '-1' ) {
$ep->SetSelForeground
( 1, &$color( $indicator->{selection}{fore_color} ) );
}
$ep->SetSelBackground( 1, &$color( $indicator->{selection}{back_color}));
$ep->SetWhitespaceForeground
( 1, &$color( $indicator->{whitespace}{color} ) );
apply_whitespace_settings_here($ep);
apply_bracelight_settings_here($ep);
apply_caret_line_settings_here($ep);
apply_indention_guide_settings_here($ep);
apply_LLI_settings_here($ep);
apply_EOL_settings_here($ep);
}
# whitespace
#
sub whitespace_visible { _config()->{whitespace}{visible} }
sub apply_whitespace_settings_here {
my $ep = shift || _ref();
$ep->SetViewWhiteSpace( whitespace_visible() )
}
sub apply_whitespace_settings {
apply_whitespace_settings_here($_) for @{_all_ref()}
}
sub switch_whitespace_visibility {
my $v = _config()->{whitespace}{visible} ^= 1;
apply_whitespace_settings();
return $v;
}
# bracelight
#
sub bracelight_visible { _config()->{bracelight}{visible} }
sub switch_bracelight {
bracelight_visible() ? set_bracelight_off() : set_bracelight_on();
}
sub set_bracelight_on {
_config()->{bracelight}{visible} = 1;
apply_bracelight_settings()
}
sub set_bracelight_off {
_config()->{bracelight}{visible} = 0;
apply_bracelight_settings()
}#{bracelight}{mode} = 'adjacent'|'surround';
sub apply_bracelight_settings {
apply_bracelight_settings_here($_) for @{_all_ref()}
}
sub apply_bracelight_settings_here {
my $ep = shift || _ref();
if (bracelight_visible()){
Kephra::EventTable::add_call
('caret.move', 'bracelight', \&paint_bracelight);
paint_bracelight($ep);
} else {
Kephra::EventTable::del_call('caret.move', 'bracelight');
$ep->BraceHighlight( -1, -1 );
}
}
sub paint_bracelight {
my $ep = shift || _ref();
my $pos = $ep->GetCurrentPos;
my $tab_size = Kephra::Document::Data::get_attribute('tab_size');
my $matchpos = $ep->BraceMatch(--$pos);
$matchpos = $ep->BraceMatch(++$pos) if $matchpos == -1;
$ep->SetHighlightGuide(0);
if ( $matchpos > -1 ) {
# highlight braces
$ep->BraceHighlight($matchpos, $pos);
# asign pos to opening brace
$pos = $matchpos if $matchpos < $pos;
my $indent = $ep->GetLineIndentation( $ep->LineFromPosition($pos) );
# highlighting indenting guide
$ep->SetHighlightGuide($indent)
if $indent and $tab_size and $indent % $tab_size == 0;
} else {
# disbale all highlight
$ep->BraceHighlight( -1, -1 );
$ep->BraceBadLight($pos-1)
if $ep->GetTextRange($pos-1,$pos) =~ /{|}|\(|\)|\[|\]/;
$ep->BraceBadLight($pos)
if $pos < $ep->GetTextLength
and $ep->GetTextRange( $pos, $pos + 1 ) =~ tr/{}()\[\]//;
}
}
# indention guide
#
sub indention_guide_visible { _config()->{indent_guide}{visible} }
sub apply_indention_guide_settings {
apply_indention_guide_settings_here($_) for @{_all_ref()}
}
sub apply_indention_guide_settings_here {
my $ep = shift || _ref();
$ep->SetIndentationGuides( indention_guide_visible() )
}
sub switch_indention_guide_visibility {
_config()->{indent_guide}{visible} ^= 1;
apply_indention_guide_settings();
}
# caret line
#
sub caret_line_visible { _config()->{caret_line}{visible} }
sub apply_caret_line_settings_here {
my $ep = shift || _ref();
$ep->SetCaretLineVisible( caret_line_visible() );
}
sub apply_caret_line_settings {
apply_caret_line_settings_here($_) for @{_all_ref()}
}
sub switch_caret_line_visibility {
_config()->{caret_line}{visible} ^= 1;
apply_caret_line_settings();
}
# LLI = long line indicator = right margin
#
sub LLI_visible { _config()->{right_margin}{style} == &Wx::wxSTC_EDGE_LINE }
sub apply_LLI_settings_here {
my $ep = shift || _ref();
my $config = _config()->{right_margin};
my $color = \&Kephra::Config::color;
$ep->SetEdgeColour( &$color( $config->{color} ) );
$ep->SetEdgeColumn( $config->{position} );
show_LLI( $config->{style}, $ep);
}
sub show_LLI {
my $style = shift;
my $ep = shift || _ref();
$ep->SetEdgeMode( $style );
}
sub apply_LLI_settings { apply_LLI_settings_here($_) for @{_all_ref()} }
sub switch_LLI_visibility {
my $style = _config()->{right_margin}{style} = LLI_visible()
? &Wx::wxSTC_EDGE_NONE
: &Wx::wxSTC_EDGE_LINE;
apply_LLI_settings($style);
}
# EOL = end of line marker
#
sub EOL_visible { _config()->{end_of_line_marker} }
sub switch_EOL_visibility {
_config()->{end_of_line_marker} ^= 1;
apply_EOL_settings();
}
sub apply_EOL_settings { apply_EOL_settings_here($_) for @{_all_ref()} }
sub apply_EOL_settings_here {
my $ep = shift || _ref();
$ep->SetViewEOL( EOL_visible() );
}
1;