#! /usr/bin/python

###############################################
# "Phrozen's PyWav player" v.0.2a for GTK
#  by PhrozenSmoke@yahoo.com
#  March 2002
#  A BASIC, lightweight wav player, ideal
#  for quick previewing of wav files from a 
#  file manager. It's really a 
#  frontend to the wavplay program.
#
#  License: Open Source, free for non-commercial use
#  Please leave these credits intact.
#
#  This program and it's source may be freely 
#  modified and redistributed for non-commercial, 
#  non-profit use only.
#
#  This software comes with NO WARRANTY 
#  whatsoever!
#
#  This program requires Python, PyGTK, and PyGnome.
#  Tested only on: Mandrake 8.1, Kernel 2.4.8, 
#  Glibc 2.2, Python 2.2, PyGtk 0.6.9, PyGnome 1.4.2, 
#  and the Linux  playwav utility version 2.4
#  and Gtk version 1.2.8-4
###############################################


import sys, os, types, string
from _gtk import *
import GDK, GTK
from gtk import *
from gnome.ui import *

def ConnectSignal (w, sigName, listener, fName, *extra) :
    if hasattr (listener, fName) :
        func = getattr (listener, fName)
        assert callable (func)
        gtk_signal_connect (w, sigName, func, extra)
def AfterSignal (w, sigName, listener, fName, *extra) :
    if hasattr (listener, fName) :
        func = getattr (listener, fName)
        assert callable (func)
        gtk_signal_connect_after (w, sigName, func, extra)

def NewMenuFromLabels (items) :
    m = gtk_menu_new ()
    for i in items :
        gtk_menu_append (m, gtk_menu_item_new_with_label (i))
    return m

if __name__ == "__main__" :
    __file__ = sys.argv[0]
HostingDir = os.path.dirname (__file__)

class Context :
    def __init__ (self, tooltips=None, accelgroup=None, imagedirs=None,
    window=None, context=None) :
        if isinstance (context, Context) :
            self._tooltips = context._tooltips
            self._accelgroup = context._accelgroup
            self._imagedirs = context._imagedirs
            self._top = context._top
        else :
            if tooltips is None :
                self._tooltips = gtk_tooltips_new ()
            if accelgroup is None :
                self._accelgroup = gtk_accel_group_new ()
            if imagedirs is None :
                base = HostingDir
                self._imagedirs = [base, os.path.join (base, "pixmaps")]
            if window is None :
                self._top = None
        if tooltips is not None :
            self._tooltips = tooltips
        if accelgroup is not None :
            self._accelgroup = accelgroup
        if type (imagedirs) is types.StringType :
            self._imagedirs = string.split (imagedirs, os.pathsep)
        elif imagedirs is not None :
            self._imagedirs = list (imagedirs)
        if window is not None :
            self._top = window
        self._root = None

    def setTip (self, w, msg) :
        gtk_tooltips_set_tip (self._tooltips, w, msg, None)

    def addAccel (self, w, sigName, keyVal, modVal, flagVal) :
        gtk_widget_add_accelerator (w, sigName, self._accelgroup,
            keyVal, modVal, flagVal)

    def setContainerLabelWithAccel (self, item, text, accel=None, mask=0, sig="activate_item") :
        label = gtk_container_children (item)[0]
        key = gtk_label_parse_uline (label, text)
        if accel is None :
            accel = self._accelgroup
            mask = GDK.MOD1_MASK
        gtk_widget_add_accelerator (item, sig, accel, key, mask, 0)

    def findPixmapPath (self, pixName) :
        for i in self._imagedirs :
            pixPath = os.path.join (i, pixName)
            if os.path.exists (pixPath) :
                return pixPath
        raise IOError (None, "pixmap '%s' not found" % pixName)

    def show (self) :
	if self._root is not None :
	    gtk_widget_show_all (self._root)

    def destroy (self) :
	if self._root is not None :
            gtk_widget_destroy (self._root)

    def giveNames (self, nameList) :
        for i in nameList :
            w = getattr (self, i)
            gtk_widget_set_name (w, i)

    controllerClass = None

    def setupController (self) :
        if self.controllerClass is not None :
            ctrl = self.controllerClass ()
            self._controller = ctrl
            self.connect (ctrl)

def gtk_adjustment_set_step_increment (adj, stepInc) :
    value = gtk_adjustment_get_value (adj)
    upper = gtk_adjustment_get_upper (adj)
    lower = gtk_adjustment_get_lower (adj)
    pgInc = gtk_adjustment_get_page_increment (adj)
    pgSz = gtk_adjustment_get_page_size (adj)
    gtk_adjustment_set_all (adj, value, upper, lower, stepInc, pgInc, pgSz)

##BEGIN I18N SUPPORT
from locale import setlocale, LC_MESSAGES, LC_ALL
setlocale (LC_ALL, "")


class window1 (Context) :
    def __init__ (self, context=None) :
	Context.__init__ (self, context=context)
        #window1=GtkWindow(GTK.WINDOW_TOPLEVEL)
	window1 = gtk_window_new (GTK.WINDOW_TOPLEVEL)
        #window1.set_default_size(200,100)
        self.wav_file=""
        self.pid=3987
        self.killed=1
        self.fs=None
	self._root = window1
	if context is None :
	    self._top = window1
	    gtk_widget_realize (window1)
	gtk_window_set_title (window1, "PyWav v.0.2a GTK Version")
	gtk_window_set_position (window1, GTK.WIN_POS_NONE)
	gtk_window_set_default_size (window1, 280,90)
	gtk_window_add_accel_group (window1, self._accelgroup)
	self.window1 = window1
	vbox1 = gtk_vbox_new (0, 0)
	self.vbox1 = vbox1
	menubar1 = gtk_menu_bar_new ()
	self.menubar1 = menubar1
	file2 = gtk_menu_item_new_with_label ("File")
	self.file2 = file2
	file2_menu = gtk_menu_new ()
	_accel_file2_menu = gtk_menu_ensure_uline_accel_group (file2_menu)
	self.file2_menu = file2_menu
	open2 = gtk_menu_item_new_with_label ("Open...")
	self.open2 = open2
	gtk_container_add (file2_menu, open2)
	exit2 = gtk_menu_item_new_with_label ("Exit")
	self.exit2 = exit2
	gtk_container_add (file2_menu, exit2)
	gtk_menu_item_set_submenu (file2, file2_menu)
	gtk_container_add (menubar1, file2)
	help2 = gtk_menu_item_new_with_label ("Help")
	self.help2 = help2
	help2_menu = gtk_menu_new ()
	_accel_help2_menu = gtk_menu_ensure_uline_accel_group (help2_menu)
	self.help2_menu = help2_menu
	about3 = gtk_menu_item_new_with_label ("About")
	self.about3 = about3
	gtk_container_add (help2_menu, about3)
	gtk_menu_item_set_submenu (help2, help2_menu)
	gtk_container_add (menubar1, help2)
	gtk_box_pack_start (vbox1, menubar1, 1, 1, 0)
	hbox1 = gtk_hbox_new (0, 0)
	self.hbox1 = hbox1
	vbox2 = gtk_vbox_new (0, 0)
	self.vbox2 = vbox2
	label1 = gtk_label_new ("PyWav")
	self.label1 = label1
        #print str(type(label1))
	gtk_box_pack_start (vbox2, label1, 0, 0, 8)
	hbox2 = gtk_hbox_new (0, 0)
	self.hbox2 = hbox2
	button1 = gtk_button_new_with_label ("PLAY")
	self.button1 = button1
	gtk_box_pack_start (hbox2, button1, 1, 1, 0)
	button2 = gtk_button_new_with_label ("STOP")
	self.button2 = button2
	gtk_box_pack_start (hbox2, button2, 1, 1, 4)
	#label2 = gtk_label_new ("")
	#self.label2 = label2
     
        # Listeners
        gtk_signal_connect(self.open2,"activate",self.do_file_open)
        gtk_signal_connect(self.about3,"activate",self.do_about)
        gtk_signal_connect(self.exit2,"activate",self.quit)
        gtk_signal_connect(self.button1,"released",self.playwav)
        gtk_signal_connect(self.button2,"released",self.stopwav)
        gtk_signal_connect (self.window1, "destroy", self.quit)
        
        self.createFileSel()
        
	#gtk_box_pack_start (hbox2, label2, 1, 1, 0)
	gtk_box_pack_start (vbox2, hbox2, 1, 1, 4)
	gtk_box_pack_start (hbox1, vbox2, 1, 1, 5)
	gtk_box_pack_start (vbox1, hbox1, 1, 1, 0)
	gtk_container_add (window1, vbox1)
	self.setupController ()
	gtk_widget_show_all (window1)


    def doFsHide(self,argy=None,argy2=None,argy3=None):
	self.fs.hide()

    def stopwav(self,xarg=None):
      try:
        if self.killed: 
          return
        f=os.popen("kill "+str(self.pid))
        self.killed=1
        f.close()
      except:
        pass

    def playwav(self,args=None):
        if self.wav_file:
          try:
            self.stopwav()
          except:
            pass
          try:
	    m=str(self.wav_file).strip()
	    if m.find("/") > -1:
	      m=m[m.rfind("/")+1:len(m)]
	    gtk_label_set_text(self.label1," PyWav:  \""+m+"\" ")
            
            ## CHANGE THE Line below if you do want the 
            ## the wav to loop more times

            LOOP_COUNT=1
          
            l=[]
            if LOOP_COUNT < 1:
              LOOP_COUNT=1    # if LOOP_COUNT is less than 1, nothing will play!

            zz=0
            while zz < (LOOP_COUNT+1):
              l.append(self.wav_file)
              zz=zz+1

            self.pid=os.spawnvp(os.P_NOWAIT,"wavplay",l)
            self.killed=0
          except:
            gtk_label_set_text(self.label1,"Error playing the selected wav file!")
            #print  "Error playing the selected wav file!"
        else:
          self.do_file_open()

    def grabFile(self,args=None):   
 	wavfile=self.fs.get_filename()
	self.fs.hide()
	self.wav_file=str(wavfile).strip()
        self.playwav()


    def quit (self,argy=None, argy2=None) :
       self.stopwav()
       gtk_main_quit ()


    def createFileSel(self,argy=None,argyy=None):
        self.fs = GtkFileSelection()
        self.fs.set_title('Select A Wav')
        self.fs.connect('destroy', self.doFsHide)
        self.fs.connect('delete_event', self.doFsHide)
        self.fslabel = self.fs.ok_button.children()[0]
        self.fslabel.set_text('Play')
        self.fs.ok_button.connect('clicked', self.grabFile)
        self.fslabel = self.fs.cancel_button.children()[0]
        self.fslabel.set_text('Cancel')
        self.fs.cancel_button.connect('clicked', self.doFsHide)

    def do_file_open(self,argy=None):
       self.fs.show()

    def do_about(self,argy=None):
        about = GnomeAbout('PyWav', '0.2a GTK Version', 'Copyright March 2002', ['PhrozenSmoke (PhrozenSmoke@yahoo.com)'], 'About PyWav","PyWav v.0.2a\nA BASIC, lightweight frontend to the Linux wavplay utility.\nWritten with Python/PyGTK.\nIdeal for quick previewing of wav files from a file manager.\nWritten: March 2002\nBy: PhrozenSmoke@yahoo.com\n\nThis software comes with NO WARRANTY whatsoever.\n\nLicense: Open Source, free for non-commercial use.  Please leave these credits intact. \n\nThis program and its source may be freely modified and redistributed for non-commercial,  non-profit use only. \n\nThis program requires Python, PyGTK, and PyGnome. Tested only on: Mandrake 8.1, Kernel 2.4.8, Glibc 2.2, Python 2.2, PyGTK 0.6.9, PyGnome 1.4.2, Gtk 1.2.8.-4, and wavplay 1.4')

        about.set_default_size(300,200)
        about.connect('destroy', about.destroy)
        about.show()


    def connect (self, listener, extra=None) :
	if extra is None: extra = self
	#ConnectSignal (self.open2, 'activate', listener, 'on_open2_activate', extra)
	#ConnectSignal (self.exit2, 'activate', listener, 'on_exit2_activate', extra)
	#ConnectSignal (self.about3, 'activate', listener, 'on_about3_activate', extra)




def run (wavf="") :
    gtk_init ()
    gtk_set_locale ()
    w=window1 ()
    w.wav_file=wavf
    w.playwav()
    gtk_main ()

if __name__ == "__main__" :
    if len(sys.argv) > 1:
      run (sys.argv[1])
    else:
      run()
