#!/usr/bin/env perl

package main ;

use strict;
use warnings;

use Glib ':constants';
use Gtk3 -init;
Gtk3->init;

use App::Asciio::GTK::Asciio ;

use Module::Util qw(find_installed) ;
use File::Basename ;

#-----------------------------------------------------------------------------

my $window = Gtk3::Window->new('toplevel');
$window->set_title("asciio");
$window->set_default_size(1000, 1000) ;
$window->signal_connect("destroy", sub { exit(0); });

my $scwin = Gtk3::ScrolledWindow->new();
$scwin->set_policy('automatic', 'automatic');

$window->add($scwin);

my @asciios ;

my $asciio = new App::Asciio::GTK::Asciio($window, 50, 25, $scwin) ;

push @asciios, $asciio ;

$scwin->add_with_viewport($asciio->{widget});
$scwin->show_all();

my ($command_line_switch_parse_ok, $command_line_parse_message, $asciio_config)
	= $asciio->ParseSwitches([@ARGV], 0) ;

die "Error: '$command_line_parse_message'!" unless $command_line_switch_parse_ok ;

my $setup_paths = [] ;

if(@{$asciio_config->{SETUP_PATHS}})
	{
	$setup_paths = $asciio_config->{SETUP_PATHS} ;
	}
else
	{
	my ($basename, $path, $ext) = File::Basename::fileparse(find_installed('App::Asciio'), ('\..*')) ;
	my $setup_path = $path . $basename . '/setup/' ;
	
	$setup_paths = 
		[
		$setup_path . 'setup.ini', 
		$setup_path . 'GTK/setup.ini', 
		$ENV{HOME} . '/.config/Asciio/Asciio.ini',
		] ;
	}

$asciio->setup($setup_paths) ;
$asciio->{ACTION_VERBOSE} = sub { print "@_\n" } ;

my ($character_width, $character_height) = $asciio->get_character_size() ;

if(defined $asciio_config->{TARGETS}[0])
	{
	$asciio->run_actions_by_name(['Open', $asciio_config->{TARGETS}[0]]) ;
	$window->set_default_size(@{$asciio->{WINDOW_SIZE}})  if defined $asciio->{WINDOW_SIZE} ;
	}
	
$window->show_all();

$asciio->{widget}->set_size_request($asciio->{CANVAS_WIDTH} * $character_width, $asciio->{CANVAS_HEIGHT} * $character_height);
$asciio->set_modified_state(0) ;
$asciio->run_script($asciio_config->{SCRIPT}) ;

#--------------------------------------------------------------------------

$window->signal_connect (delete_event => \&delete_event, \@asciios) ;

sub delete_event
{
my ($window, $event, $asciios) = @_;
my $answer = 'yes';

my $should_save ;
for my $asciio (@{$asciios})
	{
	$should_save++ if $asciio->get_modified_state() ;
	}

if($should_save) 
	{
	$answer = $asciios[0]->display_quit_dialog('asciio', ' ' x 25 . "Document is modified!\n\nAre you sure you want to quit and lose your changes?\n") ;
	}

if($answer eq 'save_and_quit')
	{
	for my $asciio (@{$asciios})
		{
		my @saved_result = $asciio->run_actions_by_name('Save') ;
		
		$answer = 'cancel' if(! defined $saved_result[0][0] || $saved_result[0][0] eq '') ;
		}
	}

return $answer eq 'cancel';
}

#--------------------------------------------------------------------------

Gtk3->main();
