mirror of https://github.com/NaN-tic/nanscan.git
193 lines
5.4 KiB
Python
193 lines
5.4 KiB
Python
from Scanner import *
|
|
from PyQt4.QtGui import *
|
|
from PyQt4.QtCore import *
|
|
from PyQt4.uic import *
|
|
import gettext
|
|
import locale
|
|
import gc
|
|
|
|
locale.setlocale(locale.LC_ALL, '')
|
|
gettext.bindtextdomain('nanscan', '.')
|
|
gettext.textdomain('nanscan')
|
|
gettext.install('nanscan', '.', unicode=1)
|
|
|
|
|
|
|
|
class ImageItem(QListWidgetItem):
|
|
def __init__(self, parent=None):
|
|
QListWidgetItem.__init__(self, parent)
|
|
self.image = None
|
|
self.name = None
|
|
self.mark = None
|
|
|
|
def setName(self, name):
|
|
self.name = name
|
|
|
|
# Image should be a QImage
|
|
def setImage(self, image):
|
|
self.image = image
|
|
self.updateIcon()
|
|
|
|
# Mark should be a QImage
|
|
def setMark(self, mark):
|
|
self.mark = mark
|
|
self.updateIcon()
|
|
|
|
def updateIcon(self):
|
|
if not self.image or not self.mark:
|
|
return
|
|
|
|
image = self.image.scaled( self.listWidget().iconSize(), Qt.KeepAspectRatio, Qt.SmoothTransformation )
|
|
painter = QPainter( image )
|
|
painter.drawImage( 5, 5, self.mark )
|
|
painter.end()
|
|
self.setIcon( QIcon( QPixmap.fromImage( image ) ) )
|
|
|
|
class ScanDialog(QDialog):
|
|
def __init__(self, parent=None):
|
|
QDialog.__init__(self, parent)
|
|
|
|
dir = os.path.abspath( os.path.dirname(__file__) )
|
|
QResource.registerResource( os.path.join(dir,'common.rcc') )
|
|
loadUi( os.path.join(dir,'ScanDialog.ui'), self )
|
|
|
|
self.connect( self.pushAccept, SIGNAL('clicked()'), self.accept )
|
|
self.connect( self.pushScan, SIGNAL('clicked()'), self.scan )
|
|
self.connect( self.pushDuplexScan, SIGNAL('clicked()'), self.duplexScan )
|
|
self.uiList.setIconSize( QSize( 128, 128 ) )
|
|
self.saving = QSemaphore()
|
|
self.setScanning( False )
|
|
|
|
# By default images are stored as files in
|
|
# the temporary directory. The application
|
|
# may choose to override the 'thread' propery
|
|
# with an appropiate SaveThreaded() subclass
|
|
self.saveClass = FileSaveThreaded
|
|
|
|
def closeEvent(self, event):
|
|
if self.hasFinished:
|
|
event.accept()
|
|
else:
|
|
event.ignore()
|
|
|
|
def setScanning(self, value):
|
|
self.scanning = value
|
|
self.updateAccept()
|
|
|
|
def addSaving(self):
|
|
self.saving.release()
|
|
self.updateAccept()
|
|
|
|
def removeSaving(self):
|
|
self.saving.acquire()
|
|
self.updateAccept()
|
|
|
|
def updateAccept(self):
|
|
if self.scanning or self.saving.available():
|
|
self.hasFinished = False
|
|
self.pushAccept.setEnabled( False )
|
|
self.pushScan.setEnabled( False )
|
|
self.pushDuplexScan.setEnabled( False )
|
|
self.setCursor( Qt.BusyCursor )
|
|
else:
|
|
self.hasFinished = True
|
|
self.pushAccept.setEnabled( True )
|
|
self.pushScan.setEnabled( True )
|
|
self.pushDuplexScan.setEnabled( True )
|
|
self.unsetCursor()
|
|
|
|
def scan(self):
|
|
self.setScanning( True )
|
|
self.scan = Scanner(self)
|
|
self.scan.setDuplex( False )
|
|
self.connect( self.scan, SIGNAL('scanned(QImage)'), self.scanned )
|
|
self.connect( self.scan, SIGNAL('error(int)'), self.error )
|
|
self.connect( self.scan, SIGNAL('finished()'), self.finished )
|
|
self.scan.startScan()
|
|
|
|
def duplexScan(self):
|
|
self.setScanning( True )
|
|
self.scan = Scanner(self)
|
|
self.scan.setDuplex( True )
|
|
self.connect( self.scan, SIGNAL('scanned(QImage)'), self.scanned )
|
|
self.connect( self.scan, SIGNAL('error(int)'), self.error )
|
|
self.connect( self.scan, SIGNAL('finished()'), self.finished )
|
|
self.scan.startScan()
|
|
|
|
def error(self, code):
|
|
if code == ScannerError.NoDeviceFound:
|
|
message = 'No device found'
|
|
elif code == ScannerError.CouldNotOpenDevice:
|
|
message = 'Could not open device'
|
|
elif code == ScannerError.AcquisitionError:
|
|
message = 'Error acquiring image'
|
|
else:
|
|
message = 'Unknown error'
|
|
self.setScanning( False )
|
|
QMessageBox.critical( self, 'Scanning Error', message )
|
|
|
|
def scanned(self, image):
|
|
item = ImageItem( self.uiList )
|
|
item.setImage( image )
|
|
item.setMark( QImage( ':/images/images/save.png' ) )
|
|
item.setName( 'scanned image ' + unicode( QDateTime.currentDateTime().toString() ) )
|
|
item.setToolTip( _('Saving image...') )
|
|
|
|
self.uiList.addItem( item )
|
|
|
|
self.addSaving()
|
|
if self.saveClass:
|
|
thread = self.saveClass( self )
|
|
thread.item = item
|
|
self.connect( thread, SIGNAL('finished()'), self.saved )
|
|
thread.start()
|
|
|
|
def finished(self):
|
|
self.setScanning( False )
|
|
|
|
def saved(self):
|
|
self.removeSaving()
|
|
thread = self.sender()
|
|
|
|
if not thread.error:
|
|
thread.item.setMark( QImage( ':/images/images/ok.png' ) )
|
|
thread.item.setToolTip( _('Image stored successfully') )
|
|
else:
|
|
thread.item.setMark( QImage( ':/images/images/cancel.png' ) )
|
|
thread.item.setToolTip( _('Error storing image') )
|
|
|
|
# Free memory used by the BIG image
|
|
thread.item.image = None
|
|
gc.collect()
|
|
|
|
|
|
|
|
## @brief Base class for saving the image once scanned.
|
|
class SaveThreaded(QThread):
|
|
def __init__(self, parent=None):
|
|
QThread.__init__(self, parent)
|
|
self.item = None
|
|
self.error = True
|
|
|
|
## @brief This class stores an image into a file in the directory
|
|
# specified by 'directory' (temporary directory by default).
|
|
class FileSaveThreaded(SaveThreaded):
|
|
directory = unicode( QDir.tempPath() )
|
|
|
|
def run(self):
|
|
self.error = True
|
|
d = QDir( FileSaveThreaded.directory )
|
|
d.setSorting( QDir.Name )
|
|
l = d.entryList( ['*.png'] )
|
|
if l:
|
|
last = l[-1]
|
|
last = last.split('.')[0]
|
|
last = int(last)
|
|
else:
|
|
last = 0
|
|
next = "%06d.png" % (last + 1)
|
|
next = os.path.join( FileSaveThreaded.directory, next )
|
|
print "saving: ", next
|
|
if self.item.image.save( next, 'PNG' ):
|
|
self.error = False
|