#!/usr/bin/env python

import sys
from PySide.QtCore import QFile, Property, Signal, QUrl, Qt
from PySide.QtGui import QPixmap, QApplication, QFileDialog
import os, md5, math
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 Main(QDeclarativeView): ################## Main Class ##################
  dbus = myDBus
  loop = None
  licz = [] 
  pathList = [] 
  miniatures = None
  laySpacing = 10
  size = 6
  confChacheFiles = False
  loadSubfolders = False
  dirPix = "/home/user/MyDocs/DCIM"
  config = "/home/user/.maepygalleryqmlconfig"
  localDir = os.getcwd()
  adjustedHeight = 0
  
  def __init__(self, size, parent=None):
    super(Main, self).__init__()
    self.setAttribute(Qt.WA_Maemo5AutoOrientation)
    #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
      print self.loadSubfolders
#      return
      
    self.initUi()
#    QApplication.desktop().resized.connect(self.emitDesktopWH)  #odbieranie sygnalu zmienienia rozmiarow okna
    
#  sygnaly i petla ladujaca zdjecia
  sig = Signal(str, str)
  sigCountImages = Signal(int, str)
  sigDesktopWidthHeight = Signal(int, int)
  chDirSig = Signal()
  sigStartLoadThumbs = Signal()
  sigConfig = 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]
    self.sig.emit(thumb, fullImg)
    self.i+=1
  def emitDesktopWH(self):
    self.sigDesktopWidthHeight.emit(QApplication.desktop().width(), QApplication.desktop().height())
  
  def emitCountImages(self):
    self.sigCountImages.emit(len(self.miniaturki), self.dirPix)
      
  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 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])
        
#    return
#    QApplication.processEvents()
    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

    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")

if __name__ == '__main__':  
  app = QApplication(sys.argv)
  app.setApplicationName("MaePyGallery")
  app.setDoubleClickInterval(300)
  mai = Main(4)
  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.startLoadThumbs.connect(mai.emitStartLoadThumbs)
  root.sendLoadSubfolders.connect(mai.setLoadSubfolders)
  root.quit.connect(mai.close)
  mai.sig.connect(root.updateMsg)
  mai.sigDesktopWidthHeight.connect(root.updateWH)
  mai.sigCountImages.connect(root.updateCountImages)
  mai.chDirSig.connect(root.changeDirAfter)
  mai.sigStartLoadThumbs.connect(root.loadThumbs())
  root.setConfig(mai.loadSubfolders)
  mai.sigConfig.connect(root.setConfig)
  mai.takeScreenShot(mai)
  mai.showFullScreen()
#  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_())
