
#!/bin/sh
# This line makes the next one a comment in Tcl \
exec wish "$0" ${1+"$@"}
#/usr/bin/wish

# SKuvaInfo - Valokuvien tiedot talteen
 
# Apuna kaytetty:
# - Frenzy's Pic(k)tOrama V251214 Written 25.12.2014 by: Jens Timmermann
# - https://wiki.tcl-lang.org/page/Capture+a+window+into+an+image (7.5.2026) 
#
# (C) 2026 Jorma Sajaniemi

# 27.05.2026 1.0.0
# - Ensimmainen julkistettu versio
# 28.05.2026 1.0.1
# - Lisatty kauttaviiva kotihakemiston loppuun, jos asetustiedostossa olemattoman hakemiston nimi
# 30.05.2026 1.0.2
# - Korjattu edellisen sivuvaikutus perumiseen ensimmaisessa aloittamisessa
# 28.06.2026 1.0.3
# - Muutettu Avaa kuva -toiminto nayttamaan oletusarvoisesti kaikki kuvat
# - Korjattu paakuvasta lsort:illa kauaksi joutuvan infokuvan sijainti tiedostolistauksessa
# - Lisatty kirjoitushistorian lukemisen kestavyytta historiatiedoston rakennevirheille
# 28.06.2026 1.0.4
# - Lisatty varmistus infokuvan kirjoituskansiolle
# 28.06.2026 1.0.5
# - Toteutettu edellinen initialdir-optiolla
# 01.07.2026 1.1.0
# - Lisatty mahdollisuus antaa tiedostonimi komentoriviparametrina
# - Pakotettu asetus- ja kirjoitushistoriatiedostot ISO8859-1 -koodistoon
# - Lisatty lopetushetken tekstit kirjoitushistoriaan
# 02.07.2026 1.1.1
# - Korjattu tyhjan kuvan virhe

# Global Variable of OpperatingSystem:

set system $tcl_platform(os)
# set homeDir [string trimright [pwd] /]
set reso {800 600}
set version "1.1.1"


#Set Packages
package require Img

# if {![info exists starkit::topdir]} {
#       #LoadProcedures (only when startet from Wish)
#        if {[catch {source $homeDir/PIRGFX.tcl}]!=0} {puts "PIRGFX"; break}
#        if {[catch {source $homeDir/PIRAPP.tcl}]!=0} {puts "PIRAPP"; break}
#        set exe 0
# } else {
#       #Only within executable StartKit
#	catch {package require PIRGFX}
#       catch {package require PIRAPP}
#	set exe 1
# }


# ---------------------------------------------------------------
# ---------------------------------------------------------------
# Globaalit muuttujat
# ---------------------------------------------------------------
# ---------------------------------------------------------------

set asetusTied "$::env(HOME)/SKuvaInfo_Asetukset.txt"
set historiaTied "$::env(HOME)/SKuvaInfo_Historia.txt"

set imgluettu [image create photo]
set imgzoomattu [image create photo]

set fidx 0

# Kuvatiedostotyypit:

set kuvatyypit {
  {{Kuvat} {.jpg}}
  {{Kuvat} {.jpeg}}
  {{Kuvat} {.png}}
  {{Kuvat} {.gif}}
  {{Kuvat} {.bmp}}
  {{Kaikki tiedostot} *}
}

set aitoKuva 1
set infoAnnettu 0
set alkupOtsikko ""
set alkupTeksti ""

set sovituszoom 1
set zoomtaso 1
set zoomkokokuva 0

# ---------------------------------------------------------------
# ---------------------------------------------------------------
# Proseduurit
# ---------------------------------------------------------------
# ---------------------------------------------------------------

 proc CaptureWindow {win {baseImg ""} {px 0} {py 0}} {
   # create the base image of win (the root of capturing process)
   if {$baseImg eq ""} {
     set baseImg [image create photo -format window -data $win]
   }
   # paste images of win's children on the base image
   foreach child [winfo children $win] {
     if {![winfo ismapped $child]} continue
     set childImg [image create photo -format window -data $child]
     regexp {\+(\d*)\+(\d*)} [winfo geometry $child] -> x y
     $baseImg copy $childImg -to [incr x $px] [incr y $py]
     image delete $childImg
     CaptureWindow $child $baseImg $x $y
   }
   return $baseImg
 }

proc infonimi {fn} {
   set piste [string last "." $fn]
   if {$piste<0} {
       set tiedosto "0000__info.png"
   } else {
       set tiedosto [string range $fn 0 [expr $piste - 1]]
       append tiedosto "__info.png"
   }
   return $tiedosto
}

proc windowToFile { win } {

   global fn dir historia tiedostolista
   
   set tiedosto [infonimi $fn]

   .pane.oikea.napattava configure -bg #c9b854
   .pane.oikea.napattava.otsikko configure -state disabled -bg #e9d874 -fg black
   .pane.oikea.napattava.teksti configure -state disabled -bg #e9d874 -fg black
   .pane.oikea.napattava.picture.img configure -bg #e9d874
   update

   set image [CaptureWindow $win]

   set types {{"Image Files" {.png}}}

   set filename [tk_getSaveFile -filetypes $types \
                                -initialdir $dir \
                                -initialfile $tiedosto \
                                -defaultextension .png]

   .pane.oikea.napattava configure -bg #86b300
   .pane.oikea.napattava.otsikko configure -state normal -bg #ffffff -fg grey
   .pane.oikea.napattava.teksti configure -state normal -bg #ffffff -fg grey
   .pane.oikea.napattava.picture.img configure -bg #ffffff

   if {[llength $filename]} {
       $image write -format png $filename
       image delete $image
       tiedotHistoriaan "$dir$fn" [.pane.oikea.napattava.otsikko get 0.1 end] [.pane.oikea.napattava.teksti get 0.1 end]
       
       # set fn $filename
       aseta_tiedostolista
      .nfo.dir configure -text " $dir "

      poimiAlkup
      step 1

   } else {
       image delete $image
       return
   }

 }

# ---------------------------------------------------------------

# Kirjoitushistoria:

set historia [dict create]

proc tyhjennaHistoria {} {
     global historia aitoKuva
     set historia [dict create]
    if {! $aitoKuva} {
      .pane.oikea.bbar.tallenna configure -state disable -text "Ei kirjoitushistoriassa"
    }
}

proc tiedotHistoriaan {k o t} {
     global historia
     if {$k != "viim"} {
         set pngNimi [infonimi $k]
     } else {
         set pngNimi $k
     }
     dict set historia $pngNimi Kuva $k
     dict set historia $pngNimi Otsikko $o
     dict set historia $pngNimi Teksti $t
}

proc kirjoitaHistoria {} {
    global historia version historiaTied
    .pane.oikea.napattava.inforivi.clue configure -text "Tallennetaan kirjoitushistoria ..."
    tiedotHistoriaan "viim" [.pane.oikea.napattava.otsikko get 0.1 end] [.pane.oikea.napattava.teksti get 0.1 end]
    set fileId [open $historiaTied "w"]
    fconfigure $fileId -encoding iso8859-1
    puts $fileId "SKuvaInfo v. $version -- Tee muutoksia vain jos olet varma asiastasi !"
    dict for {avain arvo} $historia {
       dict with arvo {
          puts $fileId "#@Kuva:\n$Kuva"
          puts $fileId "#@Otsikko:\n$Otsikko"
          puts $fileId "#@Teksti:\n$Teksti"
       }
    }
    puts $fileId "#@Loppu\n"
    close $fileId
    .pane.oikea.napattava.inforivi.clue configure -text " "
}

proc trimmaaEnd {str} {
   return [string range $str 0 [expr [string length $str]-2]]
}

proc lueHistoria {} {
     global historia historiaTied
     if {[file isfile $historiaTied]} {
        .pane.oikea.napattava.inforivi.clue configure -text "Ladataan kirjoitushistoria ..."
        set fileId [open $historiaTied "r"]
	fconfigure $fileId -encoding iso8859-1
	set rivit [split [read $fileId] "\n"]
	close $fileId
	set tilanne 0
	set otsikko ""
	set teksti ""
        .pane.oikea.napattava.teksti insert end "\n"
	foreach rivi $rivit {

	    if {[string equal -length 3 $rivi "#@K"]} {
		if {$tilanne} {
		  set teksti [trimmaaEnd $teksti]
		  tiedotHistoriaan $kuva $otsikko $teksti
	          set otsikko ""
	          set teksti ""
		}
		set tilanne 1

	    } elseif {[string equal -length 3 $rivi "#@O"]} {
		set tilanne 2
		set otsikko ""

	    } elseif {[string equal -length 3 $rivi "#@T"]} {
		set otsikko [trimmaaEnd $otsikko]
		set tilanne 3
		set teksti ""

	    } elseif {[string equal -length 3 $rivi "#@L"]} {
		if {$tilanne == 3} {
		  set teksti [string range $teksti 0 [expr [string length $teksti]-2]]
		  tiedotHistoriaan $kuva $otsikko $teksti
		}
                .pane.oikea.napattava.inforivi.clue configure -text " "
		return

	    } else {
	        if {$tilanne == 1} {
		   set kuva $rivi
		} elseif {$tilanne == 2} {
		   if {$otsikko == ""} {
		      set otsikko "$rivi\n"
		   } else {
		      set otsikko "$otsikko$rivi\n"
		   }
		} elseif {$tilanne == 3} {
		   if {$teksti == ""} {
		      set teksti "$rivi\n"
		   } else {
		      set teksti "$teksti$rivi\n"
		   }
		}
	    }
	}
        .pane.oikea.napattava.inforivi.clue configure -text " "
	update
     }
}

proc lopetus {} {
    global aitoKuva dir asetusTied
    if {$aitoKuva} {
       if {[muutosPeruminen 1]} {
	  poimiAlkup
          return
        }
    }
    kirjoitaHistoria
    writeFile $asetusTied [string trimright $dir /]/
    exit
}

proc menuTyhjennys {} {
    set vastaus [tk_messageBox -title "Kirjoitushistorian tyhjennys" -message "Olet poistamassa kaikki tiedot kirjoitushistoriasta!\n\nJatketaanko?" -icon warning -type okcancel]
    if {"{$vastaus}" == "{cancel}"} {
	   tk_messageBox -icon info -type ok -title "Toiminto peruttu" -message "Kirjoitushistoria ennallaan."
    } else {
           tyhjennaHistoria
	   tk_messageBox -icon info -type ok -title "Kirjoitushistorian tyhjennys" -message "Kirjoitushistoria tyhjennetty."
    }
}

# ---------------------------------------------------------------

# Kuvien ja hakemistojen kasittely:

proc writeFile {filename inhalt} {
	if {![catch {open $filename "w"} write]} {
                fconfigure $write -encoding iso8859-1
		puts $write $inhalt
		close $write
	}
}

proc setImg {} {
      global tiedostolista dir fn fidx imgzoomattu imgluettu zoomkokokuva historia aitoKuva
      .pane configure -cursor watch
      .pane.oikea.napattava.inforivi.clue configure -text "Ladataan ..."
      .pane.oikea.napattava.inforivi.fname configure -text "$fn"

      $imgluettu blank
      if {[catch {$imgluettu configure -file $fn}]} {
         .pane.vasen.files.liste selection set $fidx
         .pane.vasen.files.liste see $fidx
         $imgzoomattu blank
         .pane configure -cursor arrow
         .pane.oikea.napattava.inforivi.clue configure -text "Virhe: "
         .pane.oikea.napattava.inforivi.size configure -text " x "
         .pane.oikea.napattava.picture.img yview moveto 0.0
         .pane.oikea.napattava.picture.img xview moveto 0.0
         return
      }
      set x [image width $imgluettu]
      set y [image height $imgluettu]
      if {$fn==""} {
         .pane.oikea.napattava.inforivi.size configure -text " x "
      } else {
         .pane.oikea.napattava.inforivi.size configure -text "$x x $y"
      }
      .pane.vasen.files.liste selection set $fidx $fidx
      .pane.vasen.files.liste see $fidx

       set zoomkokokuva 1
       sovitus

      .pane configure -cursor arrow
       if {[string match "*__info.png" $fn]} {
	    set aitoKuva 0
            .pane.oikea.napattava configure -bg #c9b854
            .pane.oikea.napattava.picture.img configure -bg #e9d874
            .pane.oikea.napattava.inforivi.clue configure -text " "
	    .pane.oikea.bbar.tallenna configure -bg #e9d874
	    if {[dict exists $historia "$dir$fn"]} {
	        .pane.oikea.bbar.tallenna configure -state normal -text "Poimi kirjoitushistoriasta"
	    } else {
	        .pane.oikea.bbar.tallenna configure -state disable -text "Ei kirjoitushistoriassa"
	    }
       } else {
	    set aitoKuva 1
            .pane.oikea.napattava configure -bg #86b300
            .pane.oikea.napattava.picture.img configure -bg #ffffff
            .pane.oikea.napattava.inforivi.clue configure -text " "
	    .pane.oikea.bbar.tallenna configure -bg gray90
	    .pane.oikea.bbar.tallenna configure -state normal -activebackground gray48 -text "Tallenna infokuvaksi"
       }

	if {$fidx == 0} {
	    .pane.oikea.bbar.back configure -state disabled
        } else {
	    .pane.oikea.bbar.back configure -state normal
	}
	if {$fidx >= [llength $tiedostolista] - 1} {
	    .pane.oikea.bbar.next configure -state disabled
        } else {
	    .pane.oikea.bbar.next configure -state normal
	}

	poimiAlkup
}

proc poimiAlkup {} {
	global alkupOtsikko alkupTeksti
	set alkupOtsikko [.pane.oikea.napattava.otsikko get 0.1 end]
	set alkupTeksti [.pane.oikea.napattava.teksti get 0.1 end]
}

proc sovitus {} {

       global imgzoomattu imgluettu zoomtaso sovituszoom

       # Alkuzoomauksen laskeminen !!!

       set x [image width $imgluettu]
       set y [image height $imgluettu]

       update
       set winx [winfo width .pane.oikea.napattava.picture.img]
       set winy [winfo height .pane.oikea.napattava.picture.img]

       set xzoom [expr ($x / $winx) + 1]
       set yzoom [expr ($y / $winy) + 1]
       if {$yzoom > $xzoom} {set xzoom $yzoom}
       set sovituszoom $xzoom
       set zoomtaso $xzoom

       kuvaEsille $zoomtaso

}

proc zoommuutos {muutos} {
    global zoomtaso zoomkokokuva
    set uusizoom [expr $zoomtaso + $muutos]
    if {$uusizoom >= 1 && $uusizoom <= 40} {
       set zoomtaso $uusizoom
       kuvaEsille $zoomtaso
    }
    set zoomkokokuva 0
}

proc zoomJuuEi {} {
    global zoomtaso zoomkokokuva sovituszoom
    if {$zoomkokokuva} {
      if {$zoomtaso == $sovituszoom && $zoomtaso > 1} {
          set zoomtaso [expr $zoomtaso - ($zoomtaso / 2)]
      }
      set zoomaus $zoomtaso
    } else {
      set zoomaus $sovituszoom
    }
    kuvaEsille $zoomaus
    set zoomkokokuva [expr 1-$zoomkokokuva]

}

proc kuvaEsille {zoomaus} {
       global imgluettu imgzoomattu zoomtaso sovituszoom
       $imgzoomattu blank
       if {$zoomaus != $sovituszoom} {
          $imgzoomattu copy $imgluettu -subsample $zoomaus $zoomaus
       } else {
          $imgzoomattu copy $imgluettu -subsample $zoomaus $zoomaus
      }
      .pane.oikea.napattava.picture.img yview moveto 0.0
      .pane.oikea.napattava.picture.img xview moveto 0.0
      if {$zoomtaso == 1} {
         .pane.oikea.bbar.zoomin configure -state disabled
      } else {
         .pane.oikea.bbar.zoomin configure -state normal
      }
      if {$zoomtaso == 40} {
         .pane.oikea.bbar.zoomout configure -state disabled
      } else {
         .pane.oikea.bbar.zoomout configure -state normal
      }
}

proc muutosPeruminen {lopetus} {
	global alkupOtsikko alkupTeksti aitoKuva infoAnnettu
	set Otsikko [.pane.oikea.napattava.otsikko get 0.1 end]
	set Teksti [.pane.oikea.napattava.teksti get 0.1 end]
	if {([string length [string trim $Otsikko]] == 0 && [string length [string trim $Teksti]] == 0) || ([string equal $Otsikko $alkupOtsikko] && [string equal $Teksti $alkupTeksti])} {
	    return 0
	}
	if ($aitoKuva) {
           if {$lopetus} {
             set verbi "Lopeta"
             set substantiivi "lopetus"
           } else {
             set verbi "Siirry"
             set substantiivi "siirtyminen"
           }
	   set vastaus [tk_messageBox -title "Tallentamattomia muutoksia!" -message "Tekstimuutoksia ei ole tallennettu!\n\nOK: $verbi silti\nPeruuta: Peru $substantiivi" -icon warning -type okcancel]
           return [expr  "{$vastaus}" == "{cancel}"]
	}
        if {! $infoAnnettu} {
	   tk_messageBox -icon info -type ok -title "Tallentamattomia muutoksia!" -message "Vihje: Infokuvan kohdalla tehdyt muutokset voi tallentaa vain varsinaisen kuvan kohdalla.\n"
           set infoAnnettu 1
	}
	return 0
}

proc step {fwd} {
        global tiedostolista fn fidx
	if {[muutosPeruminen 0]} {return}
        set dummy 0
        .pane.vasen.files.liste selection clear 0 [llength $tiedostolista]
        if $fwd {
                if {$fidx < [llength $tiedostolista]} {
                      set fidx [expr $fidx + 1]
                      set fn [lindex $tiedostolista $fidx]
                }
        } else {
                if {$fidx > 0} {
                      set fidx [expr $fidx - 1]
                      set fn [lindex $tiedostolista $fidx]
                }
        }
        setImg
}

proc aseta_tiedostolista {} {
     global tiedostolista
     #set tiedostolista [lsort [glob -nocomplain *.tbg *.tif *.gif *.jpg *.jpeg *.png *.pcx *.tga *.bmp *.xbm *.xpm]]
     set tiedostolista [lsort [glob -nocomplain *.gif *.jpg *.jpeg *.png *.bmp ]]
     set lngth [llength $tiedostolista]
     if {$lngth > 1} {
	# Eka ei voi siirtaa, eika myoskaan tokaa, joten aloitetaan kolmannesta
        set edellisen_infonimi [infonimi [lindex $tiedostolista 1]]
	for {set x 2} {$x<$lngth} {incr x} {
	    set nykyinen [lindex $tiedostolista $x]
            if {[string match "*__info.png" $nykyinen]} {
	       if {[string compare $edellisen_infonimi $nykyinen]} {
	            # Ei ole alkuperaisen perassa, siis etsi alkuperainen ja siirra sen peraan
		    set tamako [expr $x - 2]
		    while {$tamako >= 0} {
	                   if {[string compare [infonimi [lindex $tiedostolista $tamako]] $nykyinen] == 0} {
				set tiedostolista [lreplace $tiedostolista $x $x]
				set tiedostolista [linsert $tiedostolista [expr $tamako + 1] $nykyinen]
				set tamako 0
			   }
		           incr tamako -1
		    }
	       }
	    }
            set edellisen_infonimi [infonimi $nykyinen]
	}
     }
     .nfo.count configure -text "Kansiossa [llength $tiedostolista] kuvatiedostoa"
}

proc setDir {kysy} {
     global dir imgzoomattu tiedostolista fn fidx

     if {$kysy} {
       set newdir [string trimright [tk_chooseDirectory -mustexist 1 -initialdir $dir]]
       if {$newdir == ""} {
            return
       }
       set dir "$newdir/"
     }
     cd $dir
     aseta_tiedostolista
     set fn [lindex $tiedostolista 0]
     set fidx 0
     .nfo.dir configure -text " $dir "
     .pane.vasen.files.liste selection clear 0 [llength $tiedostolista]
     if {$kysy} {
        if {[llength $tiedostolista] <=0} {
           $imgzoomattu blank
	   update
           tk_messageBox -icon warning -title "Valitse kuvahakemisto" -message "Ei kuvia !\nValitse hakemisto, jossa on kuvia." -type ok
        }
     setImg
     }
}

proc avaaKuva {kysy} {
     global kuvatyypit dir imgzoomattu tiedostolista fn fidx newfile

     if {$kysy} {
       set newfile [string trimright [tk_getOpenFile -title "Valitse kuva" -filetypes $kuvatyypit -initialdir $dir]]
     }
     if {$newfile == ""} {return}

     set piste [string last "." $newfile]
     if {$piste<0} {return}
     set tyyppi [string tolower [string range $newfile $piste end]]
     if {$tyyppi != ".jpg" && $tyyppi != ".jpeg" && $tyyppi != ".png" && $tyyppi != ".gif" && $tyyppi != ".bmp"} {
        tk_messageBox -icon warning -title "Ei-tuettu tyyppi" -message "Kuvan tyyppi ei ole tuettu.\nValitse kuva, jonka tyyppi on JPEG, PNG, GIF tai BMP." -type ok
        return
     }

     set piste [string last "/" $newfile]
     if {$piste<0} {return}
     set dir [string range $newfile 0 [expr $piste - 1]]
     append dir "/"
     set fn [string range $newfile [expr $piste + 1] end]

     cd $dir
     aseta_tiedostolista

     set fidx [lsearch $tiedostolista $fn]
     # set fn [lindex $tiedostolista $fidx]

     .nfo.dir configure -text " $dir "
     .pane.vasen.files.liste selection clear 0 [llength $tiedostolista]
     setImg
}

proc tallennaTaiHistoriasta {} {
   global aitoKuva dir fn historia

   if {$aitoKuva} {
	poimiAlkup
	windowToFile .pane.oikea.napattava
   } else {
      .pane.oikea.napattava.otsikko delete 0.1 end 
      .pane.oikea.napattava.otsikko insert end [trimmaaEnd [dict get $historia "$dir$fn" Otsikko]]
      .pane.oikea.napattava.teksti delete 0.1 end 
      .pane.oikea.napattava.teksti insert end [trimmaaEnd [dict get $historia "$dir$fn" Teksti]]
      poimiAlkup
      step 0
   }
}


# ---------------------------------------------------------------

# Kayttoliittyma esiin:

# Create TopLevelWindow (Form)
wm title . "SKuvaInfo - Valokuvien tiedot talteen"
wm iconname . "SKuvaInfo"
wm protocol . WM_DELETE_WINDOW lopetus
# wm minsize . 950 800
# wm geometry . [regsub { } $reso {x}]
wm geometry . "1100x900"

#Build Menus
frame .mbar -borderwidth 2 -relief groove
pack .mbar -side top -fill both

# MenuFile

menubutton .mbar.file -text "Tiedosto" -menu .mbar.file.m -relief flat
set m [menu .mbar.file.m -tearoff 0]
$m add command -label "Avaa kuva" -command "avaaKuva 1"
$m add command -label "Avaa kansio" -command "setDir 1"
$m add separator
$m add command -label "Kirjoitushistorian tyhjennys" -command menuTyhjennys
$m add separator
$m add command -label "Lopeta" -command lopetus

#MenuHelp

menubutton .mbar.help -text "Ohje" -menu .mbar.help.m -relief flat
set m [menu .mbar.help.m -tearoff 0]
$m add command -label "Ohje" -command {
   tk_messageBox -icon info -title "Ohje" -message "
Valitse kuva ja zoomaa haluamaasi kokoon.\n\
Kirjoita kuvan esittelytekstit ja tallenna.\n\
Tallennettavan tiedoston oletusnimi on <alkup tiedoston nimi>__info.png.\n\n\
Ohjelma ei tee muutoksia varsinaisiin kuvatiedostoihin.\n\
" -type ok
}
$m add command -label "Tietoja" -command {
   tk_messageBox -icon info -title "Tietoja" -message "SKuvaInfo v. $version\n\n(c) 2026 Jorma Sajaniemi" -type ok
}

pack .mbar.file .mbar.help -side left -padx 2

#Info Line
frame .nfo
label .nfo.huomautus -relief flat -text " " -anchor center
label .nfo.count -text " "
button .nfo.dir -relief raised -borderwidth 2 -padx 2 -pady 2 -text " " -command "setDir 1"
pack .nfo.huomautus -side right -expand yes
pack .nfo.dir .nfo.count -side left -fill x
pack .nfo -side top -fill x

#PanedFrame
panedwindow .pane -sashwidth 6 -sashrelief ridge
pack .pane -side top -expand yes -fill both

# Vasen palsta

frame .pane.vasen

#FileList
frame .pane.vasen.files
listbox .pane.vasen.files.liste -listvariable tiedostolista -yscroll ".pane.vasen.files.scroll set" -selectmode single -exportselection false -activestyle none -relief sunken -width 46
scrollbar .pane.vasen.files.scroll -relief sunken -command ".pane.vasen.files.liste yview"
pack .pane.vasen.files.scroll -side right -fill y
pack .pane.vasen.files.liste -side left -expand true -fill both

.pane.vasen.files.liste selection set 0 0

# Oikea palsta

frame .pane.oikea

panedwindow .pane.oikea.napattava -relief flat -bd 14 -bg #86b300 -orient vertical

#Image
frame .pane.oikea.napattava.picture
text .pane.oikea.napattava.picture.img -yscrollcommand ".pane.oikea.napattava.picture.scrollY set" -xscrollcommand ".pane.oikea.napattava.picture.xfill.scrollX set" -state disabled -background white -selectbackground white -relief sunken -padx 2 -cursor arrow
.pane.oikea.napattava.picture.img image create end -image $imgzoomattu

scrollbar .pane.oikea.napattava.picture.scrollY -command ".pane.oikea.napattava.picture.img yview"
frame .pane.oikea.napattava.picture.xfill
scrollbar .pane.oikea.napattava.picture.xfill.scrollX -orient horiz -command ".pane.oikea.napattava.picture.img xview"
frame .pane.oikea.napattava.picture.xfill.filler -height 16 -width 16
pack .pane.oikea.napattava.picture.xfill.filler -side right
pack .pane.oikea.napattava.picture.xfill.scrollX -side left -expand true -fill x
pack .pane.oikea.napattava.picture.xfill -side bottom -fill x
pack .pane.oikea.napattava.picture.scrollY -side right -fill y
pack .pane.oikea.napattava.picture.img -side left -expand true -fill both

pack .pane.oikea.napattava.picture -side top -expand true -fill both

# Tekstialueet

text .pane.oikea.napattava.otsikko -font {-family times -size 16} -height 2 -wrap word -fg grey
text .pane.oikea.napattava.teksti -font {-family times -size 12} -height 10 -wrap word -fg grey

pack .pane.oikea.napattava.otsikko -side top -fill x
pack .pane.oikea.napattava.teksti -side top -fill x

.pane.oikea.napattava.otsikko insert end "Kirjoita otsikko"
.pane.oikea.napattava.teksti insert end "Kirjoita tarkemmat tiedot"

# Inforivi

frame .pane.oikea.napattava.inforivi
label .pane.oikea.napattava.inforivi.size -relief groove -borderwidth 2 -padx 2 -text " [image width $imgluettu] x [image height $imgluettu] "
label .pane.oikea.napattava.inforivi.fname -relief groove -borderwidth 2 -padx 2 -text " "
label .pane.oikea.napattava.inforivi.clue -relief flat -text " " -anchor center
label .pane.oikea.napattava.inforivi.paivays -text [clock format [clock seconds] -format %d.%m.%Y]
label .pane.oikea.napattava.inforivi.ohjelma -text "        SKuvaInfo   v. $version" -font {-family times -size 10 -slant italic}

pack .pane.oikea.napattava.inforivi.size -side left
pack .pane.oikea.napattava.inforivi.fname -side left
pack .pane.oikea.napattava.inforivi.clue -side left -expand true
pack .pane.oikea.napattava.inforivi.ohjelma -side right
pack .pane.oikea.napattava.inforivi.paivays -side right
pack .pane.oikea.napattava.inforivi -side bottom -fill x

pack .pane.vasen.files -side left -fill both -expand true
pack .pane.oikea.napattava -side top -fill both -expand true
.pane.oikea.napattava add  .pane.oikea.napattava.picture .pane.oikea.napattava.otsikko .pane.oikea.napattava.teksti

#Bottomframe/Buttons

frame .pane.oikea.bbar -borderwidth 2
# button .pane.oikea.bbar.back -text " Back " -bg gray90 -command {step 0}
button .pane.oikea.bbar.zoomon -bg gray90 -text " Zoomaus / Koko kuva " -command {zoomJuuEi}
button .pane.oikea.bbar.zoomout -bg gray90 -text " Zoom - " -command {zoommuutos 1}
button .pane.oikea.bbar.zoomin -bg gray90 -text " Zoom + " -command {zoommuutos -1}
button .pane.oikea.bbar.back -bg gray90 -text " Edellinen " -state disabled -command {step 0}
button .pane.oikea.bbar.next -text " Seuraava " -command {step 1}
button .pane.oikea.bbar.tallenna -text "Tallenna infokuvaksi" -command tallennaTaiHistoriasta
pack .pane.oikea.bbar.zoomon .pane.oikea.bbar.zoomout .pane.oikea.bbar.zoomin .pane.oikea.bbar.back .pane.oikea.bbar.next .pane.oikea.bbar.tallenna -side left -expand true -fill x
pack .pane.oikea.bbar -side top -fill x

pack .pane.vasen .pane.oikea -side left -fill both -expand true -padx 2
.pane add .pane.vasen .pane.oikea


# ---------------------------------------------------------------

# Nappaintoiminnot:

#bind . <Configure> {
     #set reso [list [winfo width .] [winfo height .]]
#}
bind . <Pause> {wm iconify .}

#ListBox Selection
bind .pane.vasen.files.liste <<ListboxSelect>>  {
  if {! [muutosPeruminen 0]} {
    set fidx [.pane.vasen.files.liste curselection]
    set fn [lindex $tiedostolista $fidx]
    setImg
  }
}
#MousePressOverImage
bind .pane.oikea.napattava.picture.img <ButtonPress-2> {.pane.oikea.napattava.picture.img configure -cursor fleur}
bind .pane.oikea.napattava.picture.img <ButtonRelease-2> {.pane.oikea.napattava.picture.img configure -cursor arrow}
bind .pane.vasen.files <MouseWheel> {.pane.vasen.files.liste yview scroll [expr {int(pow(%D/-120,3))}] units}

focus -force .pane.vasen.files
#. configure -cursor icon


# ---------------------------------------------------------------
# ---------------------------------------------------------------
# Varsinainen toiminta alkaa:
# ---------------------------------------------------------------
# ---------------------------------------------------------------

update
lueHistoria

set dir [string map {\\ /} "$::env(HOME)"]
append dir "/"
set fn ""

if {$argc == 1} {
  setDir 0
  set arg [lindex $argv 0 ]
  set newfile [string map {\\ /} $arg ]
  # .pane.oikea.napattava.teksti insert end $newfile
  if {[file isfile $newfile]} {
     set piste [string last "." $newfile]
     if {$piste<0} {
         set tyyppi outo
      } else {
         set tyyppi [string tolower [string range $newfile $piste end]]
      }
     if {$tyyppi != ".jpg" && $tyyppi != ".jpeg" && $tyyppi != ".png" && $tyyppi != ".gif" && $tyyppi != ".bmp"} {
        tk_messageBox -icon warning -title "Ei-tuettu tyyppi" -message "Kuvan $arg tyyppi ei ole tuettu.\nValitse kuva, jonka tyyppi on JPEG, PNG, GIF tai BMP." -type ok
        exit
     }

     set tekstilahde " "
     if {[dict exists $historia [infonimi $newfile]]} {
        set tekstilahde [infonimi $newfile]
     } else {
       if {[dict exists $historia "viim"]} {
           set tekstilahde "viim"
       }
     }
     if {$tekstilahde != " "} {
          .pane.oikea.napattava.otsikko delete 0.1 end 
          .pane.oikea.napattava.otsikko insert end [trimmaaEnd [dict get $historia $tekstilahde Otsikko]]
          .pane.oikea.napattava.teksti delete 0.1 end 
          .pane.oikea.napattava.teksti insert end [trimmaaEnd [dict get $historia $tekstilahde Teksti]]
     }
     avaaKuva 0
  } else {
      tk_messageBox -icon warning -title "Ei kuvaa!" -message "$arg ei ole polkunimi kuvaan!" -type ok
      exit
  }

} else {

if {[file isfile $asetusTied]} {
	# On asetustiedosto
        set fileId [open $asetusTied "r"]
	set rivit [split [read $fileId] "\n"]
	close $fileId
	set dirnimi [string trim [lindex $rivit 0]]
	# dir luettu asetustiedostosta
	if {[file isdirectory $dirnimi]} {
	   set dir $dirnimi
	}
	# dir luettu asetustiedostosta tai kotihakemisto (jos asetustiedostossa ei kelvollisen hakemiston nimea)
	# .pane.oikea.napattava.teksti insert end " $dir "
        setDir 0
} else {
    set vastaus [tk_messageBox -title "Tervetuloa!" -message "Tervetuloa SKuvaInfon pariin!\n\nOhjelma on tehty rehellisin aikein, mutta sen toimivuudelle ei voida antaa takeita.\n\nJatketaanko?" -type okcancel]
    if {"{$vastaus}" == "{cancel}"} {
        exit
    }
   tk_messageBox -title "Aloitetaan!" -message "Aloita avaamalla jokin kuvatiedosto." -type ok
  setDir 0
  avaaKuva 1
}

#Jos hakemistossa ei ole yhtaan kuvatiedostoa:
if {[llength $tiedostolista] <=0} {
   tk_messageBox -title "Ei valittua kuvaa" -icon warning -message "Valitse kuva tai hakemisto, jossa on kuvia." -type ok
}

   setImg

}
