import sys
import string
from math import *
from PySide.QtGui import *
from PySide.QtCore import *

class screen(QLineEdit):
        def __init__(self, parent=None):
                QLineEdit.__init__(self, None)
                self.setMinimumSize(270, 65)
                self.setMaximumSize(290, 75)
                self.setText("0")
                self.setFocus()
                #self.setStyleSheet("border-radius:0px;border-style: groove;border-color: #ccc;border-width:1px;color:#ffffff;background-color:#416f9a;")
                ##Fonts##
                sansFont = QFont('impact', 18)
                sansFont.setStretch(65)
                
                
                
        @Slot()
        
        def insert(self):
                self.buttText = self.sender().text()
                if  (self.sender().text()) in ".0123456789" :
                        """"""
                elif (self.sender().text()) == "-/+":
                        self.buttText = " " + "-"
                elif (self.sender().text()) == "fact()":
                        self.buttText = "factorial: "
                else:
                        self.buttText = " "  + self.buttText + " "
                if self.text() == "0": 
                        self.setText(self.buttText)
                elif (self.sender().text()) == "-/+"  and self.buttText[1] == "-":
                        onSc = self.text()
                        newText = str(onSc[:1] + "+" + onSc[2:])
                        self.setText(newText)
                else:
                        self.setText(self.text() + self.buttText)
                
        def fac(self,  n):
                i = 1
                total = 1
                while i < n:
                        res = n-i
                        total = total * res
                        i += 1
                result = n * total
                return result
                
        def result(self):
                onScreen = self.text()     
                onScreen = onScreen[:len(onScreen)-2]
                
                if '^' in onScreen:
                        place = string.find(onScreen, '^')
                        result = int(onScreen[:place]) ** int(onScreen[place+1:])
                #findFact = find(onScreen, 'fact!')
                elif 'factorial:' in onScreen:
                        onScreen = onScreen[10:]
                        n = int(onScreen)
                       # if n == 0: 
                        #        res = 1
                        #elif n == 1:
                        #        res = 1
                        #else:
                        #        res = n*self.fac(n-1)
                        #result = ("fact(%d) = " % n)  + str(res)
                        result = self.fac(n)
          
                else:
                        result = eval(onScreen)

                
                                
                        
                result = str(result) 
                self.setText(result)
                        

        def hist(self):
                copied = self.copy()
                onScreen = str(self.text())
                copied = self.copy()
                cal.historyButton.setText(onScreen)
                
class Cal(QWidget):
        buttons = {}
        Layouts ={}
        def __init__(self, parent=None):
                QWidget.__init__(self, None)

                ##Main Window##
                self.setWindowTitle("Simple Calculator")
                self.setMaximumSize(300,370)
                self.setMinimumSize(300,370)
                #self.setStyleSheet("color:#ffffff;")

                
                ##Layout##
                Grid = QVBoxLayout()
                self.Layouts['screenLayout'] = QHBoxLayout()
                self.Layouts['underScreen'] = QHBoxLayout()
                self.Layouts[0] = QHBoxLayout()
                self.Layouts[1] = QHBoxLayout()
                self.Layouts[2] = QHBoxLayout()
                self.Layouts[3] = QHBoxLayout()
                self.Layouts[4] = QHBoxLayout()
                
                Grid.addLayout(self.Layouts['screenLayout'])
                Grid.addLayout(self.Layouts['underScreen'])
                Grid.addLayout(self.Layouts[0]) 
                Grid.addLayout(self.Layouts[1]) 
                Grid.addLayout(self.Layouts[2])
                Grid.addLayout(self.Layouts[3])
                Grid.addLayout(self.Layouts[4])
                
                self.setLayout(Grid)

                
                ##Screen##
                self.Screen = screen()
                self.Layouts['screenLayout'].addWidget(self.Screen)
                ## do math ##
                


                ##Layout Under Screen##
                self.historyButton = QPushButton('Copy')
                self.clearButton = QPushButton('Clr')
                self.backSpaceButton = QPushButton('<-')
                self.backSpaceButton.setMaximumSize(40,30)
                self.Layouts['underScreen'].addWidget(self.historyButton)
                self.Layouts['underScreen'].addWidget(self.clearButton)
                self.Layouts['underScreen'].addWidget(self.backSpaceButton)

                ##Functions to start##
                self.doButton()
                self.doEvent()
                

        ##Making New Buttons##
        def makeButton(self, buttonName, layoutName):
                button = QPushButton('%s' % buttonName)
                #button.setFlat(1)
                #button.setStyleSheet("color:#FFFFFF;background-color:#416f9a;height:40;border-style:groove;border-radius:0px;border-width:1px;border-color:#ccc;")
                layoutName.addWidget(button)
                return button
        
        def doButton(self):
                n1 = ['fact()','^','%','/','7','8','9','*','4','5','6','-','1','2','3','+','.','-/+','0','=']
                
                
                for i in range(len(n1)):
                        self.buttons[n1[i]] = self.makeButton(n1[i], self.Layouts[ (i / 4)])
                        
                self.buttons['='].setMinimumSize(50,40)
                #self.buttons['='].setStyleSheet("height:20px;width:30px;")
               


        
                
        ##Events and Connections##
        def doEvent(self):
                self.connect(self.clearButton, SIGNAL('clicked()'), self.Screen, SLOT('clear()'))
                for i in self.buttons.keys() :
                    self.connect(self.buttons[i], SIGNAL('clicked()'), self.Screen, SLOT('insert()'))
                self.connect(self.buttons['='], SIGNAL('clicked()'), self.Screen, SLOT('result()'))
                self.connect(self.historyButton, SIGNAL('clicked()'), self.Screen, SLOT('hist()'))
                self.connect(self.backSpaceButton, SIGNAL('clicked()'), self.Screen, SLOT('backspace()'))

                  



if __name__ == '__main__':
        App = QApplication(sys.argv)
        App.setStyle('plastique')
        cal = Cal()
        cal.show()
        App.exec_()
        sys.exit()
