def __init__(self):
		#Gstreamer Bits#
		self.player = gst.element_factory_make("playbin2", "player")
		fakesink = gst.element_factory_make("fakesink", "fakesink")
		self.player.set_property("video-sink", fakesink)
		self.player.connect('about-to-finish', self.play_next)
		self.repeat = False

		#timer to update the time labels and seek bar#
		self.timer = GObject.timeout_add(500, self.update_time_labels)

		#Window Creation
		self.builder = Gtk.Builder()
		filename = os.path.join('', 'MainWindow.glade')        

		self.builder.add_from_file(filename)
		self.builder.connect_signals(self)	

		self.window = self.builder.get_object('win-main')
		self.window.set_default_size(900, 550)
		self.window.connect('destroy', lambda x: Gtk.main_quit())
		self.window.show_all()
		#register drag and drop
	
		self.treeview = self.builder.get_object('treeview1')
		self.treeview.drag_dest_set(0, [], 0)
		self.treeview.connect('drag_motion', self.motion_cb)
		self.treeview.connect('drag_drop', self.drop_cb)
		self.treeview.connect('drag_data_received', self.got_data_cb)

		#Quit, About Menus
		self.menuaqt = self.builder.get_object('menu-quit')
		self.menuaqt.connect('activate', self.quit_activate)

		self.menuabt = self.builder.get_object('menu-about')
		self.menuabt.connect('activate', self.about_activate)

		#View Menu#
		self.menuvfull = self.builder.get_object('menu-mode-full')
		self.menuvfull.connect('activate', self.to_full_mode)

		self.menuvlean = self.builder.get_object('menu-mode-lean')
		self.menuvlean.connect('activate', self.to_lean_mode)

		self.menuvmini = self.builder.get_object('menu-mode-mini')
		self.menuvmini.connect('activate', self.to_mini_mode)

		self.menuvplist = self.builder.get_object('menu-mode-playlist')
		self.menuvplist.connect('activate', self.to_playlist_mode)

		#playing Toolbar
		self.toolnext = self.builder.get_object('btn-next')
		self.toolnext.connect('clicked', self.play_next)

		self.toolprev = self.builder.get_object('btn-previous')
		self.toolprev.connect('clicked', self.play_prev)

		self.toolstop = self.builder.get_object('btn-stop')
		self.toolstop.connect('clicked', self.stop_play)

		self.toolplay = self.builder.get_object('btn-play')
		self.toolplay.connect('clicked', self.play_pause)

		self.toolSeekBar = self.builder.get_object('scl-position')
		self.toolSeekBar.connect('change-value', self.seek)

		self.toolVolume = self.builder.get_object('btn-volume')
		self.toolVolume.connect('value-changed', self.change_volume)

		#bottom toolbar
		self.barclr = self.builder.get_object('btn-tracklistClear')
		self.barclr.connect('clicked', self.clear_liststore)

		self.barshfl = self.builder.get_object('btn-tracklistShuffle')
		self.barshfl.connect('clicked', self.shuffleliststore)

		self.barrpt = self.builder.get_object('btn-tracklistRepeat')
		self.barrpt.connect('toggled', self.setrepeat)

		#listview#
		self.listview = self.builder.get_object('treeview1')
		self.listview.connect('row-activated', self.on_activated)

		#listviewModel
		self.model = self.builder.get_object('liststore1')
		self.titleText = self.builder.get_object('lbl-trkTitle')
		self.infoText = self.builder.get_object('lbl-trkMisc')

		#notebook, Combobox and contents
		self.notebook = self.builder.get_object('notebook-explorer')		

		self.explorer = FileBrowser('/media/Media/Music')
		self.notebook.add(self.explorer.get_sw())

		#self.explorer2 = TreeFileBrowser('/media/Media/Music')
		#self.notebook.add(self.explorer2.get_scrolled())

		self.notebook.show_all()
class BuilderApp:
	def __init__(self):
		#Gstreamer Bits#
		self.player = gst.element_factory_make("playbin2", "player")
		fakesink = gst.element_factory_make("fakesink", "fakesink")
		self.player.set_property("video-sink", fakesink)
		self.player.connect('about-to-finish', self.play_next)
		self.repeat = False

		#timer to update the time labels and seek bar#
		self.timer = GObject.timeout_add(500, self.update_time_labels)

		#Window Creation
		self.builder = Gtk.Builder()
		filename = os.path.join('', 'MainWindow.glade')        

		self.builder.add_from_file(filename)
		self.builder.connect_signals(self)	

		self.window = self.builder.get_object('win-main')
		self.window.set_default_size(900, 550)
		self.window.connect('destroy', lambda x: Gtk.main_quit())
		self.window.show_all()
		#register drag and drop
	
		self.treeview = self.builder.get_object('treeview1')
		self.treeview.drag_dest_set(0, [], 0)
		self.treeview.connect('drag_motion', self.motion_cb)
		self.treeview.connect('drag_drop', self.drop_cb)
		self.treeview.connect('drag_data_received', self.got_data_cb)

		#Quit, About Menus
		self.menuaqt = self.builder.get_object('menu-quit')
		self.menuaqt.connect('activate', self.quit_activate)

		self.menuabt = self.builder.get_object('menu-about')
		self.menuabt.connect('activate', self.about_activate)

		#View Menu#
		self.menuvfull = self.builder.get_object('menu-mode-full')
		self.menuvfull.connect('activate', self.to_full_mode)

		self.menuvlean = self.builder.get_object('menu-mode-lean')
		self.menuvlean.connect('activate', self.to_lean_mode)

		self.menuvmini = self.builder.get_object('menu-mode-mini')
		self.menuvmini.connect('activate', self.to_mini_mode)

		self.menuvplist = self.builder.get_object('menu-mode-playlist')
		self.menuvplist.connect('activate', self.to_playlist_mode)

		#playing Toolbar
		self.toolnext = self.builder.get_object('btn-next')
		self.toolnext.connect('clicked', self.play_next)

		self.toolprev = self.builder.get_object('btn-previous')
		self.toolprev.connect('clicked', self.play_prev)

		self.toolstop = self.builder.get_object('btn-stop')
		self.toolstop.connect('clicked', self.stop_play)

		self.toolplay = self.builder.get_object('btn-play')
		self.toolplay.connect('clicked', self.play_pause)

		self.toolSeekBar = self.builder.get_object('scl-position')
		self.toolSeekBar.connect('change-value', self.seek)

		self.toolVolume = self.builder.get_object('btn-volume')
		self.toolVolume.connect('value-changed', self.change_volume)

		#bottom toolbar
		self.barclr = self.builder.get_object('btn-tracklistClear')
		self.barclr.connect('clicked', self.clear_liststore)

		self.barshfl = self.builder.get_object('btn-tracklistShuffle')
		self.barshfl.connect('clicked', self.shuffleliststore)

		self.barrpt = self.builder.get_object('btn-tracklistRepeat')
		self.barrpt.connect('toggled', self.setrepeat)

		#listview#
		self.listview = self.builder.get_object('treeview1')
		self.listview.connect('row-activated', self.on_activated)

		#listviewModel
		self.model = self.builder.get_object('liststore1')
		self.titleText = self.builder.get_object('lbl-trkTitle')
		self.infoText = self.builder.get_object('lbl-trkMisc')

		#notebook, Combobox and contents
		self.notebook = self.builder.get_object('notebook-explorer')		

		self.explorer = FileBrowser('/media/Media/Music')
		self.notebook.add(self.explorer.get_sw())

		#self.explorer2 = TreeFileBrowser('/media/Media/Music')
		#self.notebook.add(self.explorer2.get_scrolled())

		self.notebook.show_all()

		#preliminary combobox

		#folderpb = GdkPixbuf.Pixbuf.new_from_file('folder.png')

		#self.combobox = self.builder.get_object('combo-explorer')
		#self.combomodel = self.builder.get_object('combostore')

		#self.cellrenderera = Gtk.CellRendererText()
		#self.combobox.pack_end(self.cellrenderera, False)
		#self.combobox.add_attribute(self.cellrenderera, 'text', 1) 
		#self.combomodel.append(['folder', 'Music'])

		#self.combobox.set_active(1)

	#Math Funcs and Other Handlers#

	def update_time_labels(self):
		playstate = self.player.get_state()[1]
		if (playstate == gst.STATE_PLAYING):
			self.seek_scale_set(None)
			self.sclSeek = self.builder.get_object('scl-position')
			self.position = self.player.query_position(gst.FORMAT_TIME, None)[0]
			self.sclSeek.set_value(self.position)

			self.currTrackPosText = self.convert_ns(self.position)
			self.timeLabel = self.builder.get_object('lbl-elapsedTime')
			self.timeLabel.set_text(self.currTrackPosText)
		return True
		
	def convert_ns(self, t):
		# This method was taken from a web tutorial by Sam Mason.
		s,ns = divmod(t, 1000000000)
		m,s = divmod(s, 60)

		if m < 60:
			return "%02i:%02i" %(m,s)
		else:
			h,m = divmod(m, 60)
			return "%i:%02i:%02i" %(h,m,s)

	def about_activate(self, action):
		aboutBoxShow(self.window)

	def quit_activate(self, action):
        	Gtk.main_quit()

	#Listbox Handlers
	def add_row(self, action):
		action = action.replace('%20',' ')
		getmesumdatabruv = TrackMetaData()
		x = getmesumdatabruv.getTrackType(action)		
		#print x
		if x != False:
			x.insert(0, None)
			self.model.append(x)

	def on_activated(self, widget, row, col):        
		model = widget.get_model()

		text = model[row][7]
		text = "file://" + text 
		self.playitem(text)

		try: self.titleText.set_text(model[row][2])
		except: self.titleText.set_text('No Artist')
		try: self.infoText.set_text(model[row][3])
		except: self.infoText.set_text('No Album')
		
		self.set_playmark(row)

	def clear_playmark(self):
		i = 0
		while i != len(self.model):
			self.model.set_value(self.model.get_iter(i), 0, '')
			i = i+1

	def set_playmark(self, row):
		self.clear_playmark()		
		try: self.model.set_value(row, 0, 'media-playback-start')
		except: self.model.set_value(self.model.get_iter(row), 0, 'media-playback-start')

	#Drag and Drop Handling
	def motion_cb(self, windowid, context, x, y, time):
		#windowid.drag_get_data(context, context.list_targets()[-1], time)
		return True

	def drop_cb(self, windowid, context, x, y, time):
		# Some data was dropped, get the data
		windowid.drag_get_data(context, context.list_targets()[-1], time)
		return True

	def got_data_cb(self, windowid, context, x, y, data, info, time):
		# Got data.
		tempArray = data.get_text().splitlines()
		for i in tempArray:
			i = i.replace('file://','')
			#print i
			self.add_row(i)
		context.finish(True, False, time)

	#View Mode Menu Handlers#
	def to_full_mode(self, unused):
		self.builder.get_object('pan-main').get_child1().show()
		self.builder.get_object('statusbar').show()
		self.builder.get_object('box-btn-tracklist').show()
		self.builder.get_object('scrolled-tracklist').show()
		self.window.resize(900, 550)

	def to_lean_mode(self, unused):
		self.to_full_mode(None)	
		self.builder.get_object('box-btn-tracklist').hide()

	def to_mini_mode(self, unused):
		self.to_full_mode(None)	
		self.builder.get_object('pan-main').get_child1().hide()
		self.builder.get_object('statusbar').hide()
		self.builder.get_object('box-btn-tracklist').hide()
		self.builder.get_object('scrolled-tracklist').hide()
		self.window.resize(600, 150)

	def to_playlist_mode(self, unused):
		self.to_full_mode(None)	
		self.window.resize(600, 550)
		self.builder.get_object('pan-main').get_child1().hide()

	#Bottom Toolbar Handlers#
	def clear_liststore(self, action):
		self.model.clear()

	def shuffleliststore(self, arg1):
		x = len(self.model)
		y = self.model.get_n_columns()
		temparray = []
		for i in range(0, x):
			temparray2 = []
			for j in range(0, y):
				temparray2.append(self.model[i][j])
			temparray.append(temparray2)
		self.model.clear()
		random.shuffle(temparray)
		for i in range(0, len(temparray)):
			self.model.append(temparray[i])

	def setrepeat(self, arg1):
		self.repeat = not(self.repeat)

	#Audio Control Widget Handlers#
	def change_volume(self, volume, unused):
		volume = self.builder.get_object('btn-volume').get_value()
		self.player.set_property('volume', volume)

	def seek_scale_set(self, unused):
		self.sclSeek = self.builder.get_object('scl-position')

		self.currTrackLength = (self.player.query_duration(gst.FORMAT_TIME, None)[0])
		self.sclSeek.set_range(0, self.currTrackLength)

		self.currTrackLengthText = self.convert_ns(self.currTrackLength)
		self.timeLabel = self.builder.get_object('lbl-remainingTime')
		self.timeLabel.set_text(self.currTrackLengthText)

	#Gstreamer Player Handlers#
	def play_pause(self, filepath):
		selected = self.builder.get_object('treeview-selection1')

		if selected.get_selected()[1] != None:
			modeliter = selected.get_selected()[1]
			self.set_playmark(modeliter)
		elif self.model.get_iter_first() != None:
			modeliter = self.model.get_iter_first()
			self.set_playmark(0)

		try: filepath = self.model.get_value(modeliter, 7)
		except: return

		toolplayimg = self.builder.get_object('image3')
		playstate = self.player.get_state()[1]
		if (playstate == gst.STATE_PLAYING):
			self.player.set_state(gst.STATE_PAUSED)

			toolplayimg.set_from_icon_name('media-playback-start', Gtk.IconSize.LARGE_TOOLBAR)			
		elif os.path.isfile(filepath):
			self.player.set_property("uri", "file://" + filepath)
			self.player.set_state(gst.STATE_PLAYING)

			getmesumdatabruv = TrackMetaData()
			x = getmesumdatabruv.getTrackType(filepath)

			try: self.titleText.set_text(x[1])
			except: self.titleText.set_text('No Artist')
			try: self.infoText.set_text(x[2])
			except: self.infoText.set_text('No Album')
			toolplayimg.set_from_icon_name('media-playback-pause', Gtk.IconSize.LARGE_TOOLBAR)

	def playitem(self, filepath):
		self.player.set_state(gst.STATE_NULL)
		self.player.set_property("uri", filepath)
		self.player.set_state(gst.STATE_PLAYING)

		toolplayimg = self.builder.get_object('image3')
		toolplayimg.set_from_icon_name('media-playback-pause', Gtk.IconSize.LARGE_TOOLBAR)	

	def stop_play(self, *args):
		self.player.set_state(gst.STATE_NULL)

		self.timeLabel = self.builder.get_object('lbl-remainingTime')
		self.timeLabel.set_text('')
		self.elapsedTimeLabel = self.builder.get_object('lbl-elapsedTime')
		self.elapsedTimeLabel.set_text('')

		self.titleText.set_text('Iconoclast Audio Player')
		self.infoText.set_text('...One Goal, Be Epic')
		self.clear_playmark()
		toolplayimg = self.builder.get_object('image3')
		toolplayimg.set_from_icon_name('media-playback-start', Gtk.IconSize.LARGE_TOOLBAR)

	def play_prev(self, unused):
		for x in range(1,len(self.model)):
			#if ("file://" + self.model[x][7]) == self.player.get_property("uri"):
			if self.model[x][0] == 'media-playback-start':
				self.stop_play()
				self.playitem("file://" + self.model[x-1][7])
				self.set_playmark(x-1)
				break

	def play_next(self, unused):
		for x in range(0,len(self.model)):
			if x == len(self.model)-1 and self.repeat == True:
				self.stop_play()
				self.playitem("file://" + self.model[0][7])
				self.set_playmark(0)
			if self.model[x][0] == 'media-playback-start' and x < len(self.model)-1:
				self.stop_play()
				self.playitem("file://" + self.model[x+1][7])
				self.set_playmark(x+1)
				break


	def seek(self, widget, test, where):
		self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, where)
		self.update_time_labels()

	#Status Icon Handlers#

	def toggle_window(self, trayicon):
		if self.window.get_property("visible"):
			self.window.hide()
		else:
			self.window.show()

	def right_click_event(self, icon, button, time):
		self.menu = Gtk.Menu()

		about = Gtk.MenuItem()
		about.set_label("About")
		quit = Gtk.MenuItem()
		quit.set_label("Quit")
		
		about.connect("activate", self.about_activate)
		quit.connect("activate", self.quit_activate)
		
		self.menu.append(about)
		self.menu.append(quit)
		
		self.menu.show_all()

		def pos(menu, ignore, aicon):
			return (Gtk.StatusIcon.position_menu(menu, aicon))

		self.menu.popup(None, None, pos, icon, button, time)