• Facebook
  • Twitter
  • Reddit
  • StumbleUpon
  • Digg
  • email

#-*- encoding: iso-8859-1 -*-
#-*- coding: iso-8859-1 -*-
 
import os
import sys
import PyQt4
from pyHed.common import *
from pyHed.components import *
from pyHed.db import *
from pyHed.frames import *
import frmCustomSplashScreen
 
 
class FrmCustomMain(PyQt4.QtGui.QMainWindow):
	def __init__(self, loginClass=None, splashImage=None, windowMinimize=True, windowMaximize=True, windowExit=True, windowCloseBtn=True):
		'''
			init da classe
				- loginClass = classe do frame de login. Deve ser definido para cada sistema
				- splashImage = imagem da splash screen do sistema
			Edgar, 07/nov/2008
		'''
		# cria a splash screen do sistema
		self.splash = frmCustomSplashScreen.FrmCustomSplashScreen(PyQt4.QtGui.QPixmap(splashImage), PyQt4.QtCore.Qt.WindowStaysOnTopHint)
		self.splash.show()
		try:
			super(FrmCustomMain, self).__init__(None)
 
			# Cria as Flags do QMainWindow Com os itens Padrões
			self.flags = self.windowFlags()
			# Verifica as Flags e Seta as Ativas no QMainWindow
			for windowflag, QtOption in [(windowExit, PyQt4.QtCore.Qt.WindowSystemMenuHint), (windowMinimize, PyQt4.QtCore.Qt.WindowMinimizeButtonHint), (windowMaximize, PyQt4.QtCore.Qt.WindowMaximizeButtonHint)]:
				if not windowflag: 
					self.flags = self.windowFlags().__xor__(QtOption)
			self.setWindowFlags(self.flags)
 
			pyHedConsts.dbInst.mapPyHedTables()
 
			self.__loginClass = loginClass
 
			# seta o gerador de exceções
			sys.excepthook = pyHedExceptions.exceptionHandler
			# seta o frmMain para possível utilização posterior
			pyHedConsts.frmMain = self
 
			# varivel para controle de frames aberto
			self.openFrames = []
			# controle de frames incluidos no menu
			self.menuActions = {}
 
			# Pega o tamanho da tela do usuario
			self.__wScreen = PyQt4.QtGui.QDesktopWidget().screenGeometry().width()
			self.__hScreen = PyQt4.QtGui.QDesktopWidget().screenGeometry().height()-80
 
			# Seta os atributos da main
			self.onPaint()
 
			# Cria as tabs
			self.tabs = PyQt4.QtGui.QTabWidget(self)
			self.tabs.setGeometry(5, 28, self.__wScreen-10, self.__hScreen-10)
			self.tabs.hide()
 
			# força o login do sistema antes de registrar o frame.
			self.logIn()
 
		finally:
			del self.splash
 
	def enterEvent(self, event):
		pass
		#self.logIn()
 
	def finishLogIn(self):
		"""
			Executa os eventos posteriores ao login do usuário no sistema. Ex: cria o access control, etc...
			Edgar, 03/mar/2009
		"""
		# registra os frames
		self.registerFrames()
 
	def logIn(self):
		"""
			Habilita o login para o usuário caso o mesmo não tenha se logado no sistema ainda. Sim, não era o melhor lugar para se colocar isto
				- event: evento da QT
			Edgar, 23/09/2008
		"""
		# cria o frame a partir da classe
		self.openFrames.append(self.__loginClass(self))
 
		# exibe o mesmo na tab
		self.tabs.addTab(self.openFrames[len(self.openFrames) - 1], self.openFrames[len(self.openFrames) - 1].getCaption())
		self.tabs.setCurrentIndex(self.tabs.count()-1)		
		self.tabs.show()
 
	def setIcon(self, icon):
		'''
		//!--------------------------------------------------------
		// @function	FrmCustomMain::SetIcon
		// @desc		seta o icone do sistema
		// @param		icon
		// @author      Renato Dehnhardt <renato@planejar.com>
		// @data        01/06/2008
		//!--------------------------------------------------------
		'''
		self.setWindowIcon(PyQt4.QtGui.QIcon(icon))
 
	def __isFrameOpen(self, frameClass):
		"""
			Verifica se o frame da classe passada por parâmetro está visível ao usuário
				- frameClass = classe do frame que se deseja verificar
			Edgar, 18/set/2008
		"""
		for frame in self.openFrames:
			if isinstance(frame, frameClass):
				return True
		return False
 
	def __showFrameByMenu(self):
		"""
			Função para chamar um frame a partir de um clique do menu main
			Edgar, 26/Ago/2008
		"""
		# percorre todos os componentes do self procurando pelas QAction para descobrir qual foi marcada pelo usuário
		# TODO: o ideal aqui seria percorrer os children do menu. Só que aí teria dois loops... Antes de perguntar o porque, olhe como o pyQT trabalha
		# com o menuBar e action's
		for comp in self.children():
			if isinstance(comp, PyQt4.QtGui.QAction):
				# já sei, que merda isso... Bacalhau!
				if comp.isChecked():
					comp.setChecked(False)
					# If the frame is not open, open it
					if not self.__isFrameOpen(self.menuActions[unicode(comp.text())]) or components.messageDlg(pyHedConsts.translation.getItem('frmcustommain', 'frame_opened_message')) == PyQt4.QtGui.QMessageBox.Yes:
						self.showFrame(frameClass=self.menuActions[unicode(comp.text())])
					else:
						# set the tab visible of the current frame
						for frame in self.openFrames:
							if isinstance(frame, self.menuActions[unicode(comp.text())]):
								pyHedConsts.frmMain.tabs.setCurrentIndex(pyHedConsts.frmMain.tabs.indexOf(frame))
 
	def addMenu(self, caption):
		"""
			Adiciona uma nova barra de menu
				- return: item do Menu
			Edgar, Julho de 2008
		"""
		return self.menubar.addMenu(caption)
 
 
	def addMenuItem(self, itemMenu, frameClass, caption):
		"""
			Adiciona um novo item no menu atual
			- itemMenu: Item pai onde o você quer criar o sub-item
			- frameClass: classe do frame que deverá ser aberto
			- caption: texto que aparecerá no item do menu. NÃO É O TÍTULO DA TELA
			Edgar, Julho de 2008
		"""
		# verifica se o usuário logado tem permissão de acessar a classe em questão
		if pyHedConsts.AccessControlInst.getAcessoAcao(frameClass.__module__) != False:
			# cria a action
			act = PyQt4.QtGui.QAction(self)
			act.setCheckable(True)
			# seta o texto
			act.setText(caption)
			# vincula o click ao evento padrão
			self.connect(act, PyQt4.QtCore.SIGNAL('triggered()'), self.__showFrameByMenu)
			# adiciona o item de menu no menu
			itemMenu.addAction(act)
			# adiciona a Action e o Frame referente a Action a lista de controle
			self.menuActions[caption] = frameClass
			return act
		else:
			return None
 
	def setTitle(self, title):
		'''
		//!--------------------------------------------------------
		// @function	FrmCustomMain::SetTitle
		// @desc		seta o titulo do sistema
		// @param		title
		// @author      Renato Dehnhardt <renato@planejar.com>
		// @data        01/06/2008
		//!--------------------------------------------------------
		'''
		self.setWindowTitle(title)
 
	def onPaint(self):
		'''
		//!--------------------------------------------------------
		// @function	FrmCustomMain::SetMain
		// @desc		define todos os elementos da main
		// @author      Renato Dehnhardt <renato@planejar.com>
		// @data        01/06/2008
		//!--------------------------------------------------------
			* Changed by: Edgar
		'''
		# Cria o menu do sistema
		self.menubar = self.menuBar()
 
		self.main = PyQt4.QtGui.QWidget(self)
		self.setCentralWidget(self.main)
		self.main.setStyleSheet("QWidget { background-color:#FFFFFF; }")
 
		self.marginTop = 80
		self.marginLeft = 60
 
		# Adiciona o elemento de imagem da esquerda da main
		self.btnLeft = components.Button(self, icon='%s/icon.png' % pyHedConsts.pyHedImagePath, iconSize=(215,155), width=220, height=160, x=self.marginLeft, y=self.marginTop)		
		self.connect(self.btnLeft, PyQt4.QtCore.SIGNAL('clicked()'), self.evtBtnLeftClicked)
		# Adiciona o elemento de imagem do centro da main
		self.btnCenter = components.Button(self, icon='%s/icon.png' % pyHedConsts.pyHedImagePath, iconSize=(215,155), width=220, height=160, x=((self.__wScreen - self.btnLeft.width())/2), y=self.marginTop)
		self.connect(self.btnCenter, PyQt4.QtCore.SIGNAL('clicked()'), self.evtBtnCenterClicked)
		# Adiciona o elemento de imagem da direita da main
		self.btnRight = components.Button(self, icon='%s/icon.png' % pyHedConsts.pyHedImagePath, iconSize=(215,155), width=220, height=160, x=(self.__wScreen - self.marginLeft - self.btnCenter.width()), y=self.marginTop)				
		self.connect(self.btnRight, PyQt4.QtCore.SIGNAL('clicked()'), self.evtBtnRightClicked)
 
	def evtBtnLeftClicked(self):
		pass
 
	def evtBtnCenterClicked(self):
		pass
 
	def evtBtnRightClicked(self):
		pass
 
	def hasClassAccess(self, module):
		"""
			This method can be re-implemented on your "FrmMain" class to use your own AccessControl method. 
			Just override this method to do it...
			Edgar, 06/07/2009
		"""
		return pyHedConsts.AccessControlInst.getAcessoAcao(module)
 
	def showFrame(self, frameClass, parent=None, params=None):
		'''
		//!--------------------------------------------------------
		// @function	FrmCustomMain::AddFrame
		// @desc		adiciona um nome frame no sistema
		// @param		frame
		// @author      Renato Dehnhardt <renato@planejar.com>
		// @data        01/06/2008
		//!--------------------------------------------------------
		'''
		if not (issubclass(frameClass, frameCustom.FrameCustom)):
			raise Exception("Parameter error! The class passed don't inherits from FrameCustom")
 
		# verifica se o usuário logado tem permissão de acessar a classe em questão
		if not self.hasClassAccess(frameClass.__module__):
			raise pyHedExceptions.UserException(pyHedConsts.translation.getItem('frmcustommain', 'class_permition_denied_message'))
 
		# verifica se o frame deve possuir um parent diferente do Main
		if parent is None:
			Parent = self
		else:
			Parent = parent
 
		# cria o frame a partir da classe
		self.openFrames.append(frameClass(Parent, params))
 
		# exibe o mesmo na tab
		self.tabs.addTab(self.openFrames[len(self.openFrames) - 1], self.openFrames[len(self.openFrames) - 1].getCaption())
		self.tabs.setCurrentIndex(self.tabs.count()-1)		
		self.tabs.show()
 
	def removeFrame(self):
		'''
		//!--------------------------------------------------------
		// @function	FrmCustomMain::RemoveFrame
		// @desc		remove a aba ativa do sistema
		// @author      Renato Dehnhardt <renato@planejar.com>
		// @data        01/06/2008
		//!--------------------------------------------------------
		'''
		# remove a tab atual da tela
		self.tabs.removeTab(self.tabs.currentIndex())
		# remove o frame da lista
		del self.openFrames[len(self.openFrames) - 1]
 
		if self.tabs.count() == 0:
			self.tabs.hide()
 
	def closeEvent(self, closeEvent):
		"""
			Evento do PyQt4 padrão para fechar um determinado frame
			Edgar, 18/set/2008
		"""
		# percorre todos os frames abertos
		frameCount = len(self.openFrames)
		i = 0
		while i < frameCount:
			self.openFrames[len(self.openFrames)-1].closeFrame()
			i += 1
 
		# se o usuário não fechou todos os frames, é sinal que ele tá fazendo alguma operação e não quer perder algum dado. Por isso, não fecha a aplicação
		if len(self.openFrames) > 0:
			closeEvent.ignore()
		else:
			closeEvent.accept()
 
	def __getHScreen(self):
		return self.__hScreen
 
	def __getWScreen(self):
		return self.__wScreen	
 
	# Altura da tela principal
	HScreen = property(__getHScreen)
	# Largura da tela principal
	WScreen = property(__getWScreen)