File Coverage

lib/Kephra/EventTable.pm
Criterion Covered Total %
statement 6 94 6.3
branch 0 38 0.0
condition 0 9 0.0
subroutine 2 24 8.3
pod 1 19 5.2
total 9 184 4.8


line stmt bran cond sub pod time code
1             package Kephra::EventTable;
2             our $VERSION = '0.16';
3            
4 1     1   1009 use strict;
  1         2  
  1         31  
5 1     1   5 use warnings;
  1         2  
  1         1391  
6            
7             # get pointer to the event list
8             my %timer;
9             my %table;
10             my %group = (
11             edit => [qw(document.text.change document.text.select caret.move)],
12             doc_change => [qw(document.current.number.changed
13             document.savepoint document.text.select)],
14             );
15 0     0     sub _table { \%table }
16            
17             sub start_timer {
18             # set or update timer events
19 0     0 0   my $win = Kephra::App::Window::_ref();
20 0           my $config = Kephra::API::settings()->{file};
21            
22 0           stop_timer();
23 0 0         if ($config->{open}{notify_change}) {
24 0           $timer{file_notify} = Wx::Timer->new( $win, 2 );
25 0           $timer{file_notify}->Start( $config->{open}{notify_change} * 1000 );
26 0     0     Wx::Event::EVT_TIMER( $win, 2, sub { Kephra::File::changed_notify_check() } );
  0            
27             }
28 0 0         if ($config->{save}{auto_save}) {
29 0           $timer{file_save} = Wx::Timer->new( $win, 1 );
30 0           $timer{file_save}->Start( $config->{save}{auto_save} * 1000 );
31 0     0     Wx::Event::EVT_TIMER( $win, 1, sub { Kephra::File::save_all_named() } );
  0            
32             }
33             }
34            
35             sub stop_timer {
36 0     0 0   my $win = Kephra::App::Window::_ref();
37 0 0         $timer{file_save}->Stop if ref $timer{file_save} eq 'Wx::Timer';
38 0           delete $timer{file_save};
39 0 0         $timer{file_notify}->Stop if ref $timer{file_notify} eq 'Wx::Timer';
40 0           delete $timer{file_notify};
41             }
42 0     0 0   sub delete_all_timer {}
43             #######################################################################
44             sub add_call {
45 0     0 1   return until ref $_[2] eq 'CODE';
46 0           my $list = _table();
47 0           $list->{active}{ $_[0] }{ $_[1] } = $_[2];
48 0 0         $list->{owner}{ $_[3] }{ $_[0] }{ $_[1] } = 1 if $_[3];
49             }
50            
51             sub add_frozen_call {
52 0     0 0   return until ref $_[2] eq 'CODE';
53 0           my $list = _table();
54 0           $list->{frozen}{ $_[0] }{ $_[1] } = $_[2];
55 0 0         $list->{owner}{ $_[3] }{ $_[0] }{ $_[1] } = 1 if $_[3];
56             }
57            
58             sub trigger {
59 0     0 0   my $active = _table()->{active};
60 0           for my $event (@_){
61 0 0         if (ref $active->{$event} eq 'HASH'){
62 0           $_->() for values %{ $active->{$event} }
  0            
63             }
64             }
65             }
66            
67             sub trigger_group {
68 0     0 0   my $group_name = shift;
69 0 0 0       return unless $group_name and ref $group{$group_name} eq 'ARRAY';
70 0           trigger( @{$group{$group_name}} );
  0            
71             }
72            
73             sub freeze {
74 0     0 0   my $list = _table();
75 0           for my $event (@_){
76 0 0         if (ref $list->{active}{$event} eq 'HASH'){
77 0           $list->{frozen}{$event}{$_} = $list->{active}{$event}{$_}
78 0           for keys %{$list->{active}{$event}};
79 0           delete $list->{active}{$event};
80             }
81             }
82             }
83            
84             sub freeze_group {
85 0     0 0   my $group_name = shift;
86 0 0 0       return unless $group_name and ref $group{$group_name} eq 'ARRAY';
87 0           freeze( @{$group{$group_name}} );
  0            
88             }
89 0     0 0   sub freeze_all { freeze($_) for keys %{_table()->{active}} }
  0            
90            
91            
92             sub thaw {
93 0     0 0   my $list = _table();
94 0           for my $event (@_){
95 0 0         if (ref $list->{frozen}{$event} eq 'HASH'){
96 0           $list->{active}{$event}{$_} = $list->{frozen}{$event}{$_}
97 0           for keys %{$list->{frozen}{$event}};
98 0           delete $list->{frozen}{$event};
99             }
100             }
101             }
102             sub thaw_group {
103 0     0 0   my $group_name = shift;
104 0 0 0       return unless $group_name and ref $group{$group_name} eq 'ARRAY';
105 0           thaw( @{$group{$group_name}} );
  0            
106             }
107 0     0 0   sub thaw_all { thaw($_) for keys %{_table()->{frozen}} }
  0            
108            
109             sub del_call {
110 0     0 0   return until $_[1];
111 0           my $list = _table()->{active};
112 0 0         delete $list->{ $_[0] }{ $_[1] } if exists $list->{ $_[0] }{ $_[1] };
113 0           $list = _table()->{frozen};
114 0 0         delete $list->{ $_[0] }{ $_[1] } if exists $list->{ $_[0] }{ $_[1] };
115             }
116             sub del_subscription {
117 0     0 0   my $subID = shift;
118 0           my $list = _table()->{active};
119 0           for my $event (keys %$list){
120 0 0         delete $list->{$event}->{$subID} if exists $list->{$event}->{$subID};
121             }
122 0           $list = _table()->{frozen};
123 0           for my $event (keys %$list){
124 0 0         delete $list->{$event}->{$subID} if exists $list->{$event}->{$subID};
125             }
126             }
127             sub del_own_subscriptions {
128 0     0 0   my $owner = shift;
129 0           my $list = _table();
130 0 0         return unless ref $list->{owner}{ $owner } eq 'HASH';
131 0           my $lista = $list->{active};
132 0           my $listf = $list->{frozen};
133 0           my $own_ev = $list->{owner}{ $owner };
134 0           for my $ev (keys %$own_ev) {
135 0           for (keys %{$own_ev->{$ev}}) {
  0            
136 0 0         delete $lista->{ $ev }{ $_ } if exists $lista->{ $ev }{ $_ };
137 0 0         delete $listf->{ $ev }{ $_ } if exists $listf->{ $ev }{ $_ };
138             }
139             }
140 0           delete $list->{owner}{ $owner };
141             }
142 0     0 0   sub del_all_active { $table{active} = () }
143 0     0 0   sub del_all_frozen { $table{frozen} = () }
144 0     0 0   sub del_all { %table = () }
145            
146            
147             1;
148            
149             __END__