home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / lib / hplip / ui / unloadform.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  15.6 KB  |  462 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. from base.g import *
  5. from base import utils, device, msg
  6. from prnt import cups
  7. from pcard import photocard
  8. import sys
  9. import os
  10. import os.path as os
  11. import socket
  12. from qt import *
  13. from unloadform_base import UnloadForm_base
  14. from imagepropertiesdlg import ImagePropertiesDlg
  15. progress_dlg = None
  16.  
  17. class IconViewItem(QIconViewItem):
  18.     
  19.     def __init__(self, parent, dirname, fname, path, pixmap, mime_type, mime_subtype, size, exif_info = { }):
  20.         QIconViewItem.__init__(self, parent, fname, pixmap)
  21.         self.mime_type = mime_type
  22.         self.mime_subtype = mime_subtype
  23.         self.path = path
  24.         self.dirname = dirname
  25.         self.filename = fname
  26.         self.exif_info = exif_info
  27.         self.size = size
  28.         self.thumbnail_set = False
  29.  
  30.  
  31.  
  32. class UnloadForm(UnloadForm_base):
  33.     
  34.     def __init__(self, bus = 'usb,par', device_uri = None, printer_name = None, parent = None, name = None, fl = 0):
  35.         UnloadForm_base.__init__(self, parent, name, fl)
  36.         self.pc = None
  37.         self.device_uri = device_uri
  38.         self.printer_name = printer_name
  39.         self.init_failed = False
  40.         if self.device_uri and self.printer_name:
  41.             log.error('You may not specify both a printer (-p) and a device (-d).')
  42.             (self.device_uri, self.printer_name) = (None, None)
  43.         
  44.         if not (self.device_uri) and not (self.printer_name):
  45.             probed_devices = device.probeDevices(bus = bus, filter = 'pcard')
  46.             cups_printers = cups.getPrinters()
  47.             log.debug(probed_devices)
  48.             log.debug(cups_printers)
  49.             max_deviceid_size = 0
  50.             x = 0
  51.             devices = { }
  52.             for d in probed_devices:
  53.                 if d.startswith('hp:'):
  54.                     printers = []
  55.                     for p in cups_printers:
  56.                         if p.device_uri == d:
  57.                             printers.append(p.name)
  58.                             continue
  59.                     
  60.                     devices[x] = (d, printers)
  61.                     x += 1
  62.                     max_deviceid_size = max(len(d), max_deviceid_size)
  63.                     continue
  64.             
  65.             if x == 0:
  66.                 NoDevicesForm = NoDevicesForm
  67.                 import nodevicesform
  68.                 self.failure(self._UnloadForm__tr('<p><b>No devices found that support photo card access.</b><p>Please make sure your device is properly installed and try again.'))
  69.                 self.init_failed = True
  70.             elif x == 1:
  71.                 log.info(utils.bold('Using device: %s' % devices[0][0]))
  72.                 self.device_uri = devices[0][0]
  73.             else:
  74.                 ChooseDeviceDlg = ChooseDeviceDlg
  75.                 import choosedevicedlg
  76.                 dlg = ChooseDeviceDlg(devices)
  77.                 if dlg.exec_loop() == QDialog.Accepted:
  78.                     self.device_uri = dlg.device_uri
  79.                 else:
  80.                     self.init_failed = True
  81.         
  82.         QTimer.singleShot(0, self.initialUpdate)
  83.  
  84.     
  85.     def initialUpdate(self):
  86.         if self.init_failed:
  87.             self.cleanup(EVENT_PCARD_UNABLE_TO_MOUNT)
  88.             return None
  89.         
  90.         QApplication.setOverrideCursor(QApplication.waitCursor)
  91.         
  92.         try:
  93.             self.pc = photocard.PhotoCard(None, self.device_uri, self.printer_name)
  94.         except Error:
  95.             e = None
  96.             log.error('An error occured: %s' % e[0])
  97.             self.failure(self._UnloadForm__tr('<p><b>Unable to mount photocard.</b><p>Could not connect to device.'))
  98.             self.cleanup(EVENT_PCARD_UNABLE_TO_MOUNT)
  99.             return None
  100.  
  101.         if self.pc.device.device_uri is None and self.printer_name:
  102.             log.error("Printer '%s' not found." % self.printer_name)
  103.             self.failure(self._UnloadForm__tr('<p><b>Unable to mount photocard.</b><p>Device not found.'))
  104.             self.cleanup(EVENT_PCARD_JOB_FAIL)
  105.             return None
  106.         
  107.         if self.pc.device.device_uri is None and self.device_uri:
  108.             log.error('Malformed/invalid device-uri: %s' % self.device_uri)
  109.             self.failure(self._UnloadForm__tr('<p><b>Unable to mount photocard.</b><p>Malformed/invalid device-uri.'))
  110.             self.cleanup(EVENT_PCARD_JOB_FAIL)
  111.             return None
  112.         
  113.         
  114.         try:
  115.             self.pc.mount()
  116.         except Error:
  117.             log.error('Unable to mount photo card on device. Check that device is powered on and photo card is correctly inserted.')
  118.             self.failure(self._UnloadForm__tr('<p><b>Unable to mount photocard.</b><p>Check that device is powered on and photo card is correctly inserted.'))
  119.             self.pc.umount()
  120.             self.cleanup(EVENT_PCARD_UNABLE_TO_MOUNT)
  121.             return None
  122.  
  123.         self.pc.device.sendEvent(EVENT_START_PCARD_JOB)
  124.         disk_info = self.pc.info()
  125.         self.pc.write_protect = disk_info[8]
  126.         if self.pc.write_protect:
  127.             log.warning('Photo card is write protected.')
  128.         
  129.         log.info('Photocard on device %s mounted' % self.pc.device_uri)
  130.         if not self.pc.write_protect:
  131.             log.info('DO NOT REMOVE PHOTO CARD UNTIL YOU EXIT THIS PROGRAM')
  132.         
  133.         self.unload_dir = os.path.normpath(os.path.expanduser('~'))
  134.         os.chdir(self.unload_dir)
  135.         self.UnloadDirectoryEdit.setText(self.unload_dir)
  136.         self.unload_list = self.pc.get_unload_list()
  137.         self.DeviceText.setText(self.pc.device.device_uri)
  138.         self.image_icon_map = {
  139.             'tiff': 'tif.png',
  140.             'bmp': 'bmp.png',
  141.             'jpeg': 'jpg.png',
  142.             'gif': 'gif.png',
  143.             'unknown': 'unknown.png' }
  144.         self.video_icon_map = {
  145.             'unknown': 'movie.png',
  146.             'mpeg': 'mpg.png' }
  147.         self.total_number = 0
  148.         self.total_size = 0
  149.         self.removal_option = 0
  150.         self.UpdateStatusBar()
  151.         if self.pc.write_protect:
  152.             self.FileRemovalGroup.setEnabled(False)
  153.             self.LeaveAllRadio.setEnabled(False)
  154.             self.RemoveSelectedRadio.setEnabled(False)
  155.             self.RemoveAllRadio.setEnabled(False)
  156.         
  157.         self.item_map = { }
  158.         QApplication.restoreOverrideCursor()
  159.         self.load_icon_view(first_load = True)
  160.  
  161.     
  162.     def closeEvent(self, event):
  163.         if self.pc is not None:
  164.             self.pc.device.sendEvent(EVENT_END_PCARD_JOB)
  165.         
  166.         event.accept()
  167.  
  168.     
  169.     def CancelButton_clicked(self):
  170.         self.cleanup()
  171.  
  172.     
  173.     def cleanup(self, error = 0):
  174.         if self.pc is not None:
  175.             if error > 0:
  176.                 self.pc.device.sendEvent(error, typ = 'error')
  177.             
  178.         
  179.         self.close()
  180.  
  181.     
  182.     def success(self):
  183.         QMessageBox.information(self, self.caption(), self._UnloadForm__tr('<p><b>The operation completed successfully.</b>'), QMessageBox.Ok, QMessageBox.NoButton, QMessageBox.NoButton)
  184.  
  185.     
  186.     def failure(self, error_text):
  187.         QMessageBox.critical(self, self.caption(), error_text, QMessageBox.Ok, QMessageBox.NoButton, QMessageBox.NoButton)
  188.  
  189.     
  190.     def load_icon_view(self, first_load):
  191.         QApplication.setOverrideCursor(QApplication.waitCursor)
  192.         self.first_load = first_load
  193.         if first_load:
  194.             self.IconView.clear()
  195.         
  196.         self.num_items = len(self.unload_list)
  197.         self.pb = QProgressBar()
  198.         self.pb.setTotalSteps(self.num_items)
  199.         self.statusBar().addWidget(self.pb)
  200.         self.pb.show()
  201.         self.item_num = 0
  202.         self.load_timer = QTimer(self, 'ScanTimer')
  203.         self.connect(self.load_timer, SIGNAL('timeout()'), self.continue_load_icon_view)
  204.         self.load_timer.start(0)
  205.  
  206.     
  207.     def continue_load_icon_view(self):
  208.         if self.item_num == self.num_items:
  209.             self.load_timer.stop()
  210.             self.disconnect(self.load_timer, SIGNAL('timeout()'), self.continue_load_icon_view)
  211.             self.load_timer = None
  212.             del self.load_timer
  213.             self.pb.hide()
  214.             self.statusBar().removeWidget(self.pb)
  215.             self.IconView.adjustItems()
  216.             QApplication.restoreOverrideCursor()
  217.             return None
  218.         
  219.         f = self.unload_list[self.item_num]
  220.         self.item_num += 1
  221.         path = f[0]
  222.         size = f[1]
  223.         self.pb.setProgress(self.item_num)
  224.         (typ, subtyp) = self.pc.classify_file(path).split('/')
  225.         if not (self.first_load) and typ == 'image' and subtyp == 'jpeg':
  226.             exif_info = self.pc.get_exif_path(path)
  227.             if len(exif_info) > 0:
  228.                 if 'JPEGThumbnail' in exif_info:
  229.                     pixmap = QPixmap()
  230.                     pixmap.loadFromData(exif_info['JPEGThumbnail'], 'JPEG')
  231.                     self.resizePixmap(pixmap)
  232.                     del exif_info['JPEGThumbnail']
  233.                     (dname, fname) = os.path.split(path)
  234.                     x = self.item_map[fname]
  235.                     if len(x) == 1:
  236.                         item = self.IconView.findItem(fname, 0)
  237.                     else:
  238.                         i = x.index(path)
  239.                         if i == 0:
  240.                             item = self.IconView.findItem(fname, 0)
  241.                         else:
  242.                             item = self.IconView.findItem(fname + ' (%d)' % (i + 1), 0)
  243.                     if item is not None:
  244.                         item.setPixmap(pixmap)
  245.                         item.thumbnail_set = True
  246.                     
  247.                     return None
  248.                 
  249.             
  250.         elif self.first_load:
  251.             if typ == 'image':
  252.                 f = os.path.join(prop.image_dir, self.image_icon_map.get(subtyp, 'unknown.png'))
  253.             elif typ == 'video':
  254.                 f = os.path.join(prop.image_dir, self.video_icon_map.get(subtyp, 'movie.png'))
  255.             elif typ == 'audio':
  256.                 f = os.path.join(prop.image_dir, 'sound.png')
  257.             else:
  258.                 f = os.path.join(prop.image_dir, 'unknown.png')
  259.             (dirname, fname) = os.path.split(path)
  260.             num = 1
  261.             
  262.             try:
  263.                 self.item_map[fname]
  264.             except:
  265.                 self.item_map[fname] = [
  266.                     path]
  267.  
  268.             self.item_map[fname].append(path)
  269.             num = len(self.item_map[fname])
  270.             if num == 1:
  271.                 IconViewItem(self.IconView, dirname, fname, path, QPixmap(f), typ, subtyp, size)
  272.             else:
  273.                 IconViewItem(self.IconView, dirname, fname + ' (%d)' % num, path, QPixmap(f), typ, subtyp, size)
  274.         
  275.  
  276.     
  277.     def resizePixmap(self, pixmap):
  278.         w = pixmap.width()
  279.         h = pixmap.height()
  280.         if h > 128 or w > 128:
  281.             ww = w - 128
  282.             hh = h - 128
  283.             if ww >= hh:
  284.                 pixmap.resize(128, int((float(w - ww) / w) * h))
  285.             else:
  286.                 pixmap.resize(int((float(h - hh) / h) * w), 128)
  287.         
  288.  
  289.     
  290.     def UpdateStatusBar(self):
  291.         if self.total_number == 0:
  292.             self.statusBar().message(self._UnloadForm__tr('No files selected'))
  293.         elif self.total_number == 1:
  294.             self.statusBar().message(self._UnloadForm__tr('1 file selected, %s' % utils.format_bytes(self.total_size, True)))
  295.         else:
  296.             self.statusBar().message(self._UnloadForm__tr('%d files selected, %s' % (self.total_number, utils.format_bytes(self.total_size, True))))
  297.  
  298.     
  299.     def SelectAllButton_clicked(self):
  300.         self.IconView.selectAll(1)
  301.  
  302.     
  303.     def SelectNoneButton_clicked(self):
  304.         self.IconView.selectAll(0)
  305.  
  306.     
  307.     def IconView_doubleClicked(self, a0):
  308.         pass
  309.  
  310.     
  311.     def UnloadDirectoryBrowseButton_clicked(self):
  312.         old_dir = self.unload_dir
  313.         self.unload_dir = str(QFileDialog.getExistingDirectory(self.unload_dir, self))
  314.         if not len(self.unload_dir):
  315.             return None
  316.         elif not utils.is_path_writable(self.unload_dir):
  317.             self.failure(self._UnloadForm__tr('<p><b>The unload directory path you entered is not valid.</b><p>The directory must exist and you must have write permissions.'))
  318.             self.unload_dir = old_dir
  319.         else:
  320.             self.UnloadDirectoryEdit.setText(self.unload_dir)
  321.             os.chdir(self.unload_dir)
  322.  
  323.     
  324.     def UnloadButton_clicked(self):
  325.         global progress_dlg
  326.         was_cancelled = False
  327.         self.unload_dir = str(self.UnloadDirectoryEdit.text())
  328.         dir_error = False
  329.         
  330.         try:
  331.             os.chdir(self.unload_dir)
  332.         except OSError:
  333.             log.error('Directory not found: %s' % self.unload_dir)
  334.             dir_error = True
  335.  
  336.         if dir_error or not utils.is_path_writable(self.unload_dir):
  337.             self.failure(self._UnloadForm__tr('<p><b>The unload directory path is not valid.</b><p>Please enter a new path and try again.'))
  338.             return None
  339.         
  340.         unload_list = []
  341.         i = self.IconView.firstItem()
  342.         total_size = 0
  343.         while i is not None:
  344.             if i.isSelected():
  345.                 unload_list.append((i.path, i.size, i.mime_type, i.mime_subtype))
  346.                 total_size += i.size
  347.             
  348.             i = i.nextItem()
  349.         if total_size == 0:
  350.             self.failure(self._UnloadForm__tr('<p><b>No files are selected to unload.</b><p>Please select one or more files to unload and try again.'))
  351.             return None
  352.         
  353.         progress_dlg = QProgressDialog(self._UnloadForm__tr('Unloading Files...'), self._UnloadForm__tr('Cancel'), total_size, self, 'progress', True)
  354.         progress_dlg.setMinimumDuration(0)
  355.         progress_dlg.show()
  356.         if self.removal_option == 0:
  357.             (total_size, total_time, was_cancelled) = self.pc.unload(unload_list, self.UpdateUnloadProgressDlg, None, True)
  358.         elif self.removal_option == 1:
  359.             (total_size, total_time, was_cancelled) = self.pc.unload(unload_list, self.UpdateUnloadProgressDlg, None, False)
  360.         else:
  361.             (total_size, total_time, was_cancelled) = self.pc.unload(unload_list, self.UpdateUnloadProgressDlg, None, False)
  362.         progress_dlg.close()
  363.         self.pc.device.sendEvent(EVENT_PCARD_FILES_TRANSFERED)
  364.         if was_cancelled:
  365.             self.failure(self._UnloadForm__tr('<b>Unload cancelled at user request.</b>'))
  366.         else:
  367.             self.success()
  368.  
  369.     
  370.     def UpdateUnloadProgressDlg(self, src, trg, size):
  371.         progress_dlg.setProgress(progress_dlg.progress() + size)
  372.         progress_dlg.setLabelText(src)
  373.         qApp.processEvents()
  374.         return progress_dlg.wasCancelled()
  375.  
  376.     
  377.     def IconView_rightButtonClicked(self, item, pos):
  378.         popup = QPopupMenu(self)
  379.         popup.insertItem('Properties', self.PopupProperties)
  380.         if item is not None and item.mime_type == 'image' and item.mime_subtype == 'jpeg' and not (item.thumbnail_set):
  381.             popup.insertItem('Show Thumbnail', self.showThumbNail)
  382.         
  383.         popup.popup(pos)
  384.  
  385.     
  386.     def PopupDisplay(self):
  387.         self.Display(self.IconView.currentItem())
  388.  
  389.     
  390.     def PopupProperties(self):
  391.         self.Properties(self.IconView.currentItem())
  392.  
  393.     
  394.     def showThumbNail(self):
  395.         item = self.IconView.currentItem()
  396.         exif_info = self.pc.get_exif_path(item.path)
  397.         if len(exif_info) > 0:
  398.             if 'JPEGThumbnail' in exif_info:
  399.                 pixmap = QPixmap()
  400.                 pixmap.loadFromData(exif_info['JPEGThumbnail'], 'JPEG')
  401.                 self.resizePixmap(pixmap)
  402.                 del exif_info['JPEGThumbnail']
  403.                 item.setPixmap(pixmap)
  404.                 self.IconView.adjustItems()
  405.             
  406.         else:
  407.             self.failure(self._UnloadForm__tr('<p><b>No thumbnail found in image.</b>'))
  408.         item.thumbnail_set = True
  409.  
  410.     
  411.     def Display(self, item):
  412.         pass
  413.  
  414.     
  415.     def Properties(self, item):
  416.         if item is not None:
  417.             if not item.exif_info:
  418.                 item.exif_info = self.pc.get_exif_path(item.path)
  419.             
  420.             ImagePropertiesDlg(item.filename, item.dirname, '/'.join([
  421.                 item.mime_type,
  422.                 item.mime_subtype]), utils.format_bytes(item.size, True), item.exif_info, self).exec_loop()
  423.         
  424.  
  425.     
  426.     def IconView_selectionChanged(self):
  427.         self.total_number = 0
  428.         self.total_size = 0
  429.         i = self.IconView.firstItem()
  430.         while i is not None:
  431.             i = i.nextItem()
  432.             continue
  433.             None if i.isSelected() else self
  434.         self.UpdateStatusBar()
  435.  
  436.     
  437.     def IconView_clicked(self, a0, a1):
  438.         pass
  439.  
  440.     
  441.     def IconView_clicked(self, a0):
  442.         pass
  443.  
  444.     
  445.     def IconView_currentChanged(self, a0):
  446.         pass
  447.  
  448.     
  449.     def FileRemovalGroup_clicked(self, a0):
  450.         self.removal_option = a0
  451.  
  452.     
  453.     def ShowThumbnailsButton_clicked(self):
  454.         self.ShowThumbnailsButton.setEnabled(False)
  455.         self.load_icon_view(first_load = False)
  456.  
  457.     
  458.     def __tr(self, s, c = None):
  459.         return qApp.translate('UnloadForm', s, c)
  460.  
  461.  
  462.