#!/usr/bin/python

# Copyright (C) 2012 Jonathan Ciesla

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.


import qrcode
import pygtk
pygtk.require('2.0')
import gtk
import tempfile
import os
import glob

version = '0.2.1'

if os.path.exists('logo.png'):
    logo_path = 'logo.png'
elif os.path.exists('/usr/share/quearcode/logo.png'):
    logo_path = '/usr/share/quearcode/logo.png'
else:
    print "Logo missing."
    exit()

class quearcode:

    def delete_event(self, widget, event, data=None):
        for temp in glob.glob(tempfile.gettempdir() + "/quearcode*.png"):
            os.unlink(temp)
        gtk.main_quit()
        return False

    def runthing(self, widget, data, error, box, border):
        filename = data.get_filename()
        errorval = error.get_value()

        #check file size
        fileinfo = os.stat(filename)
        filesize = fileinfo.st_size
        toobig = 0
        if filesize>2953 and errorval==0.0:
            toobig = 1
            bytes = 2953
        if filesize>2331 and errorval==1.0:
            toobig = 1
            bytes = 2331
        if filesize>1663 and errorval==2.0:
            toobig = 1
            bytes = 1663
        if filesize>1273 and errorval==3.0:
            toobig = 1
            bytes = 1273

        if toobig==1:
            message = 'Too large to create valid QR code. File is ' + str(filesize) + ' bytes, must be less than ' + str(bytes)
            self.md = gtk.MessageDialog(parent=self.files, message_format=message, flags=gtk.DIALOG_DESTROY_WITH_PARENT, type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_CLOSE)
            self.md.set_title("File error")
            self.md.run()
            self.md.destroy()
        else:
            file = open(filename, 'r')
            filedata = file.read()
            file.close()
            if errorval==0.0:
                errorcol = qrcode.constants.ERROR_CORRECT_L
            if errorval==1.0:
                errorcol = qrcode.constants.ERROR_CORRECT_M
            if errorval==2.0:
                errorcol = qrcode.constants.ERROR_CORRECT_Q
            if errorval==3.0:
                errorcol = qrcode.constants.ERROR_CORRECT_H
            boxval = box.get_value()
            borderval = border.get_value()
            qr_image = qrcode.QRCode(version=None,
                error_correction=errorcol,
                box_size=boxval,
                border=borderval
            )
            qr_image.add_data(filedata)
            qr_image.make(fit=True)

            img = qr_image.make_image()

            for temp in glob.glob(tempfile.gettempdir() + "/quearcode*.png"):
                os.unlink(temp)
            tempf, name = tempfile.mkstemp(suffix=".png", prefix="quearcode")
            img.save(name)
            os.system("xdg-open " + name)
            os.close(tempf)

    def filehomedial(self, widget, event, data=None):
        self.files = gtk.FileSelection("File selection")
        self.files.ok_button.connect("clicked", self.runthing, self.files, self.errorscale, self.boxscale, self.borderscale)
        self.files.cancel_button.connect("clicked", lambda w: self.files.destroy())
        self.files.set_filename("~/")
        self.files.show()
        return False

    def generate_qrcode(self, widget, text, error, box, border):
        textract = text.get_text()
        errorval = error.get_value()
        if errorval==0.0:
            errorcol = qrcode.constants.ERROR_CORRECT_L
        if errorval==1.0:
            errorcol = qrcode.constants.ERROR_CORRECT_M
        if errorval==2.0:
            errorcol = qrcode.constants.ERROR_CORRECT_Q
        if errorval==3.0:
            errorcol = qrcode.constants.ERROR_CORRECT_H
        boxval = box.get_value()
        borderval = border.get_value()
        qr_image = qrcode.QRCode(version=None,
            error_correction=errorcol,
            box_size=boxval,
            border=borderval
        )
        qr_image.add_data(textract)
        qr_image.make(fit=True)

        img = qr_image.make_image()

        for temp in glob.glob(tempfile.gettempdir() + "/quearcode*.png"):
            os.unlink(temp)
        tempf, name = tempfile.mkstemp(suffix=".png", prefix="quearcode")
        img.save(name)
        os.system("xdg-open " + name)
        os.close(tempf)

    def __init__(self):

        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.set_title("quearcode " + version)
        self.window.set_border_width(10)
        self.window.connect("delete_event", self.delete_event, None)

        self.mainbox = gtk.HBox(False, 0)
        self.window.add(self.mainbox)

        self.rightbox = gtk.VBox(False, 0)
        self.mainbox.pack_start(self.rightbox, True, True, 0)

        self.tooltips = gtk.Tooltips()

        self.logo = gtk.Image()
        self.logo.set_from_file(logo_path)
        self.tooltips.set_tip(self.logo, "So meta it hurts.", tip_private=None)
        self.rightbox.pack_start(self.logo, True, True, 0)

        self.errorlabel = gtk.Label("Error correction")
        self.rightbox.pack_start(self.errorlabel, True, True, 0)

        self.erroradj = gtk.Adjustment(1.0, 0.0, 4.0, 1.0, 1.0, 1.0)
        self.errorscale = gtk.HScale(self.erroradj)
        self.rightbox.pack_start(self.errorscale, True, True, 0)

        self.boxlabel = gtk.Label("Box size in pixels")
        self.rightbox.pack_start(self.boxlabel, True, True, 0)

        self.boxadj = gtk.Adjustment(10.0, 1.0, 101.0, 1.0, 1.0, 1.0)
        self.boxscale = gtk.HScale(self.boxadj)
        self.rightbox.pack_start(self.boxscale, True, True, 0)

        self.borderlabel = gtk.Label("Border size in boxes")
        self.rightbox.pack_start(self.borderlabel, True, True, 0)

        self.borderadj = gtk.Adjustment(4.0, 4.0, 101.0, 1.0, 1.0, 1.0)
        self.borderscale = gtk.HScale(self.borderadj)
        self.rightbox.pack_start(self.borderscale, True, True, 0)


        self.textentry = gtk.Entry(0)
        self.textentry.set_max_length(4296)
        self.textentry.set_activates_default(True)
        self.textentry.set_text('quearcode')
        self.tooltips.set_tip(self.textentry, "Content for QR Code", tip_private=None)
        self.rightbox.pack_start(self.textentry, True, True, 0)

        self.genbutton = gtk.Button("Generate")
        self.genbutton.connect("clicked", self.generate_qrcode, self.textentry, self.errorscale, self.boxscale, self.borderscale)
        self.tooltips.set_tip(self.genbutton, "Generate QR Code", tip_private=None)
        self.genbutton.set_flags(gtk.CAN_DEFAULT)
        self.window.set_default(self.genbutton)
        self.rightbox.pack_start(self.genbutton, True, True, 0)


        self.filehomebutton = gtk.Button("Encode file...")
        self.filehomebutton.connect("clicked", self.filehomedial, None, self.errorscale)
        self.tooltips.set_tip(self.filehomebutton, "Encode a file", tip_private=None)
        self.rightbox.pack_start(self.filehomebutton, True, True, 0)


        self.quitbutton = gtk.Button("Quit")
        self.quitbutton.connect("clicked", self.delete_event, None)
        self.tooltips.set_tip(self.quitbutton, "Exit quearcode", tip_private=None)
        self.rightbox.pack_start(self.quitbutton, True, True, 0)

        self.quitbutton.show()
        self.borderscale.show()
        self.borderlabel.show()
        self.boxscale.show()
        self.boxlabel.show()
        self.errorscale.show()
        self.errorlabel.show()
        self.genbutton.show()
        self.filehomebutton.show()
        self.textentry.show()
        self.logo.show()
        self.rightbox.show()
        self.mainbox.show()
        self.window.show()




def main():
    gtk.main()

if __name__ == "__main__":
    hello = quearcode()
    main()
