1 # -*- coding: utf-8 -*-
3 # (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P.
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation; either version 2 of the License, or
8 # (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 from base import utils, pml
25 from copier import copier
29 from scrollview import ScrollView, PixmapLabelButton
30 from waitform import WaitForm
37 class ScrollCopyView(ScrollView):
38 def __init__(self, service, num_copies=None, contrast=None, quality=None,
39 reduction=None, fit_to_page=None, parent=None, form=None, name=None, fl=0):
40 ScrollView.__init__(self, service, parent, name, fl)
44 self.num_copies = num_copies
45 self.contrast = contrast
46 self.quality = quality
47 self.reduction = reduction
48 self.fit_to_page = fit_to_page
50 self.update_queue = Queue.Queue() # UI updates from copy thread
51 self.event_queue = Queue.Queue() # UI events to copy thread
53 def getDeviceSettings(self):
54 QApplication.setOverrideCursor(QApplication.waitCursor)
56 # get sticky settings as defaults (if not spec'd on command line)
57 if self.num_copies is None:
58 result_code, self.num_copies = self.dev.getPML(pml.OID_COPIER_NUM_COPIES)
60 if self.contrast is None:
61 result_code, self.contrast = self.dev.getPML(pml.OID_COPIER_CONTRAST)
63 if self.reduction is None:
64 result_code, self.reduction = self.dev.getPML(pml.OID_COPIER_REDUCTION)
66 if self.quality is None:
67 result_code, self.quality = self.dev.getPML(pml.OID_COPIER_QUALITY)
69 if self.scan_src == SCAN_SRC_FLATBED and self.fit_to_page is None:
70 result_code, self.fit_to_page = self.dev.getPML(pml.OID_COPIER_FIT_TO_PAGE)
72 if result_code != pml.ERROR_OK:
73 self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
74 self.fitToPageCheckBox.setEnabled(False)
77 self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
79 if self.scan_src != SCAN_SRC_FLATBED:
80 self.fitToPageCheckBox.setEnabled(False)
82 result_code, self.max_reduction = self.dev.getPML(pml.OID_COPIER_REDUCTION_MAXIMUM)
83 result_code, self.max_enlargement = self.dev.getPML(pml.OID_COPIER_ENLARGEMENT_MAXIMUM)
87 self.contrastSpinBox.setValue(a)
90 self.contrastSpinBox.setPrefix("+")
92 self.contrastSpinBox.setPrefix("")
94 self.contrastSlider.setValue(a)
95 self.contrastSlider.setTickmarks(QSlider.Below)
96 self.contrastSlider.setTickInterval(1)
98 self.contrastDefaultPushButton.setEnabled(a != 0)
100 # reduction/enlargement/fittopage
102 self.reductionSlider.setRange(self.max_reduction, self.max_enlargement)
103 self.reductionSlider.setTickmarks(QSlider.Below)
104 self.reductionSlider.setTickInterval(10)
105 self.reductionSlider.setValue(self.reduction)
107 self.reductionSpinBox.setMaxValue(self.max_enlargement)
108 self.reductionSpinBox.setMinValue(self.max_reduction)
109 self.reductionSpinBox.setValue(self.reduction)
110 self.reductionSpinBox.setSuffix("%")
112 if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
113 self.fitToPageCheckBox.setChecked(True)
114 self.reductionSpinBox.setEnabled(False)
115 self.reductionSlider.setEnabled(False)
116 self.reductionDefaultPushButton.setEnabled(True)
118 self.fitToPageCheckBox.setChecked(False)
119 self.reductionSlider.setEnabled(True)
120 self.reductionSpinBox.setEnabled(True)
121 self.reductionDefaultPushButton.setEnabled(self.reduction != 100)
124 self.copiesSpinBox.setValue(self.num_copies)
125 self.copiesDefaultPushButton.setEnabled(self.num_copies != 1)
128 if self.quality == pml.COPIER_QUALITY_FAST:
129 self.qualityComboBox.setCurrentItem(0)
132 elif self.quality == pml.COPIER_QUALITY_DRAFT:
133 self.qualityComboBox.setCurrentItem(1)
136 elif self.quality == pml.COPIER_QUALITY_NORMAL:
137 self.qualityComboBox.setCurrentItem(2)
140 elif self.quality == pml.COPIER_QUALITY_PRESENTATION:
141 self.qualityComboBox.setCurrentItem(3)
144 elif self.quality == pml.COPIER_QUALITY_BEST:
145 self.qualityComboBox.setCurrentItem(4)
148 log.debug("Default Quality: %d (%s)" % (self.quality, s))
150 self.qualityDefaultPushButton.setEnabled(self.quality != pml.COPIER_QUALITY_NORMAL)
152 log.debug("Default Num copies: %d" % self.num_copies)
153 log.debug("Default Contrast: %d" % self.contrast)
154 log.debug("Default Reduction: %d" % self.reduction)
155 log.debug("Maximum Reduction: %d" % self.max_reduction)
156 log.debug("Maximum Enlargement: %d" % self.max_enlargement)
158 if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
163 log.debug("Default Fit to page: %s (%s)" % (self.fit_to_page, s))
164 log.debug("Scan src (models.dat: scan-src): %d" % self.scan_src)
168 QApplication.restoreOverrideCursor()
171 def fillControls(self):
172 ScrollView.fillControls(self)
174 self.addGroupHeading("copies", self.__tr("Number of Copies"))
177 self.addGroupHeading("reduction", self.__tr("Enlargement, Reduction and Fit to Page"))
178 self.addEnlargementReduction()
180 self.addGroupHeading("contrast", self.__tr("Copy Contrast"))
183 self.addGroupHeading("quality", self.__tr("Copy Quality"))
186 self.addGroupHeading("space1", "")
188 self.copyButton = self.addActionButton("bottom_nav", self.__tr("Make Copies(s)"),
189 self.copyButton_clicked, 'print.png', 'print.png',
190 self.__tr("Close"), self.funcButton_clicked)
194 def onUpdate(self, cur_device=None):
195 log.debug("ScrollPrintView.onUpdate()")
197 def onDeviceChange(self, cur_device=None):
198 ScrollView.onDeviceChange(self, cur_device)
200 self.dev = copier.PMLCopyDevice(device_uri=self.cur_device.device_uri,
201 printer_name=self.cur_printer)
203 self.scan_src = self.dev.mq.get('scan-src', SCAN_SRC_FLATBED)
204 self.copy_type = self.dev.mq.get('copy-type', COPY_TYPE_DEVICE)
206 if self.scan_src == SCAN_SRC_SCROLLFED:
207 self.fitToPageCheckBox.setEnabled(False)
208 self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
210 self.getDeviceSettings()
214 widget = self.getWidget()
216 layout12 = QHBoxLayout(widget,5,10,"layout12")
218 self.textLabel5 = QLabel(widget,"textLabel5")
219 layout12.addWidget(self.textLabel5)
220 spacer20 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
221 layout12.addItem(spacer20)
223 self.copiesSpinBox = QSpinBox(widget,"copiesSpinBox")
224 layout12.addWidget(self.copiesSpinBox)
226 self.copiesDefaultPushButton = QPushButton(widget,"copiesDefaultPushButton")
227 layout12.addWidget(self.copiesDefaultPushButton)
229 self.textLabel5.setText(self.__tr("Number of copies:"))
230 self.copiesDefaultPushButton.setText(self.__tr("Default"))
232 self.copiesSpinBox.setMaxValue(99)
233 self.copiesSpinBox.setMinValue(1)
234 self.copiesSpinBox.setValue(1)
236 self.copiesDefaultPushButton.setEnabled(False)
238 self.connect(self.copiesDefaultPushButton, SIGNAL("clicked()"), self.copiesDefaultPushButton_clicked)
239 self.connect(self.copiesSpinBox, SIGNAL("valueChanged(int)"), self.copiesSpinBox_valueChanged)
241 self.addWidget(widget, "copies")
243 def copiesDefaultPushButton_clicked(self):
244 self.copiesSpinBox.setValue(1)
245 self.copiesDefaultPushButton.setEnabled(False)
247 def copiesSpinBox_valueChanged(self, i):
248 self.copiesDefaultPushButton.setEnabled(i != 1)
251 def addQuality(self):
252 widget = self.getWidget()
253 layout34 = QHBoxLayout(widget,5,10,"layout34")
255 self.textLabel5_4 = QLabel(widget,"textLabel5_4")
256 self.textLabel5_4.setText(self.__tr("Quality:"))
257 layout34.addWidget(self.textLabel5_4)
259 spacer20_4 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
260 layout34.addItem(spacer20_4)
262 self.qualityComboBox = QComboBox(0,widget,"qualityComboBox")
263 layout34.addWidget(self.qualityComboBox)
265 self.qualityDefaultPushButton = QPushButton(widget,"qualityDefaultPushButton")
266 layout34.addWidget(self.qualityDefaultPushButton)
268 self.qualityComboBox.clear()
269 self.qualityComboBox.insertItem(self.__tr("Fast")) # 0
270 self.qualityComboBox.insertItem(self.__tr("Draft")) # 1
271 self.qualityComboBox.insertItem(self.__tr("Normal")) # 2
272 self.qualityComboBox.insertItem(self.__tr("Presentation")) # 3
273 self.qualityComboBox.insertItem(self.__tr("Best")) # 4
274 self.qualityComboBox.setCurrentItem(2) # Normal
276 self.qualityDefaultPushButton.setText(self.__tr("Default"))
277 self.qualityDefaultPushButton.setEnabled(False)
279 self.connect(self.qualityComboBox, SIGNAL("activated(int)"), self.qualityComboBox_activated)
280 self.connect(self.qualityDefaultPushButton, SIGNAL("clicked()"), self.qualityDefaultPushButton_clicked)
282 self.addWidget(widget, "quality")
284 def qualityDefaultPushButton_clicked(self):
285 self.qualityDefaultPushButton.setEnabled(False)
286 self.qualityComboBox.setCurrentItem(2) # Normal
287 self.quality = pml.COPIER_QUALITY_NORMAL
289 def qualityComboBox_activated(self, i):
290 self.qualityDefaultPushButton.setEnabled(i != 2) # Normal
293 self.quality = pml.COPIER_QUALITY_FAST
295 self.quality = pml.COPIER_QUALITY_DRAFT
297 self.quality = pml.COPIER_QUALITY_NORMAL
299 self.quality = pml.COPIER_QUALITY_PRESENTATION
301 self.quality = pml.COPIER_QUALITY_BEST
304 def addEnlargementReduction(self):
305 widget = self.getWidget()
306 layout43 = QGridLayout(widget,1,1,5,10,"layout43")
308 self.reductionSlider = QSlider(widget,"reductionSlider")
309 self.reductionSlider.setOrientation(QSlider.Horizontal)
311 layout43.addWidget(self.reductionSlider,0,2)
313 self.reductionSpinBox = QSpinBox(widget, "reductionSpinBox")
314 self.reductionSpinBox.setMaxValue(100)
315 self.reductionSpinBox.setMinValue(0)
316 self.reductionSpinBox.setValue(100)
317 self.reductionSpinBox.setSuffix("%")
318 layout43.addWidget(self.reductionSpinBox,0,3)
320 spacer42 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
321 layout43.addItem(spacer42,0,1)
323 self.fitToPageCheckBox = QCheckBox(widget,"fitToPageCheckBox")
324 layout43.addWidget(self.fitToPageCheckBox,1,2)
326 self.reductionDefaultPushButton = QPushButton(widget,"reductionDefaultPushButton")
327 layout43.addWidget(self.reductionDefaultPushButton,0,4)
329 self.textLabel1 = QLabel(widget,"textLabel1")
330 layout43.addWidget(self.textLabel1,0,0)
332 self.textLabel1.setText(self.__tr("Enlargement or reduction (percent):"))
333 self.fitToPageCheckBox.setText(self.__tr("Fit to Page"))
334 self.reductionDefaultPushButton.setText(self.__tr("Default"))
336 self.reductionSlider.setRange(25, 400)
338 self.connect(self.reductionSlider,SIGNAL("valueChanged(int)"),self.reductionSlider_valueChanged)
339 self.connect(self.fitToPageCheckBox,SIGNAL("clicked()"),self.fitToPageCheckBox_clicked)
340 self.connect(self.reductionDefaultPushButton, SIGNAL("clicked()"), self.reductionDefaultPushButton_clicked)
341 self.connect(self.reductionSpinBox, SIGNAL("valueChanged(int)"), self.reductionSpinBox_valueChanged)
343 self.addWidget(widget, "reduction")
345 def reductionSlider_valueChanged(self,a0):
347 self.reductionSpinBox.setValue(a0)
348 self.reductionDefaultPushButton.setEnabled(a0 != 100)
350 def reductionSpinBox_valueChanged(self, a0):
352 self.reductionSlider.setValue(a0)
353 self.reductionDefaultPushButton.setEnabled(a0 != 100)
355 def fitToPageCheckBox_clicked(self):
356 if self.fitToPageCheckBox.isChecked():
357 self.fit_to_page = pml.COPIER_FIT_TO_PAGE_ENABLED
358 self.reductionSpinBox.setEnabled(False)
359 self.reductionSlider.setEnabled(False)
360 self.reductionDefaultPushButton.setEnabled(True)
362 self.fit_to_page = pml.COPIER_FIT_TO_PAGE_DISABLED
363 self.reductionSlider.setEnabled(True)
364 self.reductionSpinBox.setEnabled(True)
365 self.reductionDefaultPushButton.setEnabled(self.reductionSlider.value() != 100)
367 def reductionDefaultPushButton_clicked(self):
369 self.reductionSlider.setValue(100)
370 self.reductionSlider.setEnabled(True)
371 self.reductionSpinBox.setValue(100)
372 self.reductionSpinBox.setEnabled(True)
373 self.fitToPageCheckBox.setChecked(False)
374 self.fit_to_page = False
376 def addContrast(self):
377 widget = self.getWidget()
379 layout41 = QGridLayout(widget,1,1,5,10,"layout41")
381 self.textLabel1_2 = QLabel(widget,"textLabel1_2")
383 layout41.addWidget(self.textLabel1_2,0,0)
385 self.contrastDefaultPushButton = QPushButton(widget,"contrastDefaultPushButton")
387 layout41.addWidget(self.contrastDefaultPushButton,0,4)
388 spacer41 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
389 layout41.addItem(spacer41,0,1)
391 self.contrastSlider = QSlider(widget,"contrastSlider")
392 self.contrastSlider.setMinValue(-5)
393 self.contrastSlider.setMaxValue(5)
394 self.contrastSlider.setPageStep(1)
395 self.contrastSlider.setOrientation(QSlider.Horizontal)
397 layout41.addWidget(self.contrastSlider,0,2)
399 self.contrastSpinBox = QSpinBox(widget, "contrastSpinBox")
400 self.contrastSpinBox.setMinValue(-5)
401 self.contrastSpinBox.setMaxValue(5)
403 layout41.addWidget(self.contrastSpinBox,0,3)
405 self.textLabel1_2.setText(self.__tr("Contrast (-5 lighter to +5 darker):"))
406 self.contrastDefaultPushButton.setText(self.__tr("Default"))
408 self.connect(self.contrastSlider,SIGNAL("valueChanged(int)"),self.contrastSlider_valueChanged)
409 self.connect(self.contrastSpinBox, SIGNAL("valueChanged(int)"), self.contrastSpinBox_valueChanged)
410 self.connect(self.contrastDefaultPushButton, SIGNAL("clicked()"), self.contrastDefaultPushButton_clicked)
412 self.addWidget(widget, "contrast")
415 def contrastSlider_valueChanged(self, a0):
416 self.contrastSpinBox.setValue(a0)
417 self.contrast = a0 * 25
418 self.contrastDefaultPushButton.setEnabled(a0 != 0)
420 def contrastSpinBox_valueChanged(self, a0):
422 self.contrastSpinBox.setPrefix("+")
424 self.contrastSpinBox.setPrefix("")
426 self.contrastSlider.setValue(a0)
427 self.contrast = a0 * 25
428 self.contrastDefaultPushButton.setEnabled(a0 != 0)
430 def contrastDefaultPushButton_clicked(self):
431 self.contrastSpinBox.setValue(0)
432 self.contrastSpinBox.setPrefix("+")
433 self.contrastSlider.setValue(0)
437 def copy_canceled(self):
438 self.event_queue.put(copier.COPY_CANCELED)
439 self.dev.sendEvent(EVENT_COPY_JOB_CANCELED)
441 def copy_timer_timeout(self):
442 while self.update_queue.qsize():
444 status = self.update_queue.get(0)
448 if status == copier.STATUS_IDLE:
449 self.copy_timer.stop()
452 #self.form.statusBar().removeWidget(self.pb)
454 elif status in (copier.STATUS_SETTING_UP, copier.STATUS_WARMING_UP):
455 #self.pb.setProgress(self.pb.progress()+1)
458 elif status == copier.STATUS_ACTIVE:
459 #self.pb.setProgress(self.pb.progress()+1)
462 elif status in (copier.STATUS_ERROR, copier.STATUS_DONE):
463 self.copy_timer.stop()
465 #self.form.statusBar().removeWidget(self.pb)
467 # Close the dialog box.
469 if self.waitdlg is not None:
474 if status == copier.STATUS_ERROR:
475 self.form.FailureUI(self.__tr("<b>Copier error.</b><p>"))
476 self.dev.sendEvent(EVENT_COPY_JOB_FAIL)
478 elif status == copier.STATUS_DONE:
480 self.dev.sendEvent(EVENT_END_COPY_JOB)
482 self.cur_device.close()
483 self.copyButton.setEnabled(True)
488 def copyButton_clicked(self):
489 self.copyButton.setEnabled(False)
494 self.form.FailureUI(self.__tr("<b>Cannot copy: Device is busy or not available.</b><p>Please check device and try again. [1]"))
497 self.dev.sendEvent(EVENT_START_COPY_JOB, self.cur_printer, 0, '')
498 #self.pb = QProgressBar()
499 #self.pb.setTotalSteps(2)
500 #self.form.statusBar().addWidget(self.pb)
503 log.debug("Num copies: %d" % self.num_copies)
504 log.debug("Contrast: %d" % self.contrast)
505 log.debug("Reduction: %d" % self.reduction)
508 if self.quality == pml.COPIER_QUALITY_FAST:
510 elif self.quality == pml.COPIER_QUALITY_DRAFT:
512 elif self.quality == pml.COPIER_QUALITY_NORMAL:
514 elif self.quality == pml.COPIER_QUALITY_PRESENTATION:
516 elif self.quality == pml.COPIER_QUALITY_BEST:
519 log.debug("Quality: %d (%s)" % (self.quality, s))
521 if self.fit_to_page == pml.COPIER_FIT_TO_PAGE_ENABLED:
526 log.debug("Fit to page: %s (%s)" % (self.fit_to_page, s))
527 log.debug("Scan src: %d" % self.scan_src)
529 # Open the dialog box.
531 self.waitdlg = WaitForm(0, self.__tr("Copying..."), self.copy_canceled, self, modal=1)
534 self.copy_timer = QTimer(self, "CopyTimer")
535 self.connect(self.copy_timer, SIGNAL('timeout()'), self.copy_timer_timeout)
536 self.copy_timer.start(1000) # 1 sec UI updates
538 self.dev.copy(self.num_copies, self.contrast, self.reduction,
539 self.quality, self.fit_to_page, self.scan_src,
540 self.update_queue, self.event_queue)
543 #self.cur_device.close()
544 #self.copyButton.setEnabled(True)
547 def funcButton_clicked(self):
551 def __tr(self,s,c = None):
552 return qApp.translate("ScrollCopy",s,c)