#!/usr/bin/python
#author jay@socialistsoftware.com
#web http://www.socialistsoftware.com/
#license GPL http://www.gnu.org/copyleft/gpl.html

import pygtk ; pygtk.require('2.0')
import os, sys, string, gtk, gtk.glade
import gnome, gnome.ui, gobject, popen2
gnome.init('gnomeBoyAdvance','0.1')

NAME = 'gnomeBoyAdvance'
VERSION = '0.1'
AUTHORS = ['Jay Graves <jay@socialistsoftware.com>']
COMMENTS = 'A frontend for the Visual Boy Advance emulator'
COPYRIGHT = 'Jay Graves (c) 2003'
DATADIR = '/usr/share/gnomeboyadvance/'
SETTINGSFILE = os.path.expanduser("~") + "/.gnomeBoyAdvance"
LOGOFILE = 'gnomeBoyAdvance.png'

class setting:
	def __init__(self):
		self.type = ''
		self.value = ''

class settings:
	def __init__(self):
		self.romsDir = setting()
		self.binary = setting()
		self.scale = setting()
		self.shotsDir = setting()
		self.filter = setting()
		self.frameSkip = setting()
		self.throttle = setting()
		self.yuv = setting()
		self.configFile = setting()
		self.saveType = setting()
	def save(self):
		self.romsDir.value = app.get_widget("romsDir").get_text()
		if self.romsDir.value != '':
			theGameList.populate(self.romsDir.value)
		self.binary.value = app.get_widget("binary").get_text()
		self.shotsDir.value = app.get_widget("shotsDir").get_text()
		self.scale.value = app.get_widget("scale").get_text()
		self.filter.value = app.get_widget("filter").get_text()
		self.frameSkip.value = app.get_widget("frameSkip").get_value_as_int()
		self.throttle.value = app.get_widget("throttle").get_value_as_int()
		self.yuv.value = app.get_widget("yuv").get_text()
		self.configFile.value = app.get_widget("configFile").get_text()
		self.saveType.value = app.get_widget("saveType").get_text()
		
		self.write(mySettings.configFile.value)
		app.appBar.set_status('settings saved')
	def write(self,theFile):
		if os.path.isfile(theFile):
			fConfig = open(theFile,'r')
			theLines = fConfig.readlines()
			fConfig.close()

			x = 0
			for line in theLines:
				x += 1
				if line[:9] == 'frameSkip':
					theLines[x - 1] = 'frameSkip     ' + `mySettings.frameSkip.value` + '\n'
				if line[:6] == 'video ':
					if mySettings.scale.value.endswith('1x'):
						theLines[x - 1] = 'video     0\n'
					if mySettings.scale.value.endswith('2x'):
						theLines[x - 1] = 'video     1\n'
					if mySettings.scale.value.endswith('3x'):
						theLines[x - 1] = 'video     2\n'
					if mySettings.scale.value.endswith('4x'):
						theLines[x - 1] = 'video     3\n'
				if line[:10] == 'fullScreen':
					if mySettings.scale.value.endswith('screen'):
						theLines[x - 1] = 'fullScreen     1\n'
					else:
						theLines[x - 1] = 'fullScreen     0\n'
				if line[:6] == 'filter':
					theLines[x - 1] = 'filter     ' + mySettings.filter.value[-1:] + '\n'
				if line[:13] == '# Screen shot':
					theLines[x] = mySettings.shotsDir.value + '\n'
				if line[:8] == 'saveType':
					theLines[x - 1] = 'saveType     ' + mySettings.saveType.value[-1:] + '\n'
				if line[:8] == 'throttle':
					theLines[x - 1] = 'throttle     ' + `mySettings.throttle.value` + '\n'
			newFile = open(mySettings.configFile.value,'w')
			newFile.writelines(theLines)
			newFile.close()
			gbaFile = open(SETTINGSFILE,'w')
			configLines = []
			configLines.append(mySettings.configFile.value + '\n')
			configLines.append(mySettings.binary.value + '\n')
			configLines.append(mySettings.romsDir.value)
			gbaFile.writelines(configLines)
			gbaFile.close
		else:
			app.appBar.set_status('could not save settings')
	def read(self,theFile):
		app.get_widget('configFile').set_text(mySettings.configFile.value)
		app.get_widget('binary').set_text(mySettings.binary.value)
		app.get_widget('romsDir').set_text(mySettings.romsDir.value)
		theConfigFile = open(theFile,'r')
		theConfigLines = theConfigFile.readlines()
		theConfigFile.close()
		
		y = 0
		for line in theConfigLines:
			y += 1
			if line[:9] == 'frameSkip':
				tempStr = string.split(line)
				mySettings.frameSkip.value = tempStr[1]
				app.get_widget("frameSkip").set_value(string.atoi(mySettings.frameSkip.value))
			if line[:6] == 'video ':
				tempStr = string.split(line)
				if tempStr[1] == '0':
					mySettings.scale.value = '--video-1x'
					app.get_widget("scale").set_text('--video-1x')
				if tempStr[1] == '1':
	                                mySettings.scale.value = '--video-2x'
	                                app.get_widget("scale").set_text('--video-2x')
				if tempStr[1] == '2':
                                        mySettings.scale.value = '--video-3x'
                                        app.get_widget("scale").set_text('--video-3x')
				if tempStr[1] == '3':
                                        mySettings.scale.value = '--video-4x'
                                        app.get_widget("scale").set_text('--video-4x')
			if line[:10] == 'fullScreen':
				tempStr = string.split(line)
				if tempStr[1] == '1':
					mySettings.scale.value = '--fullscreen'
					app.get_widget("scale").set_text('--fullscreen')
			if line[:6] == 'filter':
				tempStr = string.split(line)
				if tempStr[1] == '0':
					mySettings.filter.value = '--filter-normal 0'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '1':
					mySettings.filter.value = '--filter-tv-mode 1'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '2':
					mySettings.filter.value = '--filter-2xsai 2'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '3':
					mySettings.filter.value = '--filter-super-2xsai 3'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '4':
					mySettings.filter.value = '--filter-super-eagle 4'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '5':
					mySettings.filter.value = '--filter-pixelate 5'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '6':
					mySettings.filter.value = '--filter-motion-blur 6'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '7':
					mySettings.filter.value = '--filter-advmame 7'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '8':
					mySettings.filter.value = '--filter-simple2x 8'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == '9':
					mySettings.filter.value = '--filter-bilinear 9'
					app.get_widget('filter').set_text(mySettings.filter.value)
				if tempStr[1] == 'A':
					mySettings.filter.value = '--filter-bilinear+ A'
					app.get_widget('filter').set_text(mySettings.filter.value)
			if line[:13] == '# Screen shot':
				mySettings.shotsDir.value = theConfigLines[y][:-1]
				app.get_widget('shotsDir').set_text(theConfigLines[y][:-1])
			if line[:8] == 'saveType':
				tempStr = string.split(line)
				if tempStr[1] == '0':
					mySettings.saveType.value = '--save-auto 0'
				if tempStr[1] == '1':
					mySettings.saveType.value = '--save-eeprom 1'
				if tempStr[1] == '2':
					mySettings.saveType.value = '--save-sram 2'
				if tempStr[1] == '3':
					mySettings.saveType.value = '--save-flash 3'
				if tempStr[1] == '4':
					mySettings.saveType.value = '--save-sensor 4'
				app.get_widget('saveType').set_text(mySettings.saveType.value)
			if line[:8] == 'throttle':
				tempStr = string.split(line)
				mySettings.throttle.value = tempStr[1]
				app.get_widget('throttle').set_value(string.atoi(mySettings.throttle.value))
				

class gameList:
	def __init__(self):
		self.gameList = app.get_widget("gameList")
		self.gamesDict = []
		self.gameListModel = gtk.ListStore(gobject.TYPE_STRING)
	def populate(self,romsDir):
		self.clear()
		if os.path.isdir(romsDir):
			self.gamesDict = os.listdir(romsDir)
		else:
			print romsDir + ' is not a directory.'
		self.gameCount = 0
		for eachGame in self.gamesDict:
			if eachGame[-3:] == 'zip' or eachGame[-3:] == 'gba':
				iter = self.gameListModel.append()
				self.gameListModel.set_value(iter,0,eachGame)
				self.gameCount += 1
		app.get_widget('gameCount').set_text('Total roms : ' + `self.gameCount`)
		self.gameList.set_model(self.gameListModel)
		self.selection = self.gameList.get_selection()
		self.selection.set_mode('single')
		self.col = gtk.TreeViewColumn("Game",gtk.CellRendererText(),text=0)
		self.col.set_sort_column_id(0)
		self.gameList.append_column(self.col)
		self.selection.connect('changed',self.selectGame)
	def clear(self):
		self.gameList.set_model(gtk.ListStore(gobject.TYPE_STRING))
		self.gameListModel = gtk.ListStore(gobject.TYPE_STRING)
	def selectGame(self,selection):
		self.sel = selection.get_selected()
		if self.sel:
			self.model, self.iter = self.sel
			self.module = self.model.get_value(self.iter, 0)
			theGame.name = self.model.get_value(self.iter,0)
		if os.path.isdir(mySettings.shotsDir.value):
			theImage = os.path.join(mySettings.shotsDir.value, theGame.name[:-4] + '01.png')
			gameImage = app.get_widget("gameImage")
			if os.path.isfile(theImage):
				gameImage.set_from_file(theImage)
			else:
				gameImage.set_from_file(DATADIR + LOGOFILE)
			app.appBar.set_status(theGame.name)
class game:
	def __init__(self):
		self.name = 'a game'
	def play(self):
		launchStr = []
		launchStr.append(mySettings.binary.value)
		launchStr.append(os.path.join(mySettings.romsDir.value,self.name))
		launchStr.append(' --config=' + mySettings.configFile.value)
		app.appBar.set_status('playing ' + theGame.name)
		popen2.popen2(launchStr)

class GUI(gtk.glade.XML):
	def __init__(self):
		 gtk.glade.XML.__init__(self, DATADIR + 'gnomeboyadvance.glade','main')
                 self.signal_autoconnect(dict(GUI.__dict__))
		 self.appBar = self.get_widget('appbar1')
	def on_about1_activate(*args):
		pixbuf = gtk.gdk.pixbuf_new_from_file(DATADIR + LOGOFILE)
	        copyright = unicode(COPYRIGHT, "latin-1").encode("utf8")
	        gnome.ui.About(NAME, str(VERSION), copyright, COMMENTS, AUTHORS,logo_pixbuf=pixbuf).show()
	def on_quit1_activate(*args):
		gtk.main_quit()
	def on_save1_activate(*args):
		mySettings.save()
	def on_playGame_clicked(*args):
		theGame.play()
	def on_clear_clicked(*args):
		theGameList.clear()
	def on_reload_gamelist_activate(*args):
		theGameList.populate(mySettings.romsDir.value)

if __name__ == "__main__":
	app = GUI()
	mySettings = settings()
	theGameList = gameList()
	if os.path.isfile(SETTINGSFILE):
		localFile = open(SETTINGSFILE,'r')
		gbaSetting = localFile.readlines()
		if os.path.isfile(gbaSetting[0][:-1]):
			mySettings.configFile.value = gbaSetting[0][:-1]
			if len(gbaSetting) > 1:
				mySettings.binary.value = gbaSetting[1][:-1]
			if len(gbaSetting) > 2:
				mySettings.romsDir.value = gbaSetting[2]
				theGameList.populate(mySettings.romsDir.value)
			mySettings.read(gbaSetting[0][:-1])
		else:
			print gbaSetting[0][:-1] + ' is not a file'
	theGame = game()
	gtk.main()
