%PDF- %PDF-
| Direktori : /usr/share/hplip/ui5/ |
| Current File : //usr/share/hplip/ui5/filetable.py |
# -*- coding: utf-8 -*-
#
# (c) Copyright 2001-2015 HP 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
#
# Authors: Don Welch
#
# Std Lib
import sys
import os.path
import os
import subprocess
# Local
from base.g import *
from base import utils, magic
from prnt import cups
from base.codes import *
from .ui_utils import *
from base.sixext import to_unicode, to_string_utf8, from_unicode_to_str
# Qt
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
# Other UI
from .mimetypesdialog import MimeTypesDialog
FILETABLE_TYPE_PRINT = 0
FILETABLE_TYPE_FAX = 1
class FileTable(QWidget):
fileListChanged = pyqtSignal()
isEmpty = pyqtSignal()
isNotEmpt = pyqtSignal()
def __init__(self, parent):
QWidget.__init__(self, parent)
self.parent = parent
self.initUi()
self.file_list = []
self.typ = FILETABLE_TYPE_PRINT
self.selected_filename = None
self.fax_add_callback = None
self.allowable_mime_types = cups.getAllowableMIMETypes()
self.user_settings = UserSettings()
self.user_settings.load()
self.user_settings.debug()
self.working_dir = self.user_settings.working_dir #user_conf.workingDirectory()
def initUi(self):
self.gridlayout = QGridLayout(self)
self.gridlayout.setObjectName("gridlayout")
self.FileTable = QTableWidget(self)
self.FileTable.setObjectName("FileTable")
self.gridlayout.addWidget(self.FileTable,0,0,1,6)
self.AddFileButton = QPushButton(self)
self.AddFileButton.setObjectName("AddFileButton")
self.gridlayout.addWidget(self.AddFileButton,1,0,1,1)
self.RemoveFileButton = QPushButton(self)
self.RemoveFileButton.setObjectName("RemoveFileButton")
self.gridlayout.addWidget(self.RemoveFileButton,1,1,1,1)
self.MoveFileUpButton = QPushButton(self)
self.MoveFileUpButton.setObjectName("MoveFileUpButton")
self.gridlayout.addWidget(self.MoveFileUpButton,1,2,1,1)
self.MoveFileDownButton = QPushButton(self)
self.MoveFileDownButton.setObjectName("MoveFileDownButton")
self.gridlayout.addWidget(self.MoveFileDownButton,1,3,1,1)
spacerItem = QSpacerItem(91,20,QSizePolicy.Expanding,QSizePolicy.Minimum)
self.gridlayout.addItem(spacerItem,1,4,1,1)
self.ShowTypesButton = QPushButton(self)
self.ShowTypesButton.setObjectName("ShowTypesButton")
self.gridlayout.addWidget(self.ShowTypesButton,1,5,1,1)
self.AddFileButton.setText(self.__tr("Add..."))
self.AddFileButton.setIcon(QIcon(load_pixmap('list_add', '16x16')))
self.AddFileButton.clicked.connect(self.AddFileButton_clicked)
self.RemoveFileButton.setIcon(QIcon(load_pixmap('list_remove', '16x16')))
self.RemoveFileButton.setText(self.__tr("Remove"))
self.RemoveFileButton.clicked.connect(self.RemoveFileButton_clicked)
self.MoveFileUpButton.setText(self.__tr("Move Up"))
self.MoveFileUpButton.setIcon(QIcon(load_pixmap('up', '16x16')))
self.MoveFileUpButton.clicked.connect(self.MoveFileUpButton_clicked)
self.MoveFileDownButton.setText(self.__tr("Move Down"))
self.MoveFileDownButton.setIcon(QIcon(load_pixmap('down', '16x16')))
self.MoveFileDownButton.clicked.connect(self.MoveFileDownButton_clicked)
self.ShowTypesButton.setText(self.__tr("Show Valid Types..."))
self.ShowTypesButton.setIcon(QIcon(load_pixmap('mimetypes', '16x16')))
self.ShowTypesButton.clicked.connect(self.ShowTypesButton_clicked)
self.FileTable.setContextMenuPolicy(Qt.CustomContextMenu)
#self.connect(self.FileTable, SIGNAL("customContextMenuRequested(const QPoint &)"),
# self.FileTable_customContextMenuRequested)
self.FileTable.customContextMenuRequested["const QPoint &"].connect(self.FileTable_customContextMenuRequested)
self.headers = [self.__tr("Name"), self.__tr("Type"), self.__tr("Folder/Path")]
self.FileTable.setSortingEnabled(False)
self.FileTable.itemSelectionChanged.connect(self.FileTable_itemSelectionChanged)
def setWorkingDir(self, d):
if os.path.exists(d):
self.working_dir = d
def getWorkingDir(self):
if self.file_list:
self.working_dir = os.path.pathname(self.file_list[0][0])
#user_conf.setWorkingDirectory(self.working_dir)
self.user_settings.working_dir = self.working_dir
self.user_settings.save()
return self.working_dir
def setType(self, t):
self.typ = t
if self.typ == FILETABLE_TYPE_FAX:
self.headers = [self.__tr("Name"), self.__tr("Type"), self.__tr("Pages")]
if log.is_debug():
self.headers.append(self.__tr("File"))
def setFaxCallback(self, callback):
self.fax_add_callback = callback
def isNotEmpty(self):
return len(self.file_list)
def FileTable_itemSelectionChanged(self):
self.selected_filename = self.currentFilename()
self.setUpDownButtons()
def updateUi(self, show_add_file_if_empty=True):
self.FileTable.clear()
self.FileTable.setRowCount(len(self.file_list))
self.FileTable.setColumnCount(0)
if self.file_list:
# self.emit(SIGNAL("isNotEmpty"))
self.isNotEmpt.emit()
QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
try:
selected = None
self.FileTable.setColumnCount(len(self.headers))
self.FileTable.setHorizontalHeaderLabels(self.headers)
flags = Qt.ItemIsSelectable | Qt.ItemIsEnabled
for row, f in enumerate(self.file_list):
filename, mime_type, mime_type_desc, title, num_pages = f
col = 0
if self.typ == FILETABLE_TYPE_FAX:
if title:
i = QTableWidgetItem(title)
else:
i = QTableWidgetItem(os.path.basename(filename))
else: # FILETABLE_TYPE_PRINT
# Filename (basename)
i = QTableWidgetItem(os.path.basename(filename))
i.setData(Qt.UserRole, to_unicode(filename))
i.setFlags(flags)
if self.selected_filename is not None and \
self.selected_filename == filename:
selected = i
self.FileTable.setItem(row, col, i)
col += 1
# MIME type
i = QTableWidgetItem(mime_type_desc)
i.setFlags(flags)
self.FileTable.setItem(row, col, i)
col += 1
if self.typ == FILETABLE_TYPE_PRINT:
# path/folder
i = QTableWidgetItem(os.path.dirname(filename))
i.setFlags(flags)
self.FileTable.setItem(row, col, i)
col += 1
if self.typ == FILETABLE_TYPE_FAX:
# num pages
if num_pages < 1:
i = QTableWidgetItem(self.__tr("(unknown)"))
else:
i = QTableWidgetItem(to_unicode(num_pages))
i.setFlags(flags)
self.FileTable.setItem(row, col, i)
col += 1
if self.typ == FILETABLE_TYPE_FAX and log.is_debug():
i = QTableWidgetItem(filename)
i.setFlags(flags)
self.FileTable.setItem(row, col, i)
self.FileTable.resizeColumnsToContents()
if selected is None:
selected = self.FileTable.item(0, 0)
selected.setSelected(True)
self.FileTable.setCurrentItem(selected)
finally:
QApplication.restoreOverrideCursor()
self.RemoveFileButton.setEnabled(True)
self.RemoveFileButton.setIcon(QIcon(load_pixmap('list_remove', '16x16')))
self.setUpDownButtons()
else:
# self.emit(SIGNAL("isEmpty"))
self.isEmpty.emit()
self.RemoveFileButton.setEnabled(False)
self.setUpDownButtons()
if show_add_file_if_empty:
# self.AddFileButton.emit(SIGNAL("clicked()"))
self.AddFileButton.clicked.emit()
def setUpDownButtons(self):
if self.file_list:
i = self.FileTable.currentRow()
if len(self.file_list) > 1 and i != len(self.file_list)-1:
self.MoveFileDownButton.setEnabled(True)
else:
self.MoveFileDownButton.setEnabled(False)
if len(self.file_list) > 1 and i != 0:
self.MoveFileUpButton.setEnabled(True)
else:
self.MoveFileUpButton.setEnabled(False)
else:
self.MoveFileDownButton.setEnabled(False)
self.MoveFileUpButton.setEnabled(False)
def AddFileButton_clicked(self):
if self.typ == FILETABLE_TYPE_PRINT:
s = self.__tr("Select File(s) to Print")
else:
stat = ''
try :
p = subprocess.Popen('getenforce', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stat, err = p.communicate()
stat = to_string_utf8(stat)
except OSError :
pass
except :
log.exception()
# if stat.strip('\n') == 'Enforcing' :
# FailureUI(self, self.__tr("<b>Unable to add file. Please disable SeLinux.</b><p>Either disable it manually or run hp-doctor from terminal.</p>"),
# self.__tr("HP Device Manager"))
# return
s = self.__tr("Select File(s) to Send")
files = QFileDialog.getOpenFileNames(self, s, self.working_dir, self.__tr("All files (*)"))
files = [to_unicode(f) for f in files[0]]
# log.error(files)
if files:
self.addFileList(files)
if self.typ == FILETABLE_TYPE_PRINT:
self.updateUi(False)
def addFileList(self, file_list):
for f in file_list:
self.addFileFromUI(f)
def addFileFromUI(self, f, title='', num_pages=0):
f = os.path.abspath(os.path.expanduser(f))
log.debug("Trying to add file: %s" % f)
if os.path.exists(f) and os.access(f, os.R_OK):
mime_type = magic.mime_type(f)
mime_type_desc = mime_type
log.debug("File type of file %s: %s" % (f, mime_type))
try:
mime_type_desc = MIME_TYPES_DESC[mime_type][0]
except KeyError:
if self.typ == FILETABLE_TYPE_PRINT:
FailureUI(self, self.__tr("<b>You are trying to add a file that cannot be directly printed with this utility.</b><p>To print this file, use the print command in the application that created it.<p>Note: Click <i>Show Valid Types...</i> to view a list of compatible file types that can be directly printed from this utility."),
self.__tr("HP Device Manager"))
else:
FailureUI(self, self.__tr("<b>You are trying to add a file that cannot be directly faxed with this utility.</b><p>To fax this file, use the print command in the application that created it (using the appropriate fax print queue).<p>Note: Click <i>Show Valid Types...</i> to view a list of compatible file types that can be directly added to the fax file list in this utility."),
self.__tr("HP Device Manager"))
else:
if self.typ == FILETABLE_TYPE_PRINT:
self.addFile(f, mime_type, mime_type_desc, title, num_pages)
else:
self.fax_add_callback(f)
else:
FailureUI(self, self.__tr("<b>Unable to add file '%s' to file list (file not found or insufficient permissions).</b><p>Check the file name and try again."%f),
self.__tr("HP Device Manager"))
def addFile(self, f, mime_type, mime_type_desc, title, num_pages):
log.debug("Adding file %s (%s,%s,%s,%d)" % (f, mime_type, mime_type_desc, title, num_pages))
self.file_list.append((f, mime_type, mime_type_desc, title, num_pages))
self.updateUi()
# self.emit(SIGNAL("fileListChanged"))
self.fileListChanged.emit()
def currentFilename(self):
i = self.FileTable.item(self.FileTable.currentRow(), 0)
if i is None:
return None
return value_str(i.data(Qt.UserRole))
def RemoveFileButton_clicked(self):
filename = self.currentFilename()
if filename is None:
return
return self.removeFile(filename)
def removeFile(self, filename):
temp = self.file_list[:]
index = 0
for f, mime_type, mime_type_desc, title, num_pages in temp:
if f == to_unicode(filename):
del self.file_list[index]
# self.emit(SIGNAL("fileListChanged"))
self.fileListChanged.emit()
self.updateUi(False)
break
index += 1
def removeFileByMIMEType(self, mime_type):
temp = self.file_list[:]
index = 0
for filename, m, mime_type_desc, title, num_pages in temp:
if m == mime_type:
del self.file_list[index]
# self.emit(SIGNAL("fileListChanged"))
self.fileListChanged.emit()
self.updateUi(False)
break
index += 1
def isMIMETypeInList(self, mime_type):
for filename, m, mime_type_desc, title, num_pages in self.file_list:
if m == mime_type:
return True
return False
def ShowTypesButton_clicked(self):
x = {}
for a in self.allowable_mime_types:
x[a] = MIME_TYPES_DESC.get(a, ('Unknown', 'n/a'))
dlg = MimeTypesDialog(x, self)
dlg.exec_()
def MoveFileUpButton_clicked(self):
filename = self.currentFilename()
if filename is None:
return
utils.list_move_up(self.file_list, filename, self.__compareFilenames)
self.updateUi()
def MoveFileDownButton_clicked(self):
filename = self.currentFilename()
if filename is None:
return
utils.list_move_down(self.file_list, filename, self.__compareFilenames)
self.updateUi()
def __compareFilenames(self, a, b):
return a[0] == b
def FileTable_customContextMenuRequested(self, p):
print(p)
def __tr(self,s,c = None):
return qApp.translate("FileTable",s,c)