#!/usr/bin/env python

import sys, os
from qt import *
from qtsql import *

from testform3 import Form3
from dbconnect import createConnection

class mainWindow(Form3):
    def __init__(self, app, parent = None, name = None, fl = 0):
        Form3.__init__(self,parent,name,fl)
        self.app = app
        self.imageFile = None
        self.descMod = None

    def polish(self):
        if self.ImageDataBrowser:
            self.ImageDataBrowser.setAutoEdit(1)
            #self.ImageDataBrowser.setConfirmEdits(1)
            self.connect(self.ImageDataBrowser, SIGNAL("primeInsert(QSqlRecord *)"),
                         self.primeInsert)
            self.connect(self.ImageDataBrowser, SIGNAL("beforeInsert(QSqlRecord *)"),
                         self.beforeInsert)
            self.connect(self.ImageDataBrowser, SIGNAL("primeUpdate(QSqlRecord *)"),
                         self.primeUpdate)
            self.connect(self.ImageDataBrowser, SIGNAL("beforeUpdate(QSqlRecord *)"),
                         self.beforeUpdate)
            self.connect(self.ImageDataBrowser, SIGNAL("beforeDelete(QSqlRecord *)"),
                         self.beforeDelete)
            self.connect(self.ImageDataBrowser, SIGNAL("currentChanged(const QSqlRecord *)"),
                         self.currentChanged)
            self.connect(self.ImageDataBrowser, SIGNAL("cursorChanged(QSqlCursor::Mode)"),
                         self.cursorChanged)
            self.connect(self.teDesc, SIGNAL("modificationChanged(bool)"),
                         self.descModified)

            if not self.ImageDataBrowser.sqlCursor():
                cur = QSqlCursor("test")
                cur.setTrimmed("name", 1)
                cur.setTrimmed("file", 1)
                #cur.setTrimmed("descr", 1)
                #cur.setGenerated("descr", 0)
                #cur.setGenerated("image", 0)
                self.ImageDataBrowser.setSqlCursor(cur, 1)
                idIndex = cur.index("id")
                self.ImageDataBrowser.setSort(idIndex)
                self.ImageDataBrowser.refresh()
                self.ImageDataBrowser.first()
        QWidget.polish(self)

    def pbLoadImage(self):
        print "mainWindow.pbLoadImage()"
        fn = None
        cur = self.ImageDataBrowser.sqlCursor()
        if cur:
            fn = cur.value("file").toString()
        fn = QFileDialog.getOpenFileName(fn, None, self)
        if not fn.isEmpty():
            self.loadImage(fn)
            self.descModified(1)

    def pbLoadManyImages(self):
        print "mainWindow.pbLoadManyImages()"
        fn = None
        cur = self.ImageDataBrowser.sqlCursor()
        if cur:
            fn = str(cur.value("file").toString())
            fp = os.path.dirname(fn)
        fl = QFileDialog.getOpenFileNames(
                        "Images (*.png *.xpm *.jpg)", fp, self)
        for f in fl:
            if f.isEmpty():
                continue
            fn = os.path.basename(str(f))
            fext = None
            if fn:
                fn, fext = os.path.splitext(fn)
            self.ImageDataBrowser.insert()
            self.leName.setText(fn)
            self.loadImage(f)
            self.descModified(1)
            self.app.processEvents()
        if fl:
            self.ImageDataBrowser.refresh()
            self.ImageDataBrowser.last()


    def pbSaveImage(self):
        print "mainWindow.pbSaveImage()"
        cur = self.ImageDataBrowser.sqlCursor()
        if not cur:
            return
        fn = cur.value("file").toString()
        fn = QFileDialog.getSaveFileName(fn, None, self)
        if fn.isEmpty():
            return
        fh = open(str(fn), "w")
        if fh:
            fh.write(str(cur.value("image").toByteArray()))
            fh.close()

    def loadImage(self, file, data = None):
        print "mainWindow.loadImage(%s)" % file
        if data:
            print "load image data", len(str(data))
            self.imageFile = None
            l = len(str(data))
        else:
            print "load image file", file
            self.imageFile = str(file)
            data = file
            #FIXME: file length
            l = open(str(file)).seek(0, 2)
        pm = QPixmap(data)
        sz = pm.size()
        if sz.width() > self.sbWidth.value() or \
           sz.height() > self.sbHeight.value():
            print "scaling"
            im = pm.convertToImage()
            im = im.smoothScale(512, 256, QImage.ScaleMin)
            pm.convertFromImage(im)
        self.tlImage.setPixmap(pm)
        if l:
            lbl = "%s: %s Bytes (%s x %s)" % (file, l, sz.width(), sz.height())
        else:
            lbl = "%s: (%s x %s)" % (file, sz.width(), sz.height())
        self.tlFileInfo.setText(lbl)
        self.descMod = None

    def resetImage(self):
        print "mainWindow.resetImage()"
        self.imageFile = None
        self.descMod = None
        self.tlImage.setText("load an image")
        self.teDesc.setText("")
        self.tlFileInfo.setText("")

    def storeImage(self, rec):
        # image, file
        if self.imageFile:
            data = open(self.imageFile, 'r').read()
            a = QByteArray(data)
            rec.setValue("image", QVariant(a))
            rec.setValue("file", QVariant(self.imageFile))
            print "store image:", len(data)
            #db = QSqlDatabase.database().driver()
            #print "in db with %s bytes" % len(str(db.formatValue(rec.field("image"))))
        # descr
        data = self.teDesc.text()
        if not data.isEmpty():
            a = QByteArray(data.latin1())
            rec.setValue("descr", QVariant(a))
            print "store descr"

    def descModified(self, m):
        print "mainWindow.descModified(%s)" % m
        cur = self.ImageDataBrowser.sqlCursor()
        if not cur:
            return
        if m and not self.descMod:
            self.descMod = cur.value("chgts")
            cur.setValue("chgts", QVariant(QDateTime()))
            print "modified"
        elif not m and self.descMod:
            cur.setValue("chgts", self.descMod)
            self.descMod = None
            print "not modified",
        print "cur mode:", cur.mode()

    def primeInsert(self, rec):
        print "mainWindow.primeInsert()"
        self.resetImage()

    def beforeInsert(self, rec):
        print "mainWindow.beforeInsert()"
        rec.setValue("id", QVariant(0))
        #print "id:", rec.value("id").toString()
        #print "name: <%s>" % rec.value("name").toString().latin1()
        #print "file: <%s>" % rec.value("file").toString().latin1()
        self.storeImage(rec)

    def primeUpdate(self, rec):
        print "mainWindow.primeUpdate()"
        #print "id:", rec.value("id").toString()
        #print "name: <%s>" % rec.value("name").toString().latin1()
        #print "file: <%s>" % rec.value("file").toString().latin1()
        self.currentChanged(rec)

    def beforeUpdate(self, rec):
        print "mainWindow.beforeUpdate()"
        #print "id:", rec.value("id").toString()
        #print "name: <%s>" % rec.value("name").toString().latin1()
        #print "file: <%s>" % rec.value("file").toString().latin1()
        self.storeImage(rec)
        rec.setValue("chgts", QVariant(QDateTime()))

    def beforeDelete(self, rec):
        print "mainWindow.beforeDelete()"
        self.resetImage()

    def currentChanged(self, rec):
        print "mainWindow.currentChanged()"
        file = rec.value("file").toString()
        self.teDesc.setText(rec.value("descr").toString())
        self.loadImage(file, rec.value("image").toByteArray())

    def cursorChanged(self, mode):
        print "mainWindow.cursorChanged", mode
        cur = self.ImageDataBrowser.sqlCursor()
        if cur:
            self.currentChanged(cur)
        db = QSqlDatabase.database()
        if db:
            drt = db.lastError().driverText()
            dbt = db.lastError().databaseText()
            if not drt.isEmpty():
                print "ERR driver: %s" % drt
            if not dbt.isEmpty():
                print "ERR database: %s" % drb


if __name__ == "__main__":
    a = QApplication(sys.argv)
    if createConnection():
        QObject.connect(a,SIGNAL("lastWindowClosed()"),a,SLOT("quit()"))
        w = mainWindow(a)
        a.setMainWidget(w)
        w.show()
        a.exec_loop()

