Beispiel #1
0
class Viewer:
	def __init__(self,dir):
		self.dir = dir
		pygame.init()
		modes = pygame.display.list_modes()
		self.screen = pygame.display.set_mode(modes[0],pygame.FULLSCREEN)
		self.loc = Directory(dir)
		self.myfont = pygame.font.Font(join(dirname(realpath(__file__)),"verdana.ttf"),32)
		self.index = 0
		self.list = [".."]+self.loc.listdir()
		self.collen = int((self.screen.get_size()[1]*1.0)/self.myfont.size(self.list[1])[1])
		print "collen",self.collen,self.myfont.size(self.list[1])[1],self.screen.get_size()[1]
		self.draw_list()
		clock = pygame.time.Clock()
		while 1:
			clock.tick(5)
			for event in pygame.event.get():
				if event.type is QUIT:
					return
				elif event.type is KEYDOWN:
					oldindex = self.index
					olddir = self.loc.path
					if event.key == K_ESCAPE:
						return
					elif event.key == K_DOWN or event.key == K_UP or event.key == K_LEFT or event.key == K_RIGHT:
						if event.key == K_DOWN or event.key == K_RIGHT:
							if event.key == K_DOWN:
								self.index +=1
							else: # K_RIGHT
								self.index += self.collen
								if self.index>=len(self.list):
									while self.index>=self.collen:
										self.index -= self.collen
							if self.index>=len(self.list):
								self.index -= len(self.list)
						else: # K_UP or K_LEFT
							if event.key == K_UP:
								self.index = self.index - 1
							else:
								self.index = self.index - self.collen
							if self.index<0:
								self.index = len(self.list)+self.index

					elif event.key == K_RETURN or event.key == K_BACKSPACE:
						if event.key == K_BACKSPACE:
							self.index = 0
							
						if self.loc.isfile(self.list[self.index]):
							if self.list[self.index][-4:]=='.cbz' or self.list[self.index][-4:]=='.zip' or self.list[self.index][-4:]=='.cbr' or self.list[self.index][-4:] == ".rar":
								if self.list[self.index]!="..":
									self.loc.chdir(self.list[self.index])
									self.list = [".."]+self.loc.listdir()
									self.index = 0
								else:
									place = self.loc.path[-1]
									self.loc.chdir("..")
									self.list = [".."]+self.loc.listdir()
									self.index=0

									for l in range(len(self.list)):
										if self.list[l]==place:
											self.index = l
											break
							else:
								self.index -=1
								self.browser()
								self.list = [".."]+self.loc.listdir()
								self.index +=1
								self.draw_list()
						else:
							if self.list[self.index]!="..":
								self.loc.chdir(self.list[self.index])
								self.list = [".."]+self.loc.listdir()
								self.index = 0
							else:
								place = [x for x in self.loc.path.split(os.sep) if x!=""][-1]
								print "dir",self.loc.path#,Directory.sep.findall(self.loc.path)
								self.loc.chdir("..")
								self.list = [".."]+self.loc.listdir()
								self.index=0
								print "looking for",place
								for l in range(len(self.list)):
									print self.list[l]
									if self.list[l]==place:
										self.index = l
										break
					elif event.key == K_END:
						self.index = len(self.list)-1
					elif event.key == K_HOME:
						self.index = 0
					elif event.key == K_DELETE:
						self.loc.delete(self.list[self.index])
						self.loc.clear_dir()
						self.list = [".."]+self.loc.listdir()
						if self.index == len(self.list):
							self.index -=1
						self.draw_list()
					elif event.key == K_r:
						self.list = [".."]+self.loc.listdir()
						self.draw_list()
					else:
						print "No binding for "+str(pygame.key.name(event.key))
					if oldindex!=self.index or self.loc.path!=olddir:
						self.draw_list()
					

	def draw_list(self):
		self.screen.fill((0,0,0))
		try:
			height = self.myfont.size(self.list[1])[1]
		except IndexError:
			height=20
		except:
			print "list",self.list
			raise
		y = 0
		min_x = 20
		x = min_x
		max_x = 0
		for f in self.list:
			if self.myfont.size(f)[0]>max_x:
				max_x = self.myfont.size(f)[0]
				
		firstdraw = 0
		width = self.screen.get_size()[0]

		while self.index-firstdraw>self.collen*int(width/(max_x*1.0)):
			if firstdraw+self.collen>self.index:
				break
			firstdraw += self.collen

		for i in range(firstdraw, len(self.list)):
			f = self.list[i]
			if not self.loc.isfile(f):
				f = "["+f+"]"
			if y == self.collen:
				y = 0
				x += max_x+min_x
				if x > width:
					break
			if self.index == i:
				self.screen.blit(self.myfont.render(f,True,(255,255,255),(255,0,0)),(x,y*height))
			else:
				self.screen.blit(self.myfont.render(f,True,(255,255,255)),(x,y*height))

			y += 1
		pygame.display.flip()		

	def browser(self):
		image = self.get_image(self.loc.listdir()[self.index])
		pygame.display.flip()
		while 1:
			for event in pygame.event.get():
				if event.type is QUIT:
					return
				elif event.type is KEYDOWN:
					if event.key == K_ESCAPE or event.key == K_BACKSPACE:
						return
					elif event.key in [K_PAGEDOWN, K_RIGHT, K_DOWN, K_PAGEUP, K_LEFT, K_UP]:
						if event.key in [K_PAGEDOWN, K_RIGHT, K_DOWN]:
							self.index = self.index + 1
							if self.index>len(self.loc.listdir())-1:
								self.index = len(self.loc.listdir())-1							
						else:
							self.index = self.index - 1
							if self.index<0:
								self.index = 0
						
						image = self.get_image(self.loc.listdir()[self.index])
						pygame.display.flip()
					else:
						print "No binding for "+str(pygame.key.name(event.key))

	def get_image(self,filename):
		try:
			print filename
			f = self.loc.open(filename)
			print f
			image = pygame.image.load(f,filename).convert()
			r=[0,0]
			for i in range(2):
				r[i] = self.screen.get_size()[i]/(image.get_size()[i]*1.0)
			if r[0]>r[1]:
				ratio = r[1]
			else:
				ratio = r[0]
			scr = (self.screen.get_size()[0]/(self.screen.get_size()[1]*1.0))
			imr = (image.get_size()[0]/(image.get_size()[1]*1.0))
			print "imr",scr,imr
			if imr<1.0:
				print "small ratio",ratio
				image = pygame.transform.rotate(image,90)
				for i in range(2):
					r[i] = self.screen.get_size()[i]/(image.get_size()[i]*1.0)
				if r[0]>r[1]:
					ratio = r[1]
				else:
					ratio = r[0]

			print ratio,scr,image.get_size(),(image.get_size()[0]*ratio,image.get_size()[1]*ratio),self.screen.get_size()
			image = pygame.transform.smoothscale(image,(image.get_size()[0]*ratio,image.get_size()[1]*ratio))
			self.screen.fill((0,0,0))
			self.screen.blit(image, ((self.screen.get_size()[0]-image.get_size()[0])/2, (self.screen.get_size()[1]-image.get_size()[1])/2))
			return image
		except pygame.error, message:
			if str(message) == "Unsupported image format":
				return None
			else:
				print "\""+str(message)+"\""
				raise