#!/usr/bin/env python
# -*- coding: UTF-8 -*-

# Copyright (C) 2005 Claudio "malefico" Andaur <the3d_hut@yahoo.com.ar>
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  
# Added by mammique 25/07/2002
# the GNU General Public License http://www.gnu.org/licenses/gpl.txt or COPYING file
                                                                                 
# program name: img2list
# version: 0.1.5
#
# QUICK HOWTO:
# ------------
#
# This program is meant to generate an image sequence list file,
# which can be loaded into Cinelerra/Broadcast2000 video editor.
# Just select an image file from your sequence, 
# , fill in desired FPS, and list filename.
# Image fileformat and resolution should be automatically detected, otherwise you can
# select it from the proper combo. Image data detection now relies on PIL,
# so it should work no matter the extension.

#
# TODO:
# -----
#
# Add Image preview, Video Encoding and Preview.
#
import sys, os, os.path, string, Image
from os.path import *
from string import *
import pygtk
pygtk.require("2.0")

import gtk
from gtk import glade

secuencia=[]
imagen = ""
#FLAG_AUTO = False

class img2list:
    def __init__(self):
        """
        In this init we are going to display the main
        serverinfo window
        """
        gladefile="GUI.glade"
        windowname="listgenerator"
        
        self.wTree=gtk.glade.XML (gladefile,windowname) #toma GUI de Glade2
        #gtk.glade.XML (gladefile, "exito_dialog")
        
    
        dic = { "on_button1_clicked" : \
                (self.sec_open_click),
                "on_button3_clicked" : \
                (self.export_button_click),
                "on_button2_clicked" : \
                (self.lista_open_click),
                "on_button4_clicked" : \
                (self.byebye),
                "on_auto_toggled" : \
                (self.auto_resolution)}
        self.wTree.signal_autoconnect (dic)
        
        file_formats=["TGA", "JPG", "TIF", "PNG"]
        self.wTree.get_widget("file_format_combo").set_popdown_strings(file_formats)

        return
  
    def sec_open_click(self,widget):
        #Abre dialogo para buscar secuencia de imagenes
        #Opens dialog to look for images sequence
        #----------------------------------------------
        self.wTree.get_widget("status").set_text("Opening image sequence.")
        
        secuencia_browse = DialogoSecuencia()
        secuencia_browse.filew.set_filename(os.path.join(self.wTree.get_widget("folder_origen").get_text(),self.wTree.get_widget("secuencia").get_text()))
    
    def lista_open_click(self,widget):
        
        self.wTree.get_widget("status").set_text("Selecting list file.")
        lista_browse = DialogoLista()
	lista_browse.filew.set_filename(os.path.join(self.wTree.get_widget("folder_origen").get_text(),"clip.txt"))
        
    
    def export_button_click(self,widget):
        self.wTree.get_widget("status").set_text("Exporting Cinelerra image list...")

        #print "Exportando lista Cinelerra..."
        path_origen = self.wTree.get_widget("folder_origen").get_text()
        path = self.wTree.get_widget("folder_destino").get_text()
        listname = self.wTree.get_widget("lista").get_text()
        fps = self.wTree.get_widget("fps").get_text()
        height = self.wTree.get_widget("height").get_text()
        width = self.wTree.get_widget("width").get_text()
        file_type = self.wTree.get_widget("file_format_combo").entry.get_text()
        secuencia.sort()
        
        #Now, saving all stuff...
        #------------------------
        grabar_lista(os.path.join(path, listname), secuencia, fps, height, width, file_type, path_origen)
        #botones = (gtk.STOCK_OK)
        
        
        #result.destroy()
        #dia = gtk.Dialog('', None, gtk.DIALOG_MODAL, (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
        #dia.vbox.pack_start(gtk.Label('Secuencia exportada'))
        #dia.show_all()
        #result = dia.run()
        #dia.destroy()
        self.wTree.get_widget("status").set_text("Sequence exported as: "+ listname)
        
    def auto_resolution(self, widget):
        global FLAG_AUTO
        #print "Auto chequeado"
        flag = self.wTree.get_widget("auto").get_active()
        if flag:
            print "ON"
            FLAG_AUTO=True
            auto_detect_resol()

        else:
            print "OFF"
            FLAG_AUTO=False

    def byebye(self, widget):
        print "--------------------------------------------------------"
        print "Thanks for trying. Please visit http://malefico3d.com.ar"
        print "--------------------------------------------------------"
        gtk.mainquit()

def auto_detect_resol():
    # Autodetection is mandatory now !
    #global FLAG_AUTO 
    #if FLAG_AUTO:
            if imagen <> "":
                im = Image.open(imagen)
                generator.wTree.get_widget("height").set_text(str(im.size[1])) #pone height en entry
                generator.wTree.get_widget("width").set_text(str(im.size[0]))
                #print "cadena de formato es: ", im.format
                # im.show()
                # pone cadena identificando formato
                # PNG y TGA coinciden con las extensiones, JPEG y TIFF corresponden a JPG y TIF.
                if im.format=="JPEG":
                    generator.wTree.get_widget("file_format_combo").entry.set_text("JPG")
                elif im.format=="TIFF":
                    generator.wTree.get_widget("file_format_combo").entry.set_text("TIF")
                else:
                    generator.wTree.get_widget("file_format_combo").entry.set_text(str(im.format))
                    

def grabar_lista(path, secuencia, fps, h, w, format, origen):
    #print "Los datos a guardar son: ", path, fps, h, w, format
    f= open(path, 'w') #Recibe path del archivo lista y lo abre para escribir
    if lower(format)=="tga":
        f.write('TGALIST\n')
    elif lower(format)=="jpg":
        f.write('JPEGLIST\n')
    elif lower(format)=="tif":
        f.write('TIFFLIST\n')
    else:
        f.write('PNGLIST\n')
    f.write('#Image sequence format to be loaded into Cinelerra/Broadcast2000\n')
    f.write(fps)
    f.write(' #FPS\n')
    f.write(w)
    f.write(' #Width\n')
    f.write(h)
    f.write(' #Height\n')
    f.write('#-------------------------------------\n')
    f.write('#Now the paths to the images\n')
    f.write('#-------------------------------------\n')
    for i in secuencia:
        f.write(os.path.join(origen, i))
        f.write('\n')
    f.close() #Cierra y actualiza archivo.
    print "-----------------------------------------"
    print "Sequence list file recorded: ", path
    #dialog = gtk.Dialog(title="Exportando...", parent=None, flags=DIALOG_MODAL, buttons=None)
    

def get_filtro(cadena):
    filtro = ""
    caracter = 0
    digitos=0
    #Analiza la cadena (el nombre del primer archvio de una secuencia)
    # y extrae el patrón base o filtro para crear una lista
    #Devuelve el filtro (sin path) , o bien "NONE".
        
    for caracter in range(1, len(cadena)):
        letra = cadena[-caracter]
        #print "caracter es: ", letra
        if letra.isdigit()==True:
            digitos += 1
        else:
            #Se encontró un caracter que NO ES digito
            if digitos < 4:
                print cadena, " Not a valid sequence file"
                filtro="NONE"
                break
            else:
                filtro=cadena[:-caracter+1] # se queda con todo excepto los ultimos "caracter" caracteres.
                break
    return(basename(filtro))
    
def find_match(lista, filtro, nombrebase):
    # Busca las ocurrencias de "filtro" en la lista de archivos
    # Cuando encuentra una lo pone en una lista separada.
    global secuencia
    
    secuencia=[] # Crea una secuencia vacía
    for i in lista:
        if find(i, filtro) <> -1: # el patron esta contenido 
            if lower(i[-3:])== lower(generator.wTree.get_widget("file_format_combo").entry.get_text()): #Ademas la extension es la misma
                if len(i) == len(nombrebase):# La longitud del nombre coincide
                    secuencia.append(i)
    #print "la lista de imagenes es:", secuencia

class DialogoSecuencia:
    def file_ok_sel(self, w):
        global secuencia
        global imagen
        
        selected = self.filew.get_filename() #nombre archivo secuencia
        imagen = selected
        
        #--------
        #Hay que separar el path del nombre de archivo.
        #Path va en entry folder_origen
        #Nombre va en entry secuencia
        #--------
        lista_archivos=[]
        
        dir_secuencia = dirname(selected)
        name_secuencia = basename(selected)
        auto_detect_resol()

        #if lower(name_secuencia[-3:])=="tga":
        #    generator.wTree.get_widget("file_format_combo").entry.set_text("tga")
        #elif lower(name_secuencia[-3:])=="jpg":
        #    generator.wTree.get_widget("file_format_combo").entry.set_text("jpg")
        #elif lower(name_secuencia[-3:])=="tif":
        #    generator.wTree.get_widget("file_format_combo").entry.set_text("tif")
        #elif lower(name_secuencia[-3:])=="png":
        #    generator.wTree.get_widget("file_format_combo").entry.set_text("png")
        
        lista_archivos=os.listdir(dir_secuencia) # Genera lista con nombres de archivo en carpeta seleccionada
        #print "las lista de archivos es: ", lista_archivos

        nombre = splitext(selected)
        
        filtro = get_filtro(nombre[0])
        
        if filtro <> "NONE": # Crea filtro basado en nombre
            #print "El filtro es: ", filtro
            find_match(lista_archivos, filtro, name_secuencia) # Busca coincidencias y crea secuencia
            #print "Ahora la secuencia es: ", secuencia

            generator.wTree.get_widget("secuencia").set_text(filtro + "####") #imrime filtro secuencia
            generator.wTree.get_widget("folder_origen").set_text(dir_secuencia) #imprime directorio origen
            generator.wTree.get_widget("frames").set_text(str(len(secuencia))) #imprime numero de frames
            #auto_detect_resol()
        
        

        self.filew.destroy() #destruye dialogo pa que no joda luego.
        
    def destroy(self,widget):
        self.filew.destroy()

    def __init__(self):
        self.filew = gtk.FileSelection("Load Image Sequence")
        self.filew.ok_button.connect("clicked", self.file_ok_sel)
        self.filew.cancel_button.connect("clicked", self.destroy)
        self.filew.show()

class DialogoLista:
    def file_ok_sel(self, w):
        selected = self.filew.get_filename() #nombre archivo lista
        #--------
        #Hay que separar el path del nombre de archivo.
        #Path va en entry folder_origen
        #Nombre va en entry secuencia
        #--------
        dir_lista = dirname(selected)
        name_lista = basename(selected)
        generator.wTree.get_widget("lista").set_text(name_lista)
        generator.wTree.get_widget("folder_destino").set_text(dir_lista)

        self.filew.destroy() #destruye dialogo pa que no joda luego.
        
    def destroy(self,widget):
        self.filew.destroy()

    def __init__(self):
        self.filew = gtk.FileSelection("Select List")
        self.filew.ok_button.connect("clicked", self.file_ok_sel)
        self.filew.cancel_button.connect("clicked", self.destroy)
        self.filew.show()
# Loop principal


generator=img2list()
gtk.mainloop()
