# -*- coding: utf-8 -*- # # (c) Copyright 2001-2007 Hewlett-Packard Development Company, L.P. # # 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 2 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, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Author: Don Welch # # Std Lib # Local from base.g import * from prnt import cups from base import device from ui_utils import load_pixmap # Qt from qt import * class Widget(QWidget): def __init__(self, parent=None, name=None, fl=0): QWidget.__init__(self, parent, name, fl) self.control = None def setControl(self, control): self.control = control class ScrollView(QScrollView): def __init__(self, service=None, parent=None, name=None, fl=0): QScrollView.__init__(self, parent, name, fl) self.service = service self.items = {} self.enableClipper(True) self.viewport().setPaletteBackgroundColor(qApp.palette().color(QPalette.Active, QColorGroup.Background)) self.cur_device = None self.cur_printer = None self.item_margin = 2 self.y = 0 self.printers = [] self.maximize = None self.orig_height = 0 self.content_padding = 20 if log.is_debug(): self.heading_color = qApp.palette().color(QPalette.Active, QColorGroup.Base) self.frame_shape = QFrame.Box else: self.heading_color = qApp.palette().color(QPalette.Active, QColorGroup.Background) self.frame_shape = QFrame.NoFrame def getWidget(self): widget = Widget(self.viewport(),"widget") widget.setPaletteBackgroundColor(qApp.palette().color(QPalette.Active, QColorGroup.Background)) return widget def viewportResizeEvent(self, e): QScrollView.viewportResizeEvent(self, e) total_height = 0 item_margin = self.item_margin width = e.size().width() for w in self.items: height = self.items[w].size().height() self.items[w].resize(width, height) self.items[w].setMinimumWidth(width) total_height += (height + item_margin) if self.maximize is not None: self.maximizeControl(total_height) self.resizeContents(e.size().width(), total_height + self.content_padding) def maximizeControl(self, total_height=0): if self.maximize is not None: try: self.items[self.maximize] except KeyError: return if total_height == 0: item_margin = self.item_margin for w in self.items: total_height += (self.items[w].size().height() + item_margin) if len(self.items) == 1: #total_height += item_margin self.content_padding = 0 width = self.items[self.maximize].size().width() old_height = self.items[self.maximize].size().height() new_height = max((self.visibleHeight()-(total_height-old_height)), self.orig_height) delta = new_height - old_height if delta: self.items[self.maximize].resize(width, new_height) self.resizeContents(width, self.contentsHeight()+delta+self.content_padding) m_y = self.childY(self.items[self.maximize]) for w in self.items: w_y = self.childY(self.items[w]) if w_y > m_y: self.moveChild(self.items[w], 0, w_y+delta) def onDeviceChange(self, cur_device=None, updating=False): if cur_device is not None: log.debug("ScrollView.onDeviceChange(%s)" % cur_device.device_uri) else: log.debug("ScrollView.onDeviceChange(None)") self.cur_device = cur_device if self.cur_device is not None and self.cur_device.supported: #if not updating or not self.cur_printer: if not self.cur_printer: try: cur_printer = self.cur_device.cups_printers[0] except IndexError: log.error("Printer list empty") # Shouldn't happen! self.cur_printer = None return #self.isFax() self.printers = cups.getPrinters() self.onPrinterChange(cur_printer) self.cur_printer = cur_printer #else: if 1: QApplication.setOverrideCursor(QApplication.waitCursor) try: if 1: #try: self.fillControls() #except Exception, e: # log.exception() finally: QApplication.restoreOverrideCursor() else: log.debug("Unsupported device") self.y = 0 self.clear() self.addGroupHeading("error", self.__tr("ERROR: No device found or unsupported device.")) def onUpdate(self, cur_device=None): log.debug("ScrollView.onUpdate()") return self.onDeviceChange(cur_device, True) def fillControls(self): log.debug("fillControls(%s)" % str(self.name())) self.y = 0 self.clear() def onPrinterChange(self, printer_name): if printer_name == self.cur_printer or printer_name is None: return self.cur_printer = unicode(printer_name) if self.cur_device is not None and self.cur_device.supported: #self.isFax() QApplication.setOverrideCursor(QApplication.waitCursor) try: if 1: #try: self.fillControls() #except Exception, e: # log.exception() finally: QApplication.restoreOverrideCursor() if self.cur_printer is not None: try: self.printerComboBox.setCurrentText(self.cur_printer) except AttributeError: pass else: self.y = 0 self.clear() def addWidget(self, widget, key, control=None, maximize=False): try: self.items[key] except KeyError: if maximize: self.maximize = key widget.resize(widget.size().width(), 150) self.orig_height = widget.size().height() try: widget.setControl(control) except AttributeError: pass self.items[key] = widget widget.setMinimumWidth(self.visibleWidth()) widget.adjustSize() self.addChild(widget, 0, self.y) self.y += (widget.size().height() + self.item_margin) self.resizeContents(self.visibleWidth(), self.y + self.content_padding) widget.show() #else: # log.debug("ERROR: Duplicate control name: %s" % key) def clear(self): if len(self.items): for x in self.items: self.removeChild(self.items[x]) self.items[x].hide() self.items.clear() def addGroupHeading(self, group, heading, read_only=False): widget = self.getWidget() widget.setMinimumHeight(30) layout = QGridLayout(widget, 0, 0, 5, 0, "layout") textLabel2 = QLabel(widget, "textLabel2") textLabel2.setSizePolicy(QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum, 0, 0, textLabel2.sizePolicy().hasHeightForWidth())) if log.is_debug(): textLabel2.setFrameShape(self.frame_shape) elif heading: textLabel2.setFrameShape(QFrame.TabWidgetPanel) textLabel2.setPaletteBackgroundColor(self.heading_color) if read_only: s = self.__tr("%1 (read only)").arg(heading) # else: s = QString("%1").arg(heading) # If label is kinda long, provide a tooltip to allow reading the whole thing if s.length() > 32: QToolTip.add(textLabel2, s) textLabel2.setText(s) textLabel2.setAlignment(QLabel.AlignLeft | QLabel.AlignVCenter | Qt.SingleLine) layout.addWidget(textLabel2, 0, 0) self.addWidget(widget, "g:"+unicode(group)) def addActionButton(self, name, action_text, action_func, action_pixmap=None, disabled_action_pixmap=None, nav_text ='', nav_func=None): widget = self.getWidget() self.actionPushButton = None self.navPushButton = None layout36 = QHBoxLayout(widget,5,10,"layout36") if nav_func is not None: self.navPushButton = QPushButton(widget,"navPushButton") navPushButton_font = QFont(self.navPushButton.font()) navPushButton_font.setBold(1) self.navPushButton.setFont(navPushButton_font) self.navPushButton.setText(nav_text) layout36.addWidget(self.navPushButton) self.connect(self.navPushButton, SIGNAL("clicked()"), nav_func) spacer35 = QSpacerItem(20,20,QSizePolicy.Expanding,QSizePolicy.Minimum) layout36.addItem(spacer35) if action_func is not None: if action_pixmap is None: self.actionPushButton = QPushButton(widget, "actionPushButton") else: self.actionPushButton = PixmapLabelButton(widget, action_pixmap, disabled_action_pixmap, 'actionPushButton') actionPushButton_font = QFont(self.actionPushButton.font()) actionPushButton_font.setBold(1) self.actionPushButton.setFont(actionPushButton_font) layout36.addWidget(self.actionPushButton) self.actionPushButton.setText(action_text) self.connect(self.actionPushButton, SIGNAL("clicked()"), action_func) self.addWidget(widget, name) if self.actionPushButton is not None: return self.actionPushButton elif self.navPushButton is not None: return self.navPushButton else: return None def printerComboBox_activated(self, p): self.cur_printer = str(p) def addPrinterFaxList(self): # printers=True, faxes=False): widget = self.getWidget() layout = QGridLayout(widget,1,1,5,10,"layout") self.printernameTextLabel = QLabel(widget,"printernameTextLabel") layout.addWidget(self.printernameTextLabel,0,0) self.printerComboBox = QComboBox(0,widget,"printerComboBox") layout.addWidget(self.printerComboBox,0,1) #print self.cur_device.device_type if self.cur_device.device_type == DEVICE_TYPE_PRINTER: self.addGroupHeading("printer_list_heading", self.__tr("Printer")) self.printernameTextLabel.setText(self.__tr("Printer Name:")) else: self.addGroupHeading("fax_list_heading", self.__tr("Fax")) self.printernameTextLabel.setText(self.__tr("Fax Name:")) self.printers = cups.getPrinters() self.cur_printer = None for p in self.printers: if p.device_uri == self.cur_device.device_uri: self.printerComboBox.insertItem(p.name) if self.cur_printer is None: self.cur_printer = p.name if self.cur_printer is None: #log.error("No fax queue found") self.y = 0 self.clear() #if printers and faxes: if self.cur_device.device_type == DEVICE_TYPE_PRINTER: self.addGroupHeading("error", self.__tr("ERROR: No CUPS queue found for device.")) else: self.addGroupHeading("error", self.__tr("ERROR: No CUPS fax queue found for device.")) return False else: self.connect(self.printerComboBox, SIGNAL("activated(const QString&)"), self.printerComboBox_activated) self.addWidget(widget, "printer_list") return True def addLoadPaper(self, paper_type=PAPER_TYPE_PLAIN): self.addGroupHeading("load_paper", self.__tr("Load Paper")) widget = self.getWidget() layout1 = QGridLayout(widget, 1, 2, 5, 10,"layout1") layout1.setColStretch(0, 1) layout1.setColStretch(1, 10) icon = QLabel(widget, "icon") icon.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed, 0, 0, icon.sizePolicy().hasHeightForWidth())) icon.setScaledContents(1) layout1.addWidget(icon, 0, 0) textLabel = QLabel(widget, "textLabel") textLabel.setAlignment(QLabel.WordBreak) textLabel.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred, 0, 0, textLabel.sizePolicy().hasHeightForWidth())) textLabel.setFrameShape(self.frame_shape) layout1.addWidget(textLabel, 0, 1) spacer1 = QSpacerItem(20, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) layout1.addItem(spacer1, 0, 2) if paper_type == PAPER_TYPE_PLAIN: textLabel.setText(self.__tr("A page will be printed. Please load Letter/A4 Plain Paper into the printer.")) elif paper_type == PAPER_TYPE_HP_ADV_PHOTO: textLabel.setText(self.__tr("A page will be printed. Please load Letter/A4 HP Advanced Photo Paper - Glossy into the printer.")) icon.setPixmap(load_pixmap("load_paper", 'other')) self.addWidget(widget, "load_paper") def cleanup(self): pass def __tr(self,s,c = None): return qApp.translate("ScrollView",s,c) class PixmapLabelButton(QPushButton): def __init__(self, parent=None, pixmap=None, disabled_pixmap=None, name='', subdir=None): QPushButton.__init__(self, parent, name) if subdir is None: subdir = '16x16' if type(pixmap) == type(''): self.pixmap = load_pixmap(pixmap, subdir) else: self.pixmap = pixmap if type(disabled_pixmap) == type(''): self.disabled_pixmap = load_pixmap(disabled_pixmap, subdir) else: self.disabled_pixmap = disabled_pixmap self.pixmap_width, self.pixmap_height = self.pixmap.width(), self.pixmap.height() self.width_set = None def drawButtonLabel(self, painter): button_width, button_height = self.width(), self.height() adj = 0 if self.isDown(): adj = 1 if self.isEnabled(): painter.setPen(Qt.black) else: painter.setPen(Qt.gray) text_rect = painter.boundingRect(0, 0, 1000, 1000, Qt.AlignLeft, self.text()) text_width, text_height = text_rect.right() - text_rect.left(), text_rect.bottom() - text_rect.top() button_width_center = button_width/2 button_height_center = button_height/2 combined_width_center = (self.pixmap_width + text_width + 10)/2 if self.isEnabled() or self.disabled_pixmap is None: painter.drawPixmap(button_width_center - combined_width_center + adj, button_height_center - self.pixmap_height/2 + adj, self.pixmap) else: painter.drawPixmap(button_width_center - combined_width_center + adj, button_height_center - self.pixmap_height/2 + adj, self.disabled_pixmap) if self.width_set is None: self.setMinimumWidth(self.pixmap_width + text_width + 20) self.width_set = 0 painter.drawText(button_width_center - combined_width_center + self.pixmap_width + 5 + adj, button_height_center - text_height/2 + adj, 1000, 1000, Qt.AlignLeft, self.text())