#!/usr/bin/env python

#Do not edit, this file is automaticly generated.


#####################################################################
# Mammut gui.
#
# This file is written by K. Matheussen, 2002/2003.
# Send comments to k.s.matheussen@notam02.no
#
# Almost everything else is written by Oyvind Hammer.
# Send comments to oyvindha@notam02.no
#
#
# Mammut is developed at Notam, Norwegian Network for Technology,
# Acoustic and Sound. http://www.notam02.no
#
#####################################################################


import sys, os.path, string, re


sys.path.insert(0,"/usr/lib/pygtk1/lib/python"+sys.version[:3]+"/site-packages/gtk-1.2")
import gtk,libglade



if len(sys.argv)>1 and (sys.argv[1]=="--help" or sys.argv[1]=="-h" or sys.argv[1]=="-help"):
    print
    print "Usage: %s [infile]" % sys.argv[0]
    print
    print "infile: All filetypes handled by libsndfile is supported."
    print "        Mammut is able to handle 16bit/24bit/32bit/float/double frametypes,"
    print "        and unlimited number of channels."
    print
    sys.exit(0)


# Load the the c-side of the program. Where things really happen.
sys.path.insert(0,os.path.abspath(os.path.dirname(sys.argv[0]))+"/../lib/")
import mammutc



# Global variables.

dialogs={}

handles={}

true=1
false=0


def GetGladeConfFilename():
    return os.path.abspath(os.path.dirname(sys.argv[0]))+"/../etc/mammut.glade"


####################################################################
#  Set C variable function. 
#
#  Python: VariableSet(name,value)
#  is equal to C: name=value
####################################################################
def VariableSet(name,value):
    # Take away all '+' from variable name. Not very legal in c.
    name=re.sub("\+","",name)

    # Compile and run.
    try:
        eval(compile("mammutc.cvar."+name+"="+value,'<string>','single'))
    except:
        print "Error: "
        print "%s - %s\n" % (name,value)
        


####################################################################
#  Sliders and text entry handlers.
####################################################################

def SliderInput(widg,value):
    name=widg.get_name()[:-2]
    entrywidget=dialogs[string.split(widg.get_name(),"_",1)[0]].get_widget(name)
    value=widg.get_adjustment().value
    entrywidget.set_text("%.1f" % value)
    VariableSet(name,"%f" % value)

def SliderInput_int(widg,value):
    name=widg.get_name()[:-2]
    entrywidget=dialogs[string.split(widg.get_name(),"_",1)[0]].get_widget(name)
    value=widg.get_adjustment().value
    entrywidget.set_text("%d" % value)
    VariableSet(name,"%d" % value)

def TextSliderInput(widg):
    sliderwidget=dialogs[string.split(widg.get_name(),"_",1)[0]].get_widget(widg.get_name()+"_s")
    try:
        val=float(widg.get_text())
    except:
        return
    sliderwidget.get_adjustment().set_value(val)
    VariableSet(widg.get_name(),widg.get_text())


def TextSliderInput_int(widg):
    sliderwidget=dialogs[string.split(widg.get_name(),"_",1)[0]].get_widget(widg.get_name()+"_s")
    try:
        val=int(widg.get_text())
    except:
        return
    sliderwidget.get_adjustment().set_value(val)
    VariableSet(widg.get_name(),widg.get_text())

def ToggleInput(widg):
    VariableSet(widg.get_name(),"%d" % widg.active)

    
def TextInput(widg):
    # No use for the function yet.
    pass


###################################################
#   Dialog/menu/fileselector/etc. Handlers
###################################################

# Dialog handler.

def DialogInput(widg):

    name=widg.get_name()
    if not dialogs.has_key(name):
        dialogs[name]=libglade.GladeXML(
            GetGladeConfFilename(),"dialog_"+name
            )
        dialogs[name].signal_autoconnect(handle_dict)
    else:
        dia=dialogs[name].get_widget("dialog_"+name)
        dia.show()
        

# Destroy handler

def DestroyInput(widg):
    name=widg.get_name()
    if name=="mammut" or name=="file_quit":
        gtk.mainquit()
    else:
        del dialogs[string.split(name,"_",1)[1]]
        pass


# All cancel buttons

def CancelInput(widg):
    name=string.split(widg.get_name(),"_",1)[0]
    dia=dialogs[name].get_widget("dialog_"+name)
    dia.hide()



# Nearly all Ok buttons.

def OkInput(widg):

    mammutc.MC_stop()

    name=widg.get_name()

    if name!="analysis_ok":
        mammutc.MC_addUndo()
    
    eval(compile("mammutc."+re.sub("\+","_",name)+"()",'<string>','single'))
    mammutc.MC_redrawWin()
    name=string.split(name,"_",1)[0]
    dia=dialogs[name].get_widget("dialog_"+name)
    dia.hide()




# Testing

def TestInput(widg):
    mammutc.MC_stop()
    mammutc.MC_loadAndAnalyze("/home/kjetil/t.aiff")

    maindialog.get_widget("swap_phases").set_sensitive(mammutc.MC_isStereo())
    maindialog.get_widget("crossover").set_sensitive(mammutc.MC_isStereo())

    mammutc.MC_redrawWin()



# Other Ok buttons.

def LoadAndAnalyzeOkInput(widg):
#    mammutc.MC_stop()

    name=string.split(widg.get_name(),"_",1)[0]
    dia=dialogs[name].get_widget("dialog_"+name)
    mammutc.MC_loadAndAnalyze(dia.get_filename())
    dia.hide()
    mammutc.MC_resetUndo()
    maindialog.get_widget("swap_phases").set_sensitive(mammutc.MC_isStereo())
    maindialog.get_widget("crossover").set_sensitive(mammutc.MC_isStereo())
    mammutc.MC_redrawWin()


def SaveOkInput(widg):
    mammutc.MC_stop()
    
    name=string.split(widg.get_name(),"_",1)[0]
    dia=dialogs[name].get_widget("dialog_"+name)
    mammutc.MC_synthAndSave(dia.get_filename())
    dia.hide()

def LoadAndMultiplyOkInput(widg):
    mammutc.MC_stop()
    
    name=string.split(widg.get_name(),"_",1)[0]
    dia=dialogs[name].get_widget("dialog_"+name)
    mammutc.load_and_multiply_ok(dia.get_filename())
    dia.hide()
    mammutc.MC_redrawWin()



# About dialog

def AboutInput(widg):
    name=widg.get_name()
    if not dialogs.has_key(name):
        dialogs[name]=libglade.GladeXML(
            GetGladeConfFilename(),"dialog_"+name
            )
        dialogs[name].signal_autoconnect(handle_dict)
        mammutc.MC_about(dialogs[name].get_widget("about_hbox")._o);
    else:
        dia=dialogs[name].get_widget("dialog_"+name)
        dia.show()



# Load and multiply fileselector dialog.

def LoadAndMultiplyInput(widg):
    name=widg.get_name()
    if not dialogs.has_key(name):
        dialogs[name]=libglade.GladeXML(
            GetGladeConfFilename(),"dialog_"+name
            )
        dialogs[name].signal_autoconnect(handle_dict)

        # Glade doesnt provide access to the fileselector's vbox widget, so the
        # radiobuttons has to be added manually.

        b1 = gtk.GtkRadioButton(None, "Convolve")
        b1.set_name("loadandmultiply_convolve")

        b2 = gtk.GtkRadioButton(b1,"Correlate")
        b2.set_name("loadandmultiply_correlate")

        b3 = gtk.GtkRadioButton(b1,"Fun")
        b3.set_name("loadandmultiply_fun")
        
        b4 = gtk.GtkRadioButton(b1,"A^B")
        b4.set_name("loadandmultiply_a_b")

        b5 = gtk.GtkRadioButton(b1,"Phase/Amp")
        b5.set_name("loadandmultiply_phase_amp")

        b1.connect("toggled",ToggleInput)
        b2.connect("toggled",ToggleInput)
        b3.connect("toggled",ToggleInput)
        b4.connect("toggled",ToggleInput)
        b5.connect("toggled",ToggleInput)

        hbox = gtk.GtkHBox()
        hbox.add(b1)
        hbox.add(b2)
        hbox.add(b3)
        hbox.add(b4)
        hbox.add(b5)
        
        vbox=dialogs[name].get_widget("dialog_"+name).main_vbox
        vbox.add(hbox)

        b1.show()
        b2.show()
        b3.show()
        b4.show()
        b5.show()
        hbox.show()

    else:
        dia=dialogs[name].get_widget("dialog_"+name)
        dia.show()
    


# Synth and save dialog

def SynthAndSaveInput(widg):
    
    name=widg.get_name()
    if not dialogs.has_key(name):
        dialogs[name]=libglade.GladeXML(
            GetGladeConfFilename(),"dialog_"+name
            )
        dialogs[name].signal_autoconnect(handle_dict)

        # Glade still doesnt provide access to the fileselector's vbox widget.

        b1 = gtk.GtkCheckButton("Normalize gain")
        b1.set_name("synthandsave_normalize_gain")
        
        vbox=dialogs[name].get_widget("dialog_"+name).main_vbox
        vbox.add(b1)

        b1.connect("toggled",ToggleInput)
        
        b1.show()

    else:
        dia=dialogs[name].get_widget("dialog_"+name)
        dia.show()



# Play/Stop/Zoom/etc. buttons

def ButtonInput(widg):
    mammutc.MC_stop()

    name=widg.get_name()
    if not handles.has_key(name):
        handles[name]=compile("mammutc.MC_"+name+"()",'<string>','single')
    eval(handles[name])

def PhaseSwapInput(widg):
    mammutc.MC_stop()
    
    mammutc.Phaseswap()
    mammutc.MC_redrawWin()



# Key input (doh ;) )

def KeyInput(a,key):

    mammutc.MC_stop()
    
    if key.string=="<": mammutc.MC_left()
    if key.string==">": mammutc.MC_right()
    if key.string=="+": mammutc.MC_zoom()
    if key.string=="-": mammutc.MC_zoom()

#    if key.string=="z": mammutc.MC_undo()
#    if key.string=="x": mammutc.MC_redo()



########################################################################
# The strings are name of handlers, also defined in the "Signals" tab in
# the widget properties-window in Glade.
########################################################################

handle_dict={
    "test":TestInput,
    "menu":DialogInput,
    "about":AboutInput,
    "slider":SliderInput,
    "slider_int":SliderInput_int,
    "text":TextInput,
    "textslider":TextSliderInput,
    "textslider_int":TextSliderInput_int,
    "toggle":ToggleInput,
    "button":ButtonInput,
    "cancel":CancelInput,
    "ok":OkInput,
    "loadandanalyzeok":LoadAndAnalyzeOkInput,
    "saveok":SaveOkInput,
    "loadandmultiplyok":LoadAndMultiplyOkInput,
    "phaseswap":PhaseSwapInput,
    "loadandmultiply":LoadAndMultiplyInput,
    "synthandsave":SynthAndSaveInput,
    "destroy":DestroyInput,
    "key":KeyInput
    }



######################################################################
# Parse the mammut.glade file and send all the default values to the C side of the program.
# Its definitely not correct XML-parsing, but an error should hopefully show up if something
# goes wrong.)
######################################################################

def ParseMammut_glade(filename):
    classname=""
    varname=""

    def lrstrip(dasstring):
        dasstring=string.lstrip(dasstring)
        dasstring=string.rstrip(dasstring)
        return dasstring

    try:
        file=open(filename,"r")
    except:
        return

    while 1:
        line=""
        while line=="" or line=="\n" or line[0:1]=="#":
            line=file.readline()
            if line=="":
                file.close()
                return
            line=lrstrip(line)

        if line[:7]=="<class>":
            if line=="<class>GtkEntry</class>":
                classname="Entry"
                varname=""
            elif line=="<class>GtkCheckButton</class>":
                classname="Toggle"
                varname=""
        else:
            if varname=="":
                if line[:6]=="<name>":
                    varname=line[6:-7]
            else:
                if classname=="Entry" and line[:6]=="<text>":
                    VariableSet(varname,line[6:-7])
                if classname=="Toggle" and line[:8]=="<active>":
                    act=line[8:-9]
                    if act=="False":
                        VariableSet(varname,"0")
                    else:
                        VariableSet(varname,"1")
                        
ParseMammut_glade(GetGladeConfFilename())
    

# Finished parsing



###################################################
# Starting gui
###################################################

maindialog=libglade.GladeXML(GetGladeConfFilename(),"mammut")
maindialog.signal_autoconnect(handle_dict)
maindialog.get_widget("mammut").show_now()

# Init the C side of the program.
mammutc.MC_init(maindialog.get_widget("drawing_area")._o,maindialog.get_widget("progressbar")._o)

# Load file spesified on the command-line (if any)
if len(sys.argv)>1:
	mammutc.MC_loadAndAnalyze(sys.argv[1])
	mammutc.MC_redrawWin()

# Start.
gtk.mainloop()

# Finished program.





