#!/usr/bin/env perl use strict; use warnings; use autodie; use File::Spec; use Image::ExifTool; use Tk; use Tk::LabFrame; use Tk::GridColumns; build_gui(MainWindow::->new); MainLoop; sub build_gui { my ($mw) = @_; $mw->geometry('400x500+50+50'); build_ctrl($mw); { my $exif_data = {}; my ($gc, @gdata); build_menu($mw, \$exif_data, \$gc, \@gdata); build_grid($mw, \$gc, \@gdata); } } sub build_menu { my ($mw, $exif_data_ref, $gc_ref, $gdata_ref) = @_; my $frame = $mw->LabFrame(-label => 'Menu', -labelside => 'acrosstop') ->pack(-fill => 'x'); my $dir_frame = $frame->Frame->pack(-fill => 'x'); my $ext_frame = $frame->Frame->pack(-fill => 'x'); my $pop_frame = $frame->Frame->pack(-fill => 'x'); my $directory = 'pm_1201345_test_files'; my $extensions = ''; $dir_frame->Label(-text => 'Directory: ')->pack(-side => 'left'); $dir_frame->Label(-textvariable => \$directory)->pack(-side => 'left'); $ext_frame->Label(-text => 'Extensions: ')->pack(-side => 'left'); $ext_frame->Entry(-textvariable => \$extensions)->pack(-side => 'left'); $pop_frame->Button(-text => 'Populate Grid', -command => sub { _get_exif_data($exif_data_ref, \$directory, \$extensions); _populate_grid(\$gdata_ref, $exif_data_ref, \$directory, \$extensions); $$gc_ref->refresh; })->pack(-side => 'left'); return; } sub build_grid { my ($mw, $gc_ref, $gdata_ref) = @_; my $frame = $mw->LabFrame(-label => 'Grid', -labelside => 'acrosstop') ->pack(-fill => 'both', -expand => 1); my @cols; $$gc_ref = $frame->GridColumns(-data => $gdata_ref, -columns => \@cols) ->pack(-fill => 'both', -expand => 1); @cols = ( { -text => 'Pathname', -weight => 1 }, { -text => 'File Type' }, ); $$gc_ref->refresh; return; } sub build_ctrl { my ($mw) = @_; my $frame = $mw->LabFrame(-label => 'Controls', -labelside => 'acrosstop') ->pack(-side => 'bottom', -fill => 'x'); $frame->Button(-text => 'Exit', -command => sub { exit })->pack; return; } { my $exif; BEGIN { $exif = Image::ExifTool::->new } sub _get_exif_data { my ($exif_data, $dir, $exts) = map { $$_ } @_; my @unseen_exts = grep { ! exists $exif_data->{$dir}{$_} } split ' ', $exts; return unless @unseen_exts; my $ext_re = '[.](' . join('|', @unseen_exts) . ')$'; { opendir(my $dh, $dir); while (readdir $dh) { next unless /$ext_re/; my $path = File::Spec::->catfile($dir, $_); $exif->ExtractInfo($path); $exif_data->{$dir}{$1}{$path} = $exif->GetValue('FileType'); } } return; } } sub _populate_grid { my ($gdata_ref, $exif_data, $dir, $exts) = map { $$_ } @_; @$gdata_ref = (); for my $ext (sort split ' ', $exts) { for my $path (sort keys %{$exif_data->{$dir}{$ext}}) { push @$gdata_ref, [$path, $exif_data->{$dir}{$ext}{$path}]; } } return; }