#-*- 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)