#!/usr/bin/env python

import sys
from PySide.QtCore import QFile, Property, Signal, QUrl, Qt
from PySide.QtGui import QMainWindow, QLabel, QPixmap, QApplication, QFileDialog
import os, md5, math
import datetime
from PySide.QtDeclarative import QDeclarativeView
import dbus
import osso
import dbus.service
import dbus.mainloop.glib

class myDBus(dbus.service.Object):  ############ DBus connection class ######
 def __init__(self, b, object_path="/"):
   dbus.service.Object.__init__(self, b, object_path)

 @dbus.service.signal('com.nokia.hildon_desktop')
 def exit_app_view(self, message):
  #wyslanie komunikatu exit_app_view do hildon_desktop 
  pass

class loading(QMainWindow): ################## Main Class ##################
  
  def __init__(self, parent=None):
    super( loading, self).__init__()
    self.setAttribute(Qt.WA_Maemo5AutoOrientation)
  
    
class Main(QDeclarativeView): ################## Main Class ##################
  dbus = myDBus
  loop = None
  licz = [] 
  pathList = [] 
  miniatures = None
  laySpacing = 10
  size = 6
  confChacheFiles = False
  loadSubfolders = False
  sortByAZ = False
  dirPix = "/home/user/MyDocs/DCIM"
  config = "/home/user/.maepygalleryqmlconfig"
  localDir = os.getcwd()
  adjustedHeight = 0
  
  def __init__(self, size, loading, parent=None):
    super(Main, self).__init__()
    self.setAttribute(Qt.WA_Maemo5AutoOrientation)
    self.loading = loading
    #wczytywanie configu
    if QFile.exists(self.config):
      conf = open(self.config, "r")
      self.dirPix = conf.readline()
      self.dirPix = self.dirPix[:-1]
      temp = conf.readline()
      if temp == "True":
        self.loadSubfolders = True
      else:
        self.loadSubfolders = False
#      return
      
    self.initUi()

#  sygnaly i petla ladujaca zdjecia
  sig = Signal(str, str, str, str, int)
  sigCountImages = Signal(int, str)
  sigDesktopWidthHeight = Signal(int, int)
  chDirSig = Signal()
  sigStartLoadThumbs = Signal()
  sigConfig = Signal(str)
  sigSendImageInfo = Signal(str)
  i = 0
  def emitSig(self):
    if self.i > (len(self.miniaturki)-1):
      self.i = 0
#      self.sig.emit("0", "0")
#      return
    thumb = self.miniaturki[self.i]
    fullImg = self.listForSum[self.i]
    a = os.stat(self.listForSum[self.i][6:])
    makeTime = str(datetime.datetime.fromtimestamp(a[8]))
    modifyTime = str(datetime.datetime.fromtimestamp(a.st_ctime))
    fileSize = a.st_size/1024
    self.sig.emit(thumb, fullImg, makeTime, modifyTime, fileSize)
    self.i+=1
   
  def emitDesktopWH(self):
    pass
  #  self.sigDesktopWidthHeight.emit(QApplication.desktop().width(), QApplication.desktop().height())
  
  def emitCountImages(self):
    self.sigCountImages.emit(len(self.miniaturki), self.dirPix)
      
  def emitImageInfo(self):
    pass
    
  def emitStartLoadThumbs(self):
    self.sigConfig.emit(self.loadSubfolders)
    self.sigStartLoadThumbs.emit()
    
  def setLoadSubfolders(self):
    if self.loadSubfolders:
      self.loadSubfolders = False
    else:
      self.loadSubfolders = True
    self.initUi()
    
  def sorting(self):
    if self.sortByAZ:
      self.sortByAZ = False
    else:
      self.sortByAZ = True
    self.initUi()
      
    
  def deleteFiles(self, str):
    a = str.split(" ")
    a = a[:-1]
    temp = []
    for i in range(len(self.listForSum)):
      if unicode(i) in a:
        temp.append(self.listForSum[i])
        
    for i in self.listForSum:
      if i in temp:
        print "deleting " + i[7:]
        os.remove(i[7:])
        #self.listForSum.remove(i)
        #self.miniaturki.remove(i)
    self.initUi()
    self.sigStartLoadThumbs.emit()
    
    
    
  def closeEvent(self, event):
#    self.takeScreenShot(self)
    config = open(self.config, "w")
    config.write(self.dirPix + "\n")
    config.write(str(self.loadSubfolders))
    config.close()
    self.hide()
    
  def chPixDir(self):
    temp = QFileDialog.getExistingDirectory(self, "Choose dir", "/home/user/MyDocs", QFileDialog.ShowDirsOnly)
    if temp == self.dirPix:
      pass
    elif temp == '' and len(self.licz) == 0:
      self.dirPix = "/home/user/MyDocs/.images"
      self.i = 0
      self.initUi()  # ponowne zaladowanie list ze sciezkami
      self.chDirSig.emit()
    elif temp == '':
      print len(self.licz)
      pass   
    else:
      self.dirPix = temp
      self.i = 0
      self.initUi()  # ponowne zaladowanie list ze sciezkami
      self.chDirSig.emit()   
    #self.showMaximized()
  
    
  def initUi(self):
    # ustawienie dla przypadku obkrecenia telefonem podczas ladowania zdjec
    # stwarzalo to bledy, zablokowanie sygnalow podczas ladowania
    #QApplication.desktop().blockSignals(True)
    if self.miniatures != None: #usuwanie altualnych miniatur, wywolywane jesli user zmieni katalog
      del self.miniatures[:]

    os.chdir(self.dirPix)
    if len(self.licz) != 0:
      del self.licz[:]
      
#    self.licz = glob.glob(self.dirPix+"/*.jpg")
#    templ = glob.glob(self.dirPix+"/*.jpeg")
#    li = os.listdir(os.getcwd())
    li = []
    if self.loadSubfolders:
      for root, dirs, fi in os.walk(self.dirPix):
        print root
        for i in range(len(fi)):
          li.append("file://"+ root + "/" + fi[i])
    else:
      li = os.listdir(self.dirPix)
      for i in range(len(li)):
        li[i] = "file://"+ self.dirPix + "/" + li[i]
    
    for i in range(len(li)):
      if li[i].endswith("jpg") or li[i].endswith("jpeg") or li[i].endswith("JPG") or li[i].endswith("JPEG") or li[i].endswith("BMP") or li[i].endswith("PNG") or li[i].endswith("png") or li[i].endswith("bmp"):
        self.licz.append(li[i])
        
#    self.licz.sort()
#    self.licz = self.licz[-(len(self.licz)/2):]
    if self.sortByAZ:
      self.licz.sort()
    else:
      for i in range(len(self.licz)):
  #      self.licz.pop(i)
       a = os.stat(self.licz[i][6:])
       for j in range(len(self.licz)):
         b = os.stat(self.licz[j][6:])
         if a[8] > b[8]:
  #          print "a = ", a[8], "b = ", b[8] 
           x = self.licz[i]
           c = self.licz[j]
           self.licz[i] = c
           self.licz[j] = x
  #          break
  #  
    
    text = "MaePyGalleryQML"
    self.setWindowTitle(text)
       
    #self.licz.sort()
    #tworzenie listy do sprawdzania sumy md5
    self.listForSum = self.licz
#    for i in range(len(self.licz)):
#      self.listForSum[i] = "file://"+ self.dirPix+"/" + self.licz[i]
    
    self.thumbList = os.listdir("/home/user/.thumbnails/cropped")
    la = os.listdir("/home/user/.thumbnails/normal")
    #usuniecie koncowki .jpegz listy
    for i in range(len(self.thumbList)):
      self.thumbList[i] = self.thumbList[i][:-5]
#    print self.thumbList
    
    #tworzenie listy ze sciezkami do miniaturek zdjec ktore sa w wybranym katalogu
    self.miniaturki = range(len(self.licz))
    for i in range(len(self.licz)):
      a = md5.new(self.listForSum[i]).hexdigest() #suma kontrolna
#      print a
      if a in self.thumbList:
#        print str(a)+".jpeg"
        self.miniaturki[i] = (str(a)+".jpeg")
      else:
        print "no thumbnail for ", self.listForSum[i], self.licz[i]
        self.miniaturki[i] = (str(a)+".jpeg")
#    print self.miniaturki
    os.chdir("/home/user/.thumbnails/cropped")
 
    for i in range(len(self.miniaturki)):
      self.miniaturki[i] = "/home/user/.thumbnails/cropped" + "/" + self.miniaturki[i]
      #    print self.thumbList
    
#    fileDict = {}
#    for i in range(len(self.licz)):
#      fileDict[self.licz[i]] = [self.miniaturki[i], os.stat(self.licz[i][6:])]
#      print fileDict[self.licz[i]]
#    
#    print fileDict[self.licz[i]][0]
#    print fileDict[self.licz[i]][1][8]
#    
    #self.miniaturki = ["ala"]
    if len(self.licz) == 0:  # there is no jpg's in dir
      print "there is no files in that directory, why? there should be on N900, trying to load from .images"
      self.chPixDir()
      return
      
#    self.miniatures = range(len(self.miniaturki))#len(self.licz))
#    self.pathList = range(len(self.miniaturki))    
  
  def takeScreenShot(self, widget):
    pvr = "/home/user/.cache/launch/com.nokia.maepygalleryqml.pvr"
    if not QFile.exists(pvr):
      ala = QPixmap("/opt/maepygalleryqml/splash.png")
      ala.save(pvr, "png")
#    QPixmap.grabWidget(widget).save(pvr, "png")

  def minimize(self):
    self.dbus.exit_app_view("maepygallery minimize")
    
if __name__ == '__main__':  
  app = QApplication(sys.argv)
  app.setApplicationName("MaePyGallery")
  app.setDoubleClickInterval(300)
  mai = Main(4, loading)
  mai.showFullScreen()
  os.chdir(mai.localDir)
  mai.osso_c = osso.Context("com.nokia.maepygalleryqml", "0.0.1", False)
  dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
  mai.dbus = myDBus(dbus.SessionBus())
  mai.setSource(QUrl('/opt/maepygalleryqml/viewGrid.qml'))
  root = mai.rootObject()
  mai.setAttribute(Qt.WA_Maemo5AutoOrientation)
  mai.setResizeMode(QDeclarativeView().SizeRootObjectToView)  
#  try:
  root.getImagePaths.connect(mai.emitSig)
  root.posX.connect(mai.emitDesktopWH)
  root.changeDir.connect(mai.chPixDir)
  root.getCountImages.connect(mai.emitCountImages)
  root.getImageInfo.connect(mai.emitImageInfo)
  root.startLoadThumbs.connect(mai.emitStartLoadThumbs)
  root.sendLoadSubfolders.connect(mai.setLoadSubfolders)
  root.deleteFiles[str].connect(mai.deleteFiles)
#  root.rotating.connect(root.resetImgPos)
  root.minimalize.connect(mai.minimize) 
  root.sorting.connect(mai.sorting)
  root.quit.connect(mai.close)
  mai.sig.connect(root.updateMsg)
  mai.sigCountImages.connect(root.updateCountImages)
  mai.chDirSig.connect(root.changeDirAfter)
  mai.sigStartLoadThumbs.connect(root.loadThumbs)
  root.loadThumbs()
  root.setConfig(mai.loadSubfolders)
  mai.sigConfig.connect(root.setConfig)
  mai.takeScreenShot(mai)
  mai.showFullScreen()
#  print dir(QFile)
#  mai.sigCountImages.emit(len(mai.miniaturki), mai.dirPix)
#  mai.takeScreenShot(mai)
  
#  except:
#    f = open("/home/user/MyDocs/MaePyGallery-Error.txt", "w")
#    f.write("error when opening QML file")
#    f.close()
#    mai.show()
#    
  #mai.dbus.exit_app_view("costam")
  #mai.dbus.exit_app_view("costam")
  sys.exit(app.exec_())
