package Kephra::File::History;
our $VERSION = '0.06';
use strict;
use warnings;
my @session = ();
my $menu_id = '&file_history';
my $refresh_needed;
my $loaded;
# internal Module API
sub _config { Kephra::API::settings()->{file}{session}{history} }
# external Appwide API
sub init {
return if scalar @session;
my $config = Kephra::File::Session::_config();
return unless defined $config;
my $subdir = $config->{directory};
my $file = Kephra::Config::filepath( $subdir, _config()->{file} );
my $config_tree = Kephra::Config::File::load($file);
if (ref $config_tree->{document} eq 'ARRAY'){
@session = @{$config_tree->{document}};
}
Kephra::EventTable::add_call ( 'document.close', __PACKAGE__, sub {
Kephra::File::History::add( Kephra::Document::Data::current_nr() );
}, __PACKAGE__ );
$loaded = 1;
}
sub had_init {$loaded}
sub save {
my $subdir = Kephra::File::Session::_config()->{directory};
my $file = Kephra::Config::filepath( $subdir, _config()->{file} );
my $config_tree;
@{$config_tree->{document}} = @session;
Kephra::Config::File::store( $file, $config_tree);
}
sub delete_gone {
my $length = @session;
my $file = Kephra::Document::Data::get_file_path();
@session = grep { $_->{file_path} ne $file } @session;
$refresh_needed = 1 if $length != @session;
}
sub get {
delete_gone();
\@session;
}
sub update {
delete_gone();
if ($refresh_needed){
$refresh_needed = 0;
return 1;
}
}
sub add {
my $doc_nr = Kephra::Document::Data::validate_doc_nr(shift);
return if $doc_nr < 0;
my $attr = Kephra::Document::Data::_hash($doc_nr);
return unless $attr->{'file_name'};
my %saved_attr;
$saved_attr{$_} = $attr->{$_} for @{ Kephra::File::Session::_saved_properties() };
unshift @session, \%saved_attr;
my $length = _config->{length} || 0;
pop @session while @session > $length;
$refresh_needed = 1;
}
sub open {
my $hist_nr = shift;
return if $hist_nr < 0 or $hist_nr > $#session;
my $doc_nr = Kephra::Document::Data::get_current_nr();
my $new_nr = Kephra::Document::restore( splice @session, $hist_nr , 1 );
Kephra::Document::Data::set_current_nr( $doc_nr );
Kephra::Document::Change::to_number( $new_nr );
$refresh_needed = 1;
Kephra::EventTable::trigger('document.list');
}
sub open_all {
my $new_nr;
my $doc_nr = Kephra::Document::Data::get_current_nr();
$new_nr = Kephra::Document::restore( $_ ) for @session;
Kephra::Document::Data::set_current_nr( $doc_nr );
Kephra::Document::Change::to_number( $new_nr );
@session = ();
$refresh_needed = 1;
Kephra::EventTable::trigger('document.list');
}
1;