#!/usr/bin/env perl use strict; use warnings; use utf8; use Encode; use Getopt::Long; use FindBin; use File::Spec::Functions; use File::Path; use File::Basename; use DBI; use Glib qw{ TRUE FALSE}; use Gtk2 qw(-init); use Digest::SHA; use Image::ExifTool qw(:Public); use Data::Dumper; use lib File::Spec->catdir($FindBin::Bin, 'lib'); use PSH::Constants qw( :all ); use PSH::Utils; use PSH::Strings; use PSH::DB; use PSH::Stocks; use PSH::GUI::Utils; use PSH::GUI::vbxPics; use PSH::GUI::ntbPics; sub init { my $result = TRUE; my ( $lang, $codepage ) = split( /\./, $ENV{LANG} || '' ); unless ( defined $lang ) { warn <get_version_info)); my $recreate_db = 0; my $db_file = ''; GetOptions( 'recreate-db' => \$recreate_db, 'db-file=s' => \$db_file ); $db_file = in_str($db_file); my ( $exec_file, $exec_dir, $exec_ext ) = fileparse( $FindBin::Script, qr/\.[^.]*/ ); my $config_path = catdir( Glib::get_user_config_dir, $exec_file ); #print $config_path . "\n"; my $out_str_config_path = out_str($config_path); mkpath($out_str_config_path) unless ( -e $out_str_config_path and -d _ ); my $cache_dir = catdir( Glib::get_user_cache_dir, $exec_file ); my $out_str_cache_dir = out_str($cache_dir); mkpath($out_str_cache_dir) unless ( -e $out_str_cache_dir and -d _ ); set_scalar_by_name( 'CACHE_DIR', $cache_dir ); intercn( sprintf( 'Cache directory: %s', get_scalar_by_name('CACHE_DIR') ) ); $db_file = catfile( $config_path, "$exec_file.sqlite" ) if !($db_file); my $out_str_db_file = out_str($db_file); $recreate_db = 1 unless ( -e $out_str_db_file and -f _ ); #$db_file=filename_to_unicode($db_file); intercn( sprintf( 'Database file: %s', $db_file ) ); set_scalar_by_name( 'DB', DBI->connect( "dbi:SQLite:dbname=" . $db_file ) ) or die "Couldn't connect to database: " . DBI->errstr; my $DB = get_scalar_by_name('DB'); #print "$gdata{DB}->{sqlite_version}\n"; #intercn($DBD::SQLite::VERSION); if ( $DBD::SQLite::VERSION ge '1.26_06' ) { #intercn('greater'); $DB->{sqlite_unicode} = 1; } else { #intercn('lesser'); $DB->{unicode} = 1; } $DB->{FetchHashKeyName} = 'NAME_lc'; #$gdata{DB}->{unicode} = 1; #intercn( "$db_file\n", 1 ); if ($recreate_db) { intercn('recreate_db'); recreate_db($db_file); } PSH::Stocks::load(); set_scalar_by_name( 'Images_ShowHidden', FALSE ); set_scalar_by_name( 'LAST_USED_DIRECTORY', get_setting( 'Global', 'last_used_directory' ) ); set_scalar_by_name( 'DEBUG_LEVEL', get_setting( 'Global', 'debug_level' ) || 0 ); set_scalar_by_name( 'DEBUG_OUTPUT', get_setting( 'Global', 'debug_output' ) ); set_scalar_by_name( 'THUMBNAIL_SIZE', get_setting( 'Global', 'thumbnail_size' ) ); set_scalar_by_name( 'IP_CopyTitle', get_setting( 'GTK_chb_IP_CopyTitle', 'active' ) ); set_scalar_by_name( 'IP_CopyrightDefault', get_setting( 'GTK_chb_IP_CopyrightDefault', 'active' ) ); set_scalar_by_name( 'IP_AutoSave', get_setting( 'GTK_chb_IP_AutoSave', 'active' ) ); #print "$recreate_db\n"; #print Glib::get_user_config_dir . "\n"; #print Glib::get_user_data_dir . "\n"; #print Glib::get_home_dir . "\n"; #print Glib::get_user_config_dir . "\n"; #foreach my $val (Glib::get_system_config_dirs){ #print "$val\n"; #} return $result; } sub fin_layout { my $DB = get_scalar_by_name('DB'); $DB->rollback(); set_setting( 'GTK_wndMain', 'default_width', get_scalar_by_name('wndMain_width') ); set_setting( 'GTK_wndMain', 'default_height', get_scalar_by_name('wndMain_height') ); set_setting( 'GTK_vpnMain', 'position', get_gtk_widget_by_name('vpnMain')->get_position ); set_setting( 'GTK_hpnPics', 'position', get_gtk_widget_by_name('hpnPics')->get_position ); set_setting( 'Global', 'last_used_directory', get_scalar_by_name('LAST_USED_DIRECTORY') ); set_setting( 'GTK_chb_IP_CopyTitle', 'active', get_scalar_by_name('IP_CopyTitle') ); set_setting( 'GTK_chb_IP_AutoSave', 'active', get_scalar_by_name('IP_AutoSave') ); set_setting( 'GTK_chb_IP_CopyrightDefault', 'active', get_scalar_by_name('IP_CopyrightDefault') ); set_setting( 'Global', 'debug_level', get_scalar_by_name('DEBUG_LEVEL') ); set_setting( 'Global', 'debug_output', get_scalar_by_name('DEBUG_OUTPUT') ); set_setting( 'Global', 'thumbnail_size', get_scalar_by_name('THUMBNAIL_SIZE') ); } sub delete_images_registration { my $icv = get_gtk_widget_by_name('icvRegistration'); my $lst = get_gtk_widget_by_name('lstRegistration'); my @rowrefs; foreach my $path ( $icv->get_selected_items ) { push( @rowrefs, Gtk2::TreeRowReference->new( $lst, $path ) ); } foreach my $rowref (@rowrefs) { $lst->remove( $lst->get_iter( $rowref->get_path ) ); } } sub fin { fin_layout; PSH::GUI::vbxPics::auto_save_image_properties; Gtk2->main_quit(); get_scalar_by_name('DB')->disconnect(); } #Event handlers sub on_wndMain_configure_event { my $widget = shift; my $event = shift; my $data = shift; #print $event->width . ';' . $event->height . "\n"; set_scalar_by_name( 'wndMain_width', $event->width ); set_scalar_by_name( 'wndMain_height', $event->height ); return FALSE; } sub on_wndMain_destroy { fin; } sub on_btnDelete_Registration_Images_clicked { delete_images_registration(); } #Create interface sub create_stub { my $result; #$gdata->{GTK}->{txvLog}=$result; return $result; } sub create_scwLog { my $result; $result = Gtk2::VBox->new( FALSE, 0 ); my $scwLog = PSH::GUI::Utils::create_ScrolledWindow; my $txvLog = name_gtk_widget( 'txvLog', Gtk2::TextView->new ); $txvLog->set_editable(FALSE); $txvLog->set_cursor_visible(FALSE); $txvLog->set_wrap_mode('none'); $scwLog->add($txvLog); $scwLog->set_size_request( -1, -1 ); my $pbar = name_gtk_widget( 'pbarMain', Gtk2::ProgressBar->new); #$pbar->set_fraction(0.5); $result->pack_start( $scwLog, TRUE, TRUE, 0 ); $result->pack_start( $pbar, FALSE, TRUE, 0 ); return $result; } sub create_vbx_Image_Selection_Creator { my $result; $result = name_gtk_widget( 'vbx_Image_Selection_Creator', Gtk2::VBox->new( FALSE, 0 ) ); #$result->pack_start( create_tlbImages, FALSE, TRUE, 0 ); #$result->pack_start( create_hpnMain, TRUE, TRUE, 0 ); return $result; } sub create_hpnPics { my $result; $result = name_gtk_widget( 'hpnPics', Gtk2::HPaned->new ); $result->pack1( PSH::GUI::ntbPics::create, FALSE, FALSE ); $result->pack2( PSH::GUI::vbxPics::create, TRUE, TRUE ); #$result->set_position(100); $result->set_position( get_setting( 'GTK_hpnPics', 'position' ) ); return $result; } sub create_ntbMain { my $result; $result = name_gtk_widget( 'ntbMain', Gtk2::Notebook->new ); $result->append_page( create_hpnPics, get_strres('Pics') ); #$result->pack_start( create_hpnMain, TRUE, TRUE, 0 ); #$result->pack_start( create_tlb, TRUE, TRUE, 0 ); return $result; } sub create_vpnMain { my $result; $result = name_gtk_widget( 'vpnMain', Gtk2::VPaned->new ); $result->pack1( create_ntbMain, TRUE, FALSE ); $result->pack2( create_scwLog, TRUE, TRUE ); #$result->pack2( create_expLog, TRUE, FALSE ); #$result->modify_base('normal', Gtk2::Gdk::Color->parse('green')); $result->set_position( get_setting( 'GTK_vpnMain', 'position' ) ); return $result; } sub create_wndMain { my $result; $result = name_gtk_widget( 'wndMain', Gtk2::Window->new('toplevel') ); $result->set_default_size( get_setting( 'GTK_wndMain', 'default_width' ), get_setting( 'GTK_wndMain', 'default_height' ) ); $result->set_position('GTK_WIN_POS_CENTER'); $result->add(create_vpnMain); #$result->set_title( 'PhotoStock Helper v' . cstrVersion ); $result->signal_connect( destroy => \&on_wndMain_destroy, $result ); $result->signal_connect( configure_event => \&on_wndMain_configure_event, $result ); #$result->modify_bg('normal',Gtk2::Gdk::Color->parse( 'green')); return $result; } sub main { my $wndMain; if (init) { $wndMain = create_wndMain; $wndMain->show_all(); #~ foreach my $val ( sort Gtk2::Stock->list_ids ) { #~ intercn($val); #~ } Gtk2->main(); } } main(); #~ foreach my $key (keys %ENV){ #~ print "$key=$ENV{$key}\n"; #~ } exit(0);