def getLabel(self, font): """ Get a Level Label witht he apropriate Font """ label = QLabel(self.level.name, self) label.setFont(self.smallFont) label.setAlignment(Qt.AlignCenter) label.resize(self.WIDTH, self.HEIGHT) return label
class qLabeledCheck(QWidget): def __init__(self, name, arg_dict, pos = "side", max_size = 200): QWidget.__init__(self) self.setContentsMargins(1, 1, 1, 1) if pos == "side": self.layout1=QHBoxLayout() else: self.layout1 = QVBoxLayout() self.layout1.setContentsMargins(1, 1, 1, 1) self.layout1.setSpacing(1) self.setLayout(self.layout1) self.cbox = QCheckBox() # self.efield.setMaximumWidth(max_size) self.cbox.setFont(QFont('SansSerif', 12)) self.label = QLabel(name) # self.label.setAlignment(Qt.AlignLeft) self.label.setFont(QFont('SansSerif', 12)) self.layout1.addWidget(self.label) self.layout1.addWidget(self.cbox) self.arg_dict = arg_dict self.name = name self.mytype = type(self.arg_dict[name]) if self.mytype != bool: self.cbox.setChecked(bool(self.arg_dict[name])) else: self.cbox.setChecked(self.arg_dict[name]) self.cbox.toggled.connect(self.when_modified) self.when_modified() def when_modified(self): self.arg_dict[self.name] = self.cbox.isChecked() def hide(self): QWidget.hide(self)
def getLabel(self, text, font, alignment=None): """ Get a Level Label with the text """ label = QLabel(text, self) label.setFont(font) if alignment: label.setAlignment(alignment) return label
class aLabeledPopup(QWidget): def __init__(self, var, text, item_list, pos = "side", max_size = 200): QWidget.__init__(self) self.setContentsMargins(1, 1, 1, 1) if pos == "side": self.layout1=QHBoxLayout() else: self.layout1 = QVBoxLayout() self.layout1.setContentsMargins(1, 1, 1, 1) self.layout1.setSpacing(1) self.setLayout(self.layout1) self.item_combo = QComboBox() self.item_combo.addItems(item_list) self.item_combo.setFont(QFont('SansSerif', 12)) self.label = QLabel(text) # self.label.setAlignment(Qt.AlignLeft) self.label.setFont(QFont('SansSerif', 12)) self.layout1.addWidget(self.label) self.layout1.addWidget(self.item_combo) self.var = var self.item_combo.textChanged.connect(self.when_modified) self.item_combo.currentIndexChanged.connect(self.when_modified) self.when_modified() def when_modified(self): self.var.set(self.item_combo.currentText()) def hide(self): QWidget.hide(self)
class qlabeled_entry(QWidget): def __init__(self, var, text, pos = "side", max_size = 200): QWidget.__init__(self) self.setContentsMargins(1, 1, 1, 1) if pos == "side": self.layout1=QHBoxLayout() else: self.layout1 = QVBoxLayout() self.layout1.setContentsMargins(1, 1, 1, 1) self.layout1.setSpacing(1) self.setLayout(self.layout1) self.efield = QLineEdit("Default Text") # self.efield.setMaximumWidth(max_size) self.efield.setFont(QFont('SansSerif', 12)) self.label = QLabel(text) # self.label.setAlignment(Qt.AlignLeft) self.label.setFont(QFont('SansSerif', 12)) self.layout1.addWidget(self.label) self.layout1.addWidget(self.efield) self.var = var self.efield.textChanged.connect(self.when_modified) def when_modified(self): self.var.set(self.efield.text()) def hide(self): QWidget.hide(self)
def createLabel(self, text, color): label = QLabel(text) font = label.font() font.setPixelSize(12) label.setFont(font) label.setAlignment(Qt.AlignCenter) label.setStyleSheet("color: " + color) return label
class AdjacencyClueView(QFrame): # Prolly could use a better name """ Represents the Adjacency Clue View """ TRANSPARENCY = 100 def __init__(self, adjacencyClue, fragilityClue, parent=None): """ Initialize the Adjacency Clue View """ QFrame.__init__(self, parent) self.adjacencyClue = adjacencyClue self.fragilityClue = fragilityClue self.resize(34, 32) self.setupClueLabel() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(15) def setupClueLabel(self): """ Setup the Clue Label """ self.setupFont() self.clueLabel = QLabel('', self) self.clueLabel.setFont(self.font) self.clueLabel.move(0, 0) def updateView(self): """ Update the View """ self.clueLabel.setText(self.getLabelText()) self.setColorBasedOnFragility() self.clueLabel.resize(34, self.clueLabel.contentsRect().height()) def getLabelText(self): """ Get the CLue Reading Text """ adjacentMines = self.adjacencyClue.getAdjacentMinesClue() if adjacentMines == 0: return '' else: return str(adjacentMines) def setColorBasedOnFragility(self): """ Set color of the clue based on adjacency to Fragile Mines """ color = "rgba({0}, {1}%)".format(self.getColor(), self.TRANSPARENCY) self.clueLabel.setStyleSheet("QLabel { color : %s }" % color) def getColor(self): """ Return color """ if self.fragilityClue.distance is None: return "0, 0, 0" elif self.fragilityClue.distance <= 1: if self.fragilityClue.count == 1: return "227, 68, 20" else: return "196, 0, 0" elif self.fragilityClue.distance > 1 and self.fragilityClue.distance < 4: return "244, 244, 0" elif self.fragilityClue.distance >= 4: return "0, 154, 0"
class PasteToUpload(QMainWindow): def __init__(self): super(PasteToUpload, self).__init__() self.initUI() def initUI(self): self.resize(290, 150) self.setWindowTitle('PasteToUpload') font = QFont('Helvetica', 16) self.label = QLabel('Ctrl+V', self) self.edit = QLineEdit(self) self.label.setFont(font) self.label.move(45, 25) self.edit.move(45, 85) self.label.setFixedWidth(250) self.edit.setFixedWidth(200) self.edit.setReadOnly(True) self.edit.setFocusPolicy(Qt.NoFocus) self.show() def __sendPost(self, base64): value = { 'key': API_KEY, 'image': base64 } data = urllib.urlencode(value) f = urllib2.urlopen( url='http://api.imgur.com/2/upload.json', data=data ) return json.load(f) def keyPressEvent(self, e): if e.matches(QKeySequence.Paste): clipboard = QApplication.clipboard() mimeData = clipboard.mimeData() if mimeData.hasImage(): image = clipboard.image() byteArray = QByteArray() buf = QBuffer(byteArray) buf.open(QIODevice.WriteOnly) image.save(buf, "PNG") self.label.setText('Uploading') self.thread = NetThread(str(byteArray.toBase64())) self.thread.finished.connect(self.onThreadEnd) self.thread.start() else: self.label.setText('No picture in clipboard') def onThreadEnd(self): url = self.thread.getResult() self.edit.setText(url) QApplication.clipboard().setText(url) self.label.setText('Finish (URL in clipboard)')
def setupRemainingDefensesLabels(self): """ Setup the Remaining Defenses Labels """ self.remainingDefensesLabels = {} labelNumber = 1 remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = QLabel("", self) label.move(32, 16+48*(labelNumber+1)) label.setFont(self.font) self.remainingDefensesLabels[defenseClass] = label labelNumber += 1
def setupHeader(self): header = QLabel() header.setText("<b>Transaction Details</b>") font = header.font() font.setPointSize(16) header.setFont(font) self.layout.addWidget(header) self.transactionLabel = QLabel() self.setTransactionLabelText() self.layout.addWidget(self.transactionLabel)
def setupRemainingDefensesLabels(self): """ Setup the Remaining Defenses Labels """ self.remainingDefensesLabels = {} labelNumber = 1 remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = QLabel("", self) label.move(32, 16 + 48 * (labelNumber + 1)) label.setFont(self.font) self.remainingDefensesLabels[defenseClass] = label labelNumber += 1
class StatusArea(QWidget): def __init__(self, parent=None): super(StatusArea, self).__init__(parent) self.setStyleSheet('StatusArea {background: yellow}') self.msg = QLabel(self) self.file = QLabel(self) self.progress = QProgressBar(self) self.msg.setFont(View.labelsFont()) self.file.setFont(View.editsFont()) self.progress.setMaximum(100) self.progress.setMinimum(0) self.progress.setTextVisible(False) self.progress.setStyleSheet(""" QProgressBar { border: 2px solid grey; border-radius: 5px; width: 60px; height: 10px; } QProgressBar::chunk { background-color: #05B8CC; width: 5px; }""") layout = QHBoxLayout() layout.addWidget(self.msg, 0, Qt.AlignLeft) layout.addWidget(self.file, 0, Qt.AlignLeft) layout.addWidget(self.progress, 0, Qt.AlignRight) self.setLayout(layout) @Slot(str) @Slot(str, str, str) def setMessage(self, msg, file='', progress=None): if not progress: self.progress.hide() self.progress.setValue(0) else: self.progress.setValue(progress) self.progress.show() self.msg.setText(msg) self.file.setText(file) def paintEvent(self, event): p = QPainter() p.begin(self) p.fillRect(self.rect(), QBrush(QColor(240, 200, 0))) p.end()
class StatusWidget(QFrame): """ StatusWidget """ def __init__(self): QFrame.__init__(self) self._color = [220, 220, 220] self._font = QFont() self._font.setPixelSize(10) self._pen = QPen(QColor(100, 100, 100, 255)) self.label = QLabel() self.label.setWordWrap(True) self.label.setFont(self._font) self.label.setMaximumWidth(300) self.label.setMaximumHeight(36) self.label.setMinimumHeight(36) layout = QGridLayout() layout.setSpacing(0) layout.addWidget(self.label) self.setLayout(layout) self.setMinimumWidth(360) self.setMaximumWidth(360) def setText(self, text): self.label.setText(text) def paintEvent(self, ev): size = self.size() height = size.height()-5 width = size.width()-5 offset = 0.5 rect = QRectF(2.0+offset, 2.0+offset, width, height) painter = QPainter(self) painter.setPen(self._pen) painter.setBrush(QColor(self._color[0], self._color[1], self._color[2])) painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.HighQualityAntialiasing) painter.drawRoundedRect(rect, 4, 4)
class StatusWidget(QFrame): """ StatusWidget """ def __init__(self): QFrame.__init__(self) self._color = [220, 220, 220] self._font = QFont() self._font.setPixelSize(10) self._pen = QPen(QColor(100, 100, 100, 255)) self.label = QLabel() self.label.setWordWrap(True) self.label.setFont(self._font) self.label.setMaximumWidth(300) self.label.setMaximumHeight(36) self.label.setMinimumHeight(36) layout = QGridLayout() layout.setSpacing(0) layout.addWidget(self.label) self.setLayout(layout) self.setMinimumWidth(360) self.setMaximumWidth(360) def setText(self, text): self.label.setText(text) def paintEvent(self, ev): size = self.size() height = size.height() - 5 width = size.width() - 5 offset = 0.5 rect = QRectF(2.0 + offset, 2.0 + offset, width, height) painter = QPainter(self) painter.setPen(self._pen) painter.setBrush(QColor(self._color[0], self._color[1], self._color[2])) painter.setRenderHint(QPainter.Antialiasing) painter.setRenderHint(QPainter.HighQualityAntialiasing) painter.drawRoundedRect(rect, 4, 4)
def firstPage(self): for i in range( self.mainLayout.count() ): item = self.mainLayout.itemAt(0) item.widget().setParent( None ) title = QLabel( "<p style='color:rgb( 137,129,120 )'>Welcome to the PingoTools Installer</p>" ) title.setFixedHeight( 50 ) titleFont = QFont() titleFont.setPixelSize( 18 ) titleFont.setBold( True ) titleFont.setFamily( "Helvetica [Cronyx]" ) title.setAlignment( QtCore.Qt.AlignCenter ) title.setFont( titleFont ) description = QLabel() description.setAlignment( QtCore.Qt.AlignCenter ) buttonsWidget = QWidget(); buttonsWidget.setMaximumHeight( 50 ) buttonsLayout = QHBoxLayout( buttonsWidget ) emptyArea = QLabel() buttonNext = QPushButton( 'Next > ' ) buttonCancel = QPushButton( 'Cancel' ) buttonsLayout.addWidget( emptyArea ) buttonsLayout.addWidget( buttonNext ); buttonNext.setFixedWidth( 100 ) buttonsLayout.addWidget( buttonCancel ); buttonCancel.setFixedWidth( 100 ) self.mainLayout.addWidget( title ) self.mainLayout.addWidget( description ) self.mainLayout.addWidget( buttonsWidget ) origWidth = 500 frontImage = QImage() frontImage.load( os.path.dirname( __file__ ) + '/images/pingoTools_main.jpg' ) trValue = QTransform().scale( float(origWidth)/frontImage.width(), float(origWidth)/frontImage.width() ) transformedImage = frontImage.transformed( trValue ) pixmap = QPixmap.fromImage( transformedImage ) description.setPixmap( pixmap ) description.setGeometry( 0,0, transformedImage.width() , transformedImage.height() ) description.paintEvent(QPaintEvent(QtCore.QRect( 0,0,self.width(), self.height() ))) QtCore.QObject.connect( buttonNext, QtCore.SIGNAL( 'clicked()' ), self.secondPage ) QtCore.QObject.connect( buttonCancel, QtCore.SIGNAL( 'clicked()' ), self.cmd_cancel )
class TitleWidget(QWidget): """ TitleWidget holds a title. And paints the background with a gradient. """ TitleHeight = 20 def __init__(self, title=None): super(TitleWidget, self).__init__() if sys.platform.startswith("darwin"): color1 = QColor(230, 230, 230, 255) color2 = QColor(177, 177, 177, 255) gradient = QLinearGradient() gradient.setStart(0, 0) gradient.setFinalStop(0, TitleWidget.TitleHeight) gradient.setColorAt(0, color1) gradient.setColorAt(1, color2) brush = QBrush(gradient) palette = QPalette() palette.setBrush(QPalette.Background, brush) self.setPalette(palette) self.setAutoFillBackground(True) self.setMaximumHeight(TitleWidget.TitleHeight) self.setMinimumHeight(TitleWidget.TitleHeight) self.titleLabel = QLabel("", parent=self) font = self.titleLabel.font() font.setPixelSize(11) self.titleLabel.setFont(font) self.titleLabel.setAlignment(Qt.AlignCenter) self.titleLabel.setText(title) layout = QVBoxLayout() layout.setSpacing(0) layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(self.titleLabel) self.setLayout(layout) def setText(self, title): self.title = title self.titleLabel.setText(self.title)
def __init__(self, program, parent=None): QWidget.__init__(self, parent) # Variables self._program = program # Controls lbl_program = QLabel(program.name) font = lbl_program.font() font.setBold(True) font.setPointSize(14) lbl_program.setFont(font) # Sizer layout = QVBoxLayout() layout.addWidget(lbl_program) layout.addLayout(self._initUI()) layout.addStretch() self.setLayout(layout)
def __init__ (self, data_list, header_rows=0, roundit=None, cmap=None, click_handler=None, resize_columns=True, stretch_last=False, header_text=None, row_height=0, sort_column=0, sort_order=QtCore.Qt.AscendingOrder): QDialog.__init__(self) self.resize(800, 500) self.tableWidget = ExplorerTable(data_list, header_rows, roundit, cmap, click_handler, resize_columns, stretch_last, header_text, row_height, sort_column, sort_order=QtCore.Qt.AscendingOrder) main_frame = QVBoxLayout() top_frame = QHBoxLayout() self.setLayout(main_frame) main_frame.addLayout(top_frame) qmy_button(top_frame, self.tableWidget.explorer_copy, "Copy Selected") qmy_button(top_frame, self.tableWidget.explorer_save_as_tab, "Save to TAB file") self.min_val = qHotField("Min Value", float, -10, pos="top") self.max_val = qHotField("Max Value", float, 10, pos="top") top_frame.addWidget(self.min_val) top_frame.addWidget(self.max_val) qmy_button(top_frame, self.tableWidget.recolor, "Color Cells") if header_text != None: top_text = QLabel(header_text) top_text.setFont(QFont('SansSerif', 14)) main_frame.addWidget(top_text) main_frame.addWidget(self.tableWidget)
def __init__(self, var_name, default_file, project_root_dir = None, help_instance=None): QWidget.__init__(self) self.project_root_dir = project_root_dir self.my_layout = QHBoxLayout() self.setLayout(self.my_layout) self.var_name = var_name self.current_value = default_file self.full_path = project_root_dir + default_file self.my_layout.setContentsMargins(1, 1, 1, 1) self.my_layout.setSpacing(3) self.my_but = QPushButton(os.path.basename(remove_trailing_slash(default_file))) self.my_but.setFont(regular_small_font) self.my_but.setStyleSheet("text-align: left") self.my_but.clicked.connect(self.set_file) self.my_layout.addWidget(self.my_but) my_label = QLabel(var_name) my_label.setFont(regular_small_font) self.my_layout.addWidget(my_label)
class managebkm(QDialog): def __init__(self, parent=None): super(managebkm, self).__init__(parent) appicom = QIcon(":/icons/njnlogo.png") self.setWindowIcon(appicom) self.setWindowTitle("Nigandu | Manage Book Marks") self.setFixedSize(463, 242) self.verticalLayoutWidget = QWidget(self) self.verticalLayoutWidget.setGeometry(QRect(350, 30, 101, 201)) self.verticalLayoutWidget.setObjectName("verticalLayoutWidget") self.verticalLayout = QVBoxLayout(self.verticalLayoutWidget) self.verticalLayout.setContentsMargins(0, 0, 0, 0) self.verticalLayout.setObjectName("verticalLayout") self.sortbtn = QPushButton(self.verticalLayoutWidget) self.sortbtn.setText("&Sort") self.verticalLayout.addWidget(self.sortbtn) self.deletebtn = QPushButton(self.verticalLayoutWidget) self.deletebtn.setText("&Delete") self.verticalLayout.addWidget(self.deletebtn) self.deleteallbtn = QPushButton(self.verticalLayoutWidget) self.deleteallbtn.setText("Delete &All") self.verticalLayout.addWidget(self.deleteallbtn) self.closebtn = QPushButton(self.verticalLayoutWidget) self.closebtn.setText("&Close") self.verticalLayout.addWidget(self.closebtn) self.listWidget = QListWidget(self) self.listWidget.setGeometry(QRect(10, 30, 331, 201)) self.label = QLabel(self) self.label.setGeometry(QRect(20, 10, 91, 25)) font = QFont() font.setPointSize(10) self.label.setFont(font) self.label.setBuddy(self.listWidget) self.label.setText("Book Mark List:")
class qLabeledEntry(QWidget): def __init__(self, name, arg_dict, pos = "side", max_size = 200): QWidget.__init__(self) self.setContentsMargins(1, 1, 1, 1) if pos == "side": self.layout1=QHBoxLayout() else: self.layout1 = QVBoxLayout() self.layout1.setContentsMargins(1, 1, 1, 1) self.layout1.setSpacing(1) self.setLayout(self.layout1) self.efield = QLineEdit("Default Text") # self.efield.setMaximumWidth(max_size) self.efield.setFont(QFont('SansSerif', 12)) self.label = QLabel(name) # self.label.setAlignment(Qt.AlignLeft) self.label.setFont(QFont('SansSerif', 12)) self.layout1.addWidget(self.label) self.layout1.addWidget(self.efield) self.arg_dict = arg_dict self.name = name self.mytype = type(self.arg_dict[name]) if self.mytype != str: self.efield.setText(str(self.arg_dict[name])) self.efield.setMaximumWidth(50) else: self.efield.setText(self.arg_dict[name]) self.efield.setMaximumWidth(100) self.efield.textChanged.connect(self.when_modified) def when_modified(self): if self.mytype == int: if self.efield.text != None: self.arg_dict[self.name] = int(self.efield.text()) else: self.arg_dict[self.name] = self.efield.text() def hide(self): QWidget.hide(self)
class QBigDataDisplay(QDataDisplay): def __init__(self, parent, label, units): QDataDisplay.__init__(self, parent) self.units = units self.buildLabels(label) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addWidget(self.label) vbox.addWidget(self.data) vbox.addStretch(1) self.setLayout(vbox) def buildLabels(self, label): self.label = QLabel(label) self.data = QLabel(constants.DEFAULT_LABEL) # Center the text in the labels self.label.setAlignment(Qt.AlignCenter) self.data.setAlignment(Qt.AlignCenter) # Bold the label label labelFont = QFont() labelFont.setBold(True) # Make the data label font obnoxiously large dataFont = QFont() dataFont.setPixelSize(20) self.label.setFont(labelFont) self.data.setFont(dataFont) def setData(self, data): # Show floats with two decimals text = '%.2f' % data if isinstance(data, float) else str(data) self.data.setText('%s%s' % (text, self.units))
def addDetector(self, key, detector): if key in self._tabs: raise ValueError('Detector with key %s already added' % key) clasz = detector.__class__ wdg_detector = get_widget_class(clasz)() wdg_detector.setValue(detector) wdg_detector.setReadOnly(self._readonly) self._widgets[key] = wdg_detector lbl_class = QLabel(clasz.__name__) lbl_class.setAlignment(Qt.AlignRight) font = lbl_class.font() font.setItalic(True) lbl_class.setFont(font) layout = QVBoxLayout() layout.addWidget(lbl_class) layout.addWidget(wdg_detector, 1) widget = QWidget() widget.setLayout(layout) index = self._wdg_tab.addTab(widget, key) self._tabs[key] = index
class AeneidWindow(QMainWindow): def __init__(self): super(AeneidWindow, self).__init__() self.initGui() def initGui(self): self.setWindowTitle("Aeneid Window") self.setGeometry(200, 100, 400, 200) # label self.label1 = QLabel('today me, tomorrow the world!', self) self.label1.setFont('Arial') self.label1.move(20, 10) # check box creation self.checkbox1 = QCheckBox('OK', self) self.checkbox1.clicked.connect(self.onCheckBox1) self.checkbox1.toggle() # Radio buttons self.radioButton = QRadioButton('click me', self) self.radioButton.clicked.connect(self.onRadioButton) # ok cancel button self self.show()
class QtReduceStatusBar(QStatusBar): def __init__(self,parent=None): QStatusBar.__init__(self,parent) self.symbolic = None font = self.font() traceLogger.debug(font.pointSize()) if os.uname()[0] == "Darwin": font.setPointSize(font.pointSize() - 2) self.setFont(font) self.reduceMode = QLabel() self.reduceMode.setFixedWidth( QFontMetrics(font).width(self.tr("Mode: Algebraic"))) self.reduceMode.setFont(font) self.reduceTime = QLabel() self.reduceTime.setFont(font) self.reduceStatus = QLabel() self.reduceStatus.setFont(font) self.addPermanentWidget(self.reduceMode) self.addPermanentWidget(self.reduceTime) self.addWidget(self.reduceStatus) self.reduceStatus.setText(self.tr("Initializing ...")) def startComputationHandler(self,computation): signalLogger.debug(computation.command) signalLogger.debug(computation.status) self.__updateStatus(computation.status) def endComputationHandler(self,computation): signalLogger.debug(computation.status) self.__updateStatus(computation.status) self.__updateTime(computation.accTime,computation.accGcTime) self.__updateMode(computation.symbolic) def __updateMode(self,symbolic): if symbolic != self.symbolic: self.symbolic = symbolic if self.symbolic: self.reduceMode.setText(self.tr("Mode: Symbolic")) else: self.reduceMode.setText(self.tr("Mode: Algebraic")) def __updateTime(self,time,gcTime): timeStr = "%.2f s" % (float(time + gcTime)/1000) self.reduceTime.setText(self.tr("Time: ") + timeStr) def __updateStatus(self,status): if status == QtReduceComputation.Evaluating: self.reduceStatus.setText(self.tr(" Evaluating")) else: self.reduceStatus.setText(self.tr(" Ready"))
class MyLable(QWidget): """ a widget contains a picture and two line of text """ def __init__(self, title, subtitle, icon_path): """ :param title: str title :param subtitle: str subtitle :param icon_path: path of picture """ super(MyLable, self).__init__() self.lb_title = QLabel(title) self.lb_title.setFont(QFont("Arial", 10, QFont.Bold)) self.lb_subtitle = QLabel(subtitle) self.lb_subtitle.setFont(QFont("Arial", 8, QFont.StyleItalic)) self.lb_subtitle1 = QLabel(subtitle) self.lb_subtitle1.setFont(QFont("Arial", 8, QFont.StyleItalic)) self.lb_icon = QLabel() self.lb_icon.setFixedSize(40, 40) pixMap = QPixmap(icon_path).scaled(self.lb_icon.width(), self.lb_icon.height()) self.lb_icon.setPixmap(pixMap) self.lb_icon1 = QLabel() self.lb_icon1.setFixedSize(40, 40) pixMap1 = QPixmap(icon_path).scaled(self.lb_icon.width(), self.lb_icon.height()) self.lb_icon1.setPixmap(pixMap1) self.double_click_fun = None self.init_ui() def init_ui(self): """handle layout""" ly_main = QHBoxLayout() ly_right = QVBoxLayout() ly_right.addWidget(self.lb_title) ly_right.addWidget(self.lb_subtitle) ly_right.addWidget(self.lb_subtitle1) ly_right.setAlignment(Qt.AlignVCenter) ly_main.addWidget(self.lb_icon) ly_main.addLayout(ly_right) ly_main.addWidget(self.lb_icon1) self.setLayout(ly_main) self.resize(90, 60) def get_lb_title(self): return self.lb_title.text() def get_lb_subtitle(self): return self.lb_subtitle.text()
class optdlg(QDialog): def __init__(self, parent=None): super(optdlg, self).__init__(parent) self.setFixedSize(484, 399) appicom = QIcon(":/icons/njnlogo.png") self.setWindowIcon(appicom) self.setWindowTitle("Nigandu English to Tamil Dictionary | OPTIONS") self.buttonBox = QDialogButtonBox(self) self.buttonBox.setEnabled(True) self.buttonBox.setGeometry(QRect(350, 20, 121, 200)) self.buttonBox.setOrientation(Qt.Vertical) self.buttonBox.setStandardButtons(QDialogButtonBox.Apply|QDialogButtonBox.Cancel|QDialogButtonBox.Ok) self.buttonBox.setCenterButtons(True) self.restorebtn = QPushButton(self) self.restorebtn.setGeometry(QRect(354, 360, 121, 23)) self.restorebtn.setText("&RestoreDefults") self.fontbox = QGroupBox(self) self.fontbox.setGeometry(QRect(10, 10, 331, 141)) self.spinBox = QSpinBox(self.fontbox) self.spinBox.setGeometry(QRect(100, 20, 81, 21)) self.spinBox.setMinimum(10) self.spinBox.setMaximum(24) self.label = QLabel(self.fontbox) self.label.setGeometry(QRect(20, 20, 71, 21)) self.label.setText("Font Size:") self.fontbox.setTitle("Font") self.samplefontbox = QGroupBox(self) self.samplefontbox.setGeometry(QRect(20, 50, 291, 91)) self.samplefontbox.setTitle("Sample Text") self.sampletxt = QLabel(self.samplefontbox) self.sampletxt.setGeometry(QRect(20, 20, 251, 61)) self.sampletxt.setText("AaBbCcDdEeFfGgHhIiJjKkLlYyZz") self.clipbox = QGroupBox(self) self.clipbox.setGeometry(QRect(10, 160, 331, 61)) self.clipbox.setTitle("ClipBoard Options") self.checkclip = QCheckBox(self.clipbox) self.checkclip.setGeometry(QRect(20, 20, 301, 31)) self.checkclip.setText("Allow copy from clipboard on start-up") self.histbox = QGroupBox(self) self.histbox.setGeometry(QRect(10, 230, 331, 91)) self.histbox.setTitle("History") self.checkshowhistdock = QCheckBox(self.histbox) self.checkshowhistdock.setGeometry(QRect(20, 60, 301, 17)) self.checkshowhistdock.setText("Show History Dock on the right side") self.checkdelhist = QCheckBox(self.histbox) self.checkdelhist.setGeometry(QRect(20, 30, 301, 17)) self.checkdelhist.setText("Clear all the past history records") self.bkmbox = QGroupBox(self) self.bkmbox.setGeometry(QRect(10, 330, 331, 61)) self.bkmbox.setTitle("Book Marks") self.checkshowbkmdock = QCheckBox(self.bkmbox) self.checkshowbkmdock.setGeometry(QRect(20, 30, 301, 17)) self.checkshowbkmdock.setText("Show Book Marks Dock on the right side.") self.spinBox.valueChanged[int].connect(self.setsampletxt) self.restorebtn.clicked.connect(self.setdeafults) self.buttonBox.rejected.connect(self.close) def setdeafults(self): self.spinBox.setValue(13) self.checkshowhistdock.setChecked(True) self.checkshowbkmdock.setChecked(True) self.checkclip.setChecked(True) self.checkdelhist.setChecked(False) def setsampletxt(self, i): font = QFont() font.setPixelSize(i) self.sampletxt.setFont(font)
class _BaseResultWidget(QWidget): def __init__(self, options, parent=None): QWidget.__init__(self, parent) # Variables self._options = options # Widgets self._lbl_title = QLabel("Untitled") font = self._lbl_title.font() font.setBold(True) font.setPointSize(14) self._lbl_title.setFont(font) self._lbl_subtitle = QLabel("") font = self._lbl_subtitle.font() font.setItalic(True) font.setPointSize(14) self._lbl_subtitle.setFont(font) # Layouts layout = QVBoxLayout() sublayout = QHBoxLayout() sublayout.addWidget(self._lbl_title) sublayout.addStretch() sublayout.addWidget(self._lbl_subtitle) layout.addLayout(sublayout) wdglayout = QVBoxLayout() wdglayout.addLayout(self._initUI(), 1) wdglayout.addWidget(self._initToolbar()) toolbox = self._initToolbox() if toolbox.count() == 0: layout.addLayout(wdglayout) else: wdg_dummy = QWidget() wdg_dummy.setLayout(wdglayout) splitter = QSplitter() splitter.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) splitter.addWidget(wdg_dummy) splitter.addWidget(toolbox) splitter.setCollapsible(0, False) splitter.setCollapsible(1, True) layout.addWidget(splitter) self.setLayout(layout) def _initUI(self): return QVBoxLayout() def _initToolbar(self): return QToolBar() def _initToolbox(self): return QToolBox() def options(self): return self._options def title(self): return self._lbl_title.text() def setTitle(self, title): self._lbl_title.setText(title) def subTitle(self): return self._lbl_subtitle.text() def setSubTitle(self, subtitle): self._lbl_subtitle.setText(subtitle)
class NewWindow(QWidget): def __init__(self, app=None): super(NewWindow, self).__init__() self.app = app glo = QVBoxLayout(self) if os.name == 'nt': icp = r_path('static\\images\\favicon.png') else: icp = r_path('static/images/favicon.png') # need to used objective message boxs instead of functions to set font self.Arial = QFont("", 15, QFont.Bold) self.Arials = QFont("", 10, QFont.Bold) # Language support varibels used by translate func self.Arabic = None self.Runningo = False icon = QIcon(icp) self.SelfIinit(icon) self.center() self.Llists(glo) self.set_Abutton(icp, glo) self.Lists(glo) self.Flabel(glo) self.set_button(glo) self.setLayout(glo) mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.activateWindow() self.show() def SelfIinit(self, icon): self.setWindowTitle('Free Queue Manager ' + version) self.setGeometry(300, 300, 200, 150) self.setMinimumWidth(500) self.setMaximumWidth(500) self.setMinimumHeight(400) self.setMaximumHeight(400) # Setting Icon self.setWindowIcon(icon) QToolTip.setFont(self.Arials) def Flabel(self, glo): fontt = self.Arial if os.name == 'nt': self.ic1 = QIcon(r_path('static\\images\\pause.png')) else: self.ic1 = QIcon(r_path('static/images/pause.png')) self.l = QLabel('Icond', self) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) self.l.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.l.setFont(fontt) self.t = QLabel('Texted', self) self.t.setText("Server is <u> Not running </u> <br>") self.t.setOpenExternalLinks(True) self.t.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.t.setFont(fontt) self.t.setToolTip('Status of the server') self.l.setToolTip('Status of the server') glo.addStretch() glo.addWidget(self.l) glo.addWidget(self.t) glo.addStretch() def Lists(self, glo): ips = self.get_ips() self.sl = QComboBox() self.sl.addItems(ips) self.sl.setToolTip( 'Select network interface with ip, so the server runs on it') self.sl2 = QComboBox() self.get_ports() self.sl2.setToolTip('Select a port, so server runs through it') self.sl.currentIndexChanged.connect(self.get_ports) glo.addWidget(self.sl) glo.addWidget(self.sl2) def get_ports(self, nauto=True): d_ports = ['5000', '8080', '3000', '80', '9931'] m_ports = [] while len(m_ports) < 10: mip = self.slchange() for p in d_ports: s = socket(AF_INET, SOCK_STREAM) try: s.bind((mip[1].split(',')[1], int(p))) s.close() m_ports.append(p) except: s.close() d_ports.remove(p) s = socket(AF_INET, SOCK_STREAM) p = randint(1000, 9999) try: s.bind((mip[1].split(',')[1], p)) s.close() m_ports.append(str(p)) except: s.close() if len(m_ports) >= 10: break self.sl2.clear() self.sl2.addItems(m_ports) def Llists(self, glo): hlayout = QHBoxLayout() self.lebutton = QPushButton('English', self) self.lebutton.setToolTip('Change language to English') self.lebutton.setEnabled(False) self.lebutton.setFont(self.Arials) self.labutton = QPushButton('Arabic', self) self.labutton.setFont(self.Arials) if os.name == 'nt': self.lebutton.setIcon( QPixmap(r_path('static\\images\\english.png'))) self.labutton.setIcon(QPixmap( r_path('static\\images\\arabic.png'))) else: self.lebutton.setIcon(QPixmap(r_path('static/images/english.png'))) self.labutton.setIcon(QPixmap(r_path('static/images/arabic.png'))) self.labutton.setToolTip('Change language to Arabic') self.labutton.setEnabled(True) self.lebutton.clicked.connect(partial(self.translate, ar=False)) self.labutton.clicked.connect(self.translate) hlayout.addWidget(self.lebutton) hlayout.addWidget(self.labutton) glo.addLayout(hlayout) def slchange(self): return [self.sl2.currentText(), self.sl.currentText()] def set_button(self, glo): hlayout = QHBoxLayout() self.mbutton = QPushButton('Start', self) self.mbutton.clicked.connect(self.s_server) self.mbutton.setFont(self.Arials) if os.name == 'nt': self.mbutton.setIcon(QPixmap(r_path('static\\images\\play.png'))) else: self.mbutton.setIcon(QPixmap(r_path('static/images/play.png'))) self.mbutton2 = QPushButton('Stop', self) self.mbutton2.clicked.connect(self.st_server) if os.name == 'nt': self.mbutton2.setIcon(QPixmap(r_path('static\\images\\pause.png'))) else: self.mbutton2.setIcon(QPixmap(r_path('static/images/pause.png'))) self.mbutton.setToolTip('Start the server') self.mbutton2.setToolTip('Stop the server') self.mbutton2.setEnabled(False) self.mbutton2.setFont(self.Arials) hlayout.addWidget(self.mbutton) hlayout.addWidget(self.mbutton2) glo.addLayout(hlayout) def s_server(self): mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.P.setTerminationEnabled(True) if not self.P.isRunning(): try: self.pport = mip[0] self.mbutton.setEnabled(False) self.mbutton2.setEnabled(True) self.sl.setEnabled(False) self.sl2.setEnabled(False) if os.name == 'nt': self.ic1 = QIcon(r_path('static\\images\\play.png')) else: self.ic1 = QIcon(r_path('static/images/play.png')) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) if self.Arabic is None: pp = self.slchange() addr = "Server is <u>Running</u> <br>" addr += " On : <a href='http://" addr += pp[1].split(',')[1] + ":" + pp[0] addr += "'> http://" + pp[1].split(',')[1] + ":" + pp[0] addr += "</a>" self.t.setText(addr) self.t.setFont(self.Arial) else: pp = self.slchange() addr = u"الخدمة <u>مشغــلة</u> و تبث على : <br>" addr += u"<a href='http://" addr += pp[1].split(',')[1] + u":" + pp[0] addr += u"'> http://" + pp[1].split(',')[1] + u":" + pp[0] addr += u"</a>" self.t.setText(addr) self.t.setFont(self.Arial) self.P.start() self.Runningo = True except: self.eout() else: self.eout() def st_server(self): if self.P.isRunning(): try: if self.P.isRunning: self.P.stop() self.mbutton.setEnabled(True) self.mbutton2.setEnabled(False) self.sl.setEnabled(True) self.sl2.setEnabled(True) if self.Arabic is None: self.t.setText("Server is <u> Not running </u> <br>") else: self.t.setText(u"الــخـدمة <u>متــوقفــة</u><br>") # removing the last used port to avoid termination error cind = self.sl2.currentIndex() self.sl2.removeItem(cind) self.get_ports() self.Runningo = False except: self.eout() else: self.eout() def set_Abutton(self, icon, glo): def show_about(nself): if nself.Arabic is None: Amsg = "<center>All credit reserved to the author of FQM " Amsg += " version " + version Amsg += ", This work is a free, open-source project licensed " Amsg += " under Mozilla Public License version 2.0 . <br><br>" Amsg += " visit us for more infos and how-tos :<br> " Amsg += "<b><a href='https://fqms.github.io/'> " Amsg += "https://fqms.github.io/ </a> </b></center>" Amsgb = "About FQM" else: Amsg = u" <center> " Amsg += u" إدارة الحشود الحر النسخة " + version + u" " Amsg += u"حقوق نشر هذا البرنامج محفوظة و تخضع " Amsg += u" لرخصة البرامج الحرة و مفتوحة المصدر " Amsg += u" Mozilla Public License version 2.0 . " Amsg += u"<br><br> " Amsg += u"للمزيد من المعلومات و الشروحات , قم بزيارة :" Amsg += u"<br> <b><a href='https://fqms.github.io/'>" Amsg += u"https://fqms.github.io </a> </b></center>" Amsgb = u"عن النظام" return QMessageBox.about(self, Amsgb, Amsg) self.abutton = QPushButton('', self) self.abutton.setIcon(QPixmap(icon)) self.abutton.setIconSize(QSize(150, 70)) self.abutton.setToolTip('About FQM') self.abutton.clicked.connect(partial(show_about, self)) glo.addWidget(self.abutton) def closeEvent(self, event=None): if self.Runningo: if self.Arabic is None: response = self.msgApp( "Exiting while running", "Are you really sure, you want to exit ?") else: response = self.msgApp( u"تأكيد الخروج", u"تريد بالفعل , الخروج و إيقاف البرنامج ؟") if response == 'y': if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) else: if event is not None: event.ignore() else: if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) def msgApp(self, title, msg): uinfo = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No) if uinfo == QMessageBox.Yes: return 'y' if uinfo == QMessageBox.No: return 'n' def eout(self): if self.P.isRunning(): self.P.stop() if self.Arabic is None: msgg = "<center>" msgg += " Opps, a critical error has occurred, we will be " msgg += " grateful if you can help fixing it, by reporting to us " msgg += " at : <br><br> " msgg += "<b><a href='https://fqms.github.io/'> " msgg += "https://fqms.github.io/ </a></b> </center>" mm = QMessageBox.critical(self, "Critical Error", msgg, QMessageBox.Ok) else: msgg = u"<center>" msgg += u"حدث خطأ فادح في تشغيل النظام , سنكون شاكرين لك إن " msgg += u"قمت بتبليغنا عنه , ليتم إصلاحه في أقرب وقت " msgg += u"<br>" msgg += u"<br><b><a href='https://fqms.github.io/'> " msgg += u"https://fqms.github.io </a></b> </center>" mm = QMessageBox.critical(self, u"خطأ في التشغيل", msgg, QMessageBox.Ok) def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def get_ips(self): il = [] for i in interfaces(): try: if os.name != 'nt': inf = i + " ," else: inf = ' ,' inf += ifaddresses(i)[2][0].get('addr') il.append(inf) except: pass return il def translate(self, ar=True): if ar: self.Arabic = "arabic" self.labutton.setEnabled(False) self.labutton.setText(u"العربية") self.labutton.setToolTip(u"تغير اللغة إلى العربية") self.lebutton.setText(u"الإنجليزية") self.lebutton.setToolTip(u"تغير اللغة إلى الإنجليزية") self.lebutton.setEnabled(True) self.Amsgb = u"عن النظام" self.abutton.setToolTip(u"عن النظام") self.mbutton.setText(u"تشغــيل") self.mbutton.setToolTip(u"تشغيل الخدمة") self.mbutton2.setText(u"إيــقاف") self.mbutton2.setToolTip(u"إيقاف الخدمة") self.sl.setToolTip(u"إختار عنوان IP ليتم بث الخدمة عليه") self.sl2.setToolTip(u"إختار منفذ ليتم بث الخدمة من خلاله") self.t.setToolTip(u"حالة الخدمة ") self.l.setToolTip(u"حالة الخدمة ") if self.Runningo: pp = self.slchange() addr = u"الخدمة <u>مشغــلة</u> و تبث على : <br>" addr += u"<a href='http://" addr += pp[1].split(',')[1] + u":" + pp[0] addr += u"'> http://" + pp[1].split(',')[1] + u":" + pp[0] addr += u"</a>" self.t.setText(addr) else: self.t.setText(u"الــخـدمة <u>متــوقفــة</u><br>") else: self.Arabic = None self.lebutton.setEnabled(False) self.lebutton.setText("English") self.lebutton.setToolTip('Change language to English') self.labutton.setEnabled(True) self.labutton.setText("Arabic") self.labutton.setToolTip('Change language to Arabic') self.Amsgb = "About FQM" self.abutton.setToolTip('About FQM') self.mbutton.setText("Start") self.mbutton.setToolTip("Start the server") self.mbutton2.setText("Stop") self.mbutton2.setToolTip("Stop the server") self.sl.setToolTip( 'Select network interface with ip, so the server runs on it') self.sl2.setToolTip('Select a port, so server runs through it') self.t.setToolTip('Status of the server') self.l.setToolTip('Status of the server') if self.Runningo: pp = self.slchange() addr = "Server is <u>Running</u> <br>" addr += " On : <a href='http://" addr += pp[1].split(',')[1] + ":" + pp[0] addr += "'> http://" + pp[1].split(',')[1] + ":" + pp[0] addr += "</a>" self.t.setText(addr) else: self.t.setText("Server is <u> Not running </u> <br>")
class ui(QWidget): def __init__(self): QWidget.__init__(self) self.setupUI() self.id = 1 self.lines = [] self.editable = True self.des_sort = True self.faker = Factory.create() self.btn_add.clicked.connect(self.add_line) self.btn_del.clicked.connect(self.del_line) self.btn_modify.clicked.connect(self.modify_line) self.btn_select_line.clicked.connect(self.select_line) self.btn_select_single.clicked.connect(self.deny_muti_line) self.btn_sort.clicked.connect(self.sortItem) self.btn_set_header.clicked.connect(self.setheader) self.btn_set_middle.clicked.connect(self.middle) self.table.cellChanged.connect(self.cellchange) self.btn_noframe.clicked.connect(self.noframe) # # Sess = sessionmaker(bind = engine) def setupUI(self): self.setWindowTitle(windowTital) self.resize(640, 480) self.table = QTableWidget(self) self.btn_add = QPushButton(u'增加') self.btn_del = QPushButton(u'删除') self.btn_modify = QPushButton(u'可以编辑') self.btn_select_line = QPushButton(u'选择整行') self.btn_select_single = QPushButton(u'禁止选多行') self.btn_sort = QPushButton(u'以分数排序') self.btn_set_header = QPushButton(u'标头设置') self.btn_set_middle = QPushButton(u'文字居中加颜色') self.btn_noframe = QPushButton(u'取消边框颜色交替') self.spacerItem = QSpacerItem(20, 20, QSizePolicy.Minimum, QSizePolicy.Expanding) self.vbox = QVBoxLayout() self.vbox.addWidget(self.btn_add) self.vbox.addWidget(self.btn_del) self.vbox.addWidget(self.btn_modify) self.vbox.addWidget(self.btn_select_line) self.vbox.addWidget(self.btn_select_single) self.vbox.addWidget(self.btn_sort) self.vbox.addWidget(self.btn_set_header) self.vbox.addWidget(self.btn_set_middle) self.vbox.addWidget(self.btn_noframe) self.vbox.addSpacerItem( self.spacerItem) #可以用addItem也可以用addSpacerItem方法添加,没看出哪里不一样 self.txt = QLabel() self.txt.setMinimumHeight(50) self.vbox2 = QVBoxLayout() self.vbox2.addWidget(self.table) self.vbox2.addWidget(self.txt) self.hbox = QHBoxLayout() self.hbox.addLayout(self.vbox2) self.hbox.addLayout(self.vbox) self.setLayout(self.hbox) self.table.setColumnCount(4) ##设置列数 self.headers = [u'id', u'选择', u'姓名', u'成绩', u'住址'] self.table.setHorizontalHeaderLabels(self.headers) self.show() def add_line(self): self.table.cellChanged.disconnect() row = self.table.rowCount() self.table.setRowCount(row + 1) id = str(self.id) ck = QCheckBox() h = QHBoxLayout() h.setAlignment(Qt.AlignCenter) h.addWidget(ck) w = QWidget() w.setLayout(h) name = self.faker.name() score = str(random.randint(50, 99)) add = self.faker.address() self.table.setItem(row, 0, QTableWidgetItem(id)) self.table.setCellWidget(row, 1, w) self.table.setItem(row, 2, QTableWidgetItem(name)) self.table.setItem(row, 3, QTableWidgetItem(score)) self.table.setItem(row, 4, QTableWidgetItem(add)) self.id += 1 self.lines.append([id, ck, name, score, add]) self.settext(u'自动生成随机一行数据!,checkbox设置为居中显示') self.table.cellChanged.connect(self.cellchange) def del_line(self): removeline = [] for line in self.lines: if line[1].isChecked(): row = self.table.rowCount() for x in range(row, 0, -1): if line[0] == self.table.item(x - 1, 0).text(): self.table.removeRow(x - 1) removeline.append(line) for line in removeline: self.lines.remove(line) self.settext(u'删除在左边checkbox中选中的行,使用了一个笨办法取得行号\n,不知道有没有其他可以直接取得行号的方法!') def modify_line(self): if self.editable == True: self.table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.btn_modify.setText(u'禁止编辑') self.editable = False else: self.table.setEditTriggers(QAbstractItemView.AllEditTriggers) self.btn_modify.setText(u'可以编辑') self.editable = True self.settext(u'设置,是否可以编辑整个表格') def select_line(self): if self.table.selectionBehavior() == 0: self.table.setSelectionBehavior(1) self.btn_select_line.setStyleSheet('background-color:lightblue') else: self.table.setSelectionBehavior(0) self.btn_select_line.setStyleSheet('') self.settext(u'默认时,点击单元格,只可选择一个格,此处设置为可选择整行') def deny_muti_line(self): if self.table.selectionMode() in [2, 3]: self.table.setSelectionMode(QAbstractItemView.SingleSelection) self.btn_select_single.setStyleSheet('background-color:lightblue') else: self.table.setSelectionMode(QAbstractItemView.ExtendedSelection) self.btn_select_single.setStyleSheet('') self.settext(u'点击时会轮换以多行或单行选择,默认是可以同时选择多行') def sortItem(self): if self.des_sort == True: self.table.sortItems(3, Qt.DescendingOrder) self.des_sort = False self.btn_sort.setStyleSheet('background-color:lightblue') self.table.setSortingEnabled(True) # 设置表头可以自动排序 else: self.table.sortItems(3, Qt.AscendingOrder) self.des_sort = True self.btn_sort.setStyleSheet('background-color:lightblue') self.table.setSortingEnabled(False) self.settext(u'点击时会轮换以升序降序排列,但排序时,会使自动列宽失效!') def setheader(self): font = QFont(u'微软雅黑', 12) font.setBold(True) self.table.horizontalHeader().setFont(font) # 设置表头字体 self.table.setColumnWidth(0, 50) self.table.setColumnWidth(1, 50) self.table.setColumnWidth(3, 100) self.table.horizontalHeader().setSectionResizeMode( 2, QHeaderView.Stretch) self.table.horizontalHeader().setStyleSheet( 'QHeaderView::section{background:gray}') self.table.horizontalHeader().setFixedHeight(50) self.table.setColumnHidden(0, True) self.btn_set_header.setStyleSheet('background-color:lightblue') self.settext( u'设置标头字体及字号,隐藏ID列,设置标头除姓名外全部为固定宽度\n,设置姓名列自动扩展宽度,设置标头行高,设置标头背景色') def middle(self): self.btn_set_middle.setStyleSheet('background-color:lightblue') self.table.setStyleSheet('color:green;') row = self.table.rowCount() for x in range(row): for y in range(4): if y != 1: item = self.table.item(x, y) item.setTextAlignment(Qt.AlignCenter) else: pass self.btn_set_middle.setStyleSheet('background-color:lightblue') self.settext(u'将文字居中显示,设置文字颜色') def cellchange(self, row, col): item = self.table.item(row, col) txt = item.text() self.settext(u'第%s行,第%s列 , 数据改变为:%s' % (row, col, txt)) def noframe(self): self.table.setAlternatingRowColors(True) self.table.setFrameStyle(QFrame.NoFrame) self.table.setStyleSheet('color:green;' 'gridline-color:white;' 'border:0px solid gray') self.settext(u'取消表的框线,\n 取消表格内框') def settext(self, txt): font = QFont(u'微软雅黑', 10) self.txt.setFont(font) self.txt.setText(txt)
class GameStatusView(QFrame): """ It's the game status view """ def __init__(self, level, width, height, parent=None): """ """ QFrame.__init__(self, parent) self.level = level self.setup() self.updateView() self.color = QColor(200, 200, 200) self.setStyleSheet("QFrame { background-color: %s }" % self.color.name()) self.resize(width, height) def setup(self): """ Setup the View """ self.setupFont() self.setupPowerLabel() self.setupMovesLabel() self.setupRemainingDefensesLabels() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(14) def setupPowerLabel(self): """ Setup the Power Label """ self.powerLabel = QLabel("", self) self.powerLabel.move(32, 16) self.powerLabel.setFont(self.font) def setupMovesLabel(self): """ Setup the Moves Label """ self.movesLabel = QLabel("", self) self.movesLabel.move(32, 16 + 48) self.movesLabel.setFont(self.font) def setupRemainingDefensesLabels(self): """ Setup the Remaining Defenses Labels """ self.remainingDefensesLabels = {} labelNumber = 1 remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = QLabel("", self) label.move(32, 16 + 48 * (labelNumber + 1)) label.setFont(self.font) self.remainingDefensesLabels[defenseClass] = label labelNumber += 1 def updateView(self): """ Update the View """ self.updatePowerLabel() self.updateMovesLabel() self.updateRemainingDefensesLabels() def updatePowerLabel(self): """ Update the Power Label """ self.powerLabel.setText("Power: {0}".format( self.level.drone.powerRating.power)) def updateMovesLabel(self): """ Update the Moves Label """ self.movesLabel.setText("Moves: {0}".format( self.level.moveRating.moveCount)) self.movesLabel.resize(self.movesLabel.contentsRect().width(), self.movesLabel.contentsRect().height()) def updateRemainingDefensesLabels(self): """ Update the Remaining Mines Label """ remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = self.remainingDefensesLabels[defenseClass] label.setText("{0} Left: {1}".format( defenseClass.friendlyName, remainingDefenses[defenseClass]))
class NewWindow(QWidget): def __init__(self, app=None): super(NewWindow, self).__init__() self.app = app glo = QVBoxLayout(self) icp = r_path(solve_path('static/images/favicon.png')) # need to used objective message boxs instead of functions to set font self.Arial = QFont("", 12, QFont.Bold) self.Arials = QFont("", 10, QFont.Bold) # Language support variable self.Language = 'en' self.Runningo = False icon = QIcon(icp) self.SelfIinit(icon) self.center() self.langsList(glo) self.set_Abutton(icp, glo) self.Lists(glo) self.Flabel(glo) self.set_button(glo) self.setLayout(glo) mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.activateWindow() self.show() def SelfIinit(self, icon): self.setWindowTitle('Free Queue Manager ' + version) self.setGeometry(300, 300, 200, 150) self.setMinimumWidth(500) self.setMaximumWidth(500) self.setMinimumHeight(400) self.setMaximumHeight(400) # Setting Icon self.setWindowIcon(icon) QToolTip.setFont(self.Arials) def Flabel(self, glo): fontt = self.Arial self.ic1 = QIcon(r_path(solve_path('static/images/pause.png'))) self.l = QLabel('Icond', self) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) self.l.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.l.setFont(fontt) self.t = QLabel('Texted', self) self.t.setText(self.getTrans('11')) self.t.setOpenExternalLinks(True) self.t.setAlignment(Qt.AlignCenter | Qt.AlignHCenter) self.t.setFont(fontt) self.t.setToolTip(self.getTrans('9')) self.l.setToolTip(self.getTrans('9')) glo.addStretch() glo.addWidget(self.l) glo.addWidget(self.t) glo.addStretch() def langsList(self, glo): self.langs = { # languages to be displayed in select 'en': 'English', 'ar': 'Arabic', 'fr': 'French', 'it': 'Italian', 'es': 'Spanish' } self.langs_list = QComboBox() self.langs_list.addItems(list(self.langs.values())) self.langs_list.setCurrentIndex(1) self.langs_list.setToolTip(self.getTrans('1')) self.langs_list.currentIndexChanged.connect(self.langChange) glo.addWidget(self.langs_list) def langChange (self): self.language = list(self.langs.keys())[self.langs_list.currentIndex()] self.langs_list.setToolTip(self.getTrans('1')) self.Amsgb = self.getTrans('2') self.abutton.setToolTip( self.getTrans('2') ) self.mbutton.setText(self.getTrans('3')) self.mbutton.setToolTip(self.getTrans('4')) self.mbutton2.setText(self.getTrans('5')) self.mbutton2.setToolTip(self.getTrans('6')) self.sl.setToolTip( self.getTrans('7') ) self.sl2.setToolTip(self.getTrans('8')) self.t.setToolTip(self.getTrans('9')) self.l.setToolTip(self.getTrans('9')) if self.Runningo: pp = self.slchange() addr = self.getTrans('10') addr += u"<a href='http://" addr += pp[1].split(',')[1] + u":" + pp[0] addr += u"'> http://" + pp[1].split(',')[1] + u":" + pp[0] addr += u"</a>" self.t.setText(addr) else: self.t.setText(self.getTrans('11')) def getTrans(self, index): lang = list(self.langs.keys())[self.langs_list.currentIndex()] try: return LANGUAGES[lang][index] except Exception: return None def Lists(self, glo): ips = self.get_ips() self.sl = QComboBox() self.sl.addItems(ips) self.sl.setToolTip(self.getTrans('7')) self.sl2 = QComboBox() self.get_ports() self.sl2.setToolTip('8') self.sl.currentIndexChanged.connect(self.get_ports) glo.addWidget(self.sl) glo.addWidget(self.sl2) def get_ports(self, nauto=True): d_ports = ['5000', '8080', '3000', '80', '9931'] m_ports = [] while len(m_ports) < 10: mip = self.slchange() for p in d_ports: s = socket(AF_INET, SOCK_STREAM) try: s.bind((mip[1].split(',')[1], int(p))) s.close() m_ports.append(p) except: s.close() d_ports.remove(p) s = socket(AF_INET, SOCK_STREAM) p = randint(1000, 9999) try: s.bind((mip[1].split(',')[1], p)) s.close() m_ports.append(str(p)) except: s.close() if len(m_ports) >= 10: break self.sl2.clear() self.sl2.addItems(m_ports) def slchange(self): return [self.sl2.currentText(), self.sl.currentText()] def set_button(self, glo): hlayout = QHBoxLayout() self.mbutton = QPushButton('Start', self) self.mbutton.clicked.connect(self.s_server) self.mbutton.setFont(self.Arials) self.mbutton.setIcon(QPixmap(r_path(solve_path('static/images/play.png')))) self.mbutton2 = QPushButton('Stop', self) self.mbutton2.clicked.connect(self.st_server) self.mbutton2.setIcon(QPixmap(r_path(solve_path('static/images/pause.png')))) self.mbutton.setToolTip(self.getTrans('4')) self.mbutton2.setToolTip(self.getTrans('6')) self.mbutton2.setEnabled(False) self.mbutton2.setFont(self.Arials) hlayout.addWidget(self.mbutton) hlayout.addWidget(self.mbutton2) glo.addLayout(hlayout) def s_server(self): mip = self.slchange() self.P = rwser(mip[1].split(',')[1], mip[0], self.app) self.P.setTerminationEnabled(True) if not self.P.isRunning(): try: self.pport = mip[0] self.mbutton.setEnabled(False) self.mbutton2.setEnabled(True) self.sl.setEnabled(False) self.sl2.setEnabled(False) self.ic1 = QIcon(r_path(solve_path('static/images/play.png'))) self.ic1 = self.ic1.pixmap(70, 70, QIcon.Active, QIcon.On) self.l.setPixmap(self.ic1) pp = self.slchange() addr = self.getTrans('10') addr += "<a href='http://" addr += pp[1].split(',')[1] + ":" + pp[0] addr += "'> http://" + pp[1].split(',')[1] + ":" + pp[0] addr += "</a>" self.t.setText(addr) self.t.setFont(self.Arial) self.P.start() self.Runningo = True except: self.eout() else: self.eout() def st_server(self): if self.P.isRunning(): try: if self.P.isRunning: self.P.stop() self.mbutton.setEnabled(True) self.mbutton2.setEnabled(False) self.sl.setEnabled(True) self.sl2.setEnabled(True) self.t.setText(self.getTrans('11')) # removing the last used port to avoid termination error cind = self.sl2.currentIndex() self.sl2.removeItem(cind) self.get_ports() self.Runningo = False except: self.eout() else: self.eout() def set_Abutton(self, icon, glo): def show_about(nself): Amsg = u" <center> " Amsg += self.getTrans('12') + version + u" " Amsg += self.getTrans('13') Amsg += self.getTrans('14') Amsg += self.getTrans('15') Amsg += u"<br> <b><a href='https://fqms.github.io/'>" Amsg += u"https://fqms.github.io </a> </b></center>" Amsgb = self.getTrans('2') return QMessageBox.about( self, Amsgb, Amsg) self.abutton = QPushButton('', self) self.abutton.setIcon(QPixmap(icon)) self.abutton.setIconSize(QSize(150, 70)) self.abutton.setToolTip(self.getTrans('2')) self.abutton.clicked.connect(partial(show_about, self)) glo.addWidget(self.abutton) def closeEvent(self, event=None): if self.Runningo: response = self.msgApp( self.getTrans('16'), self.getTrans('17')) if response == 'y': if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) else: if event is not None: event.ignore() else: if event is not None: event.accept() if self.P.isRunning(): self.P.stop() sys.exit(0) def msgApp(self, title, msg): uinfo = QMessageBox.question(self, title, msg, QMessageBox.Yes | QMessageBox.No) if uinfo == QMessageBox.Yes: return 'y' if uinfo == QMessageBox.No: return 'n' def eout(self): if self.P.isRunning(): self.P.stop() msgg = u"<center>" msgg += self.getTrans('18') msgg += self.getTrans('19') msgg += u"<br><b><a href='https://fqms.github.io/'> " msgg += u"https://fqms.github.io </a></b> </center>" mm = QMessageBox.critical( self, self.getTrans('20'), msgg, QMessageBox.Ok) def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def get_ips(self): il = [] for i in interfaces(): try: if os.name != 'nt': inf = i + " ," else: inf = ' ,' inf += ifaddresses(i)[2][0].get('addr') il.append(inf) except: pass return il
class MainWindow(QWidget): # noinspection PyUnresolvedReferences def __init__(self, clipboard): super().__init__() self.clipboard = clipboard self.setWindowIcon(QIcon('Logo_rendered_edited.png')) self.layout = QBoxLayout(QBoxLayout.TopToBottom, self) self.generator = CtSesam() self.iterations = 4096 # Master password self.master_password_label = QLabel("&Master-Passwort:") self.maser_password_edit = QLineEdit() self.maser_password_edit.setEchoMode(QLineEdit.EchoMode.Password) self.maser_password_edit.textChanged.connect(self.reset_iterations) self.maser_password_edit.returnPressed.connect(self.move_focus) self.maser_password_edit.setMaximumHeight(28) self.master_password_label.setBuddy(self.maser_password_edit) self.layout.addWidget(self.master_password_label) self.layout.addWidget(self.maser_password_edit) # Domain self.domain_label = QLabel("&Domain:") self.domain_edit = QLineEdit() self.domain_edit.textChanged.connect(self.reset_iterations) self.domain_edit.returnPressed.connect(self.move_focus) self.domain_edit.setMaximumHeight(28) self.domain_label.setBuddy(self.domain_edit) self.layout.addWidget(self.domain_label) self.layout.addWidget(self.domain_edit) # Username self.username_label = QLabel("&Username:"******"Sonderzeichen") self.special_characters_checkbox.setChecked(True) self.special_characters_checkbox.stateChanged.connect(self.reset_iterations) self.layout.addWidget(self.special_characters_checkbox) self.letters_checkbox = QCheckBox("Buchstaben") self.letters_checkbox.setChecked(True) self.letters_checkbox.stateChanged.connect(self.reset_iterations) self.layout.addWidget(self.letters_checkbox) self.digits_checkbox = QCheckBox("Zahlen") self.digits_checkbox.setChecked(True) self.digits_checkbox.stateChanged.connect(self.reset_iterations) self.layout.addWidget(self.digits_checkbox) # Length slider self.length_label = QLabel("&Länge:") self.length_display = QLabel() self.length_label_layout = QBoxLayout(QBoxLayout.LeftToRight) self.length_label_layout.addWidget(self.length_label) self.length_label_layout.addWidget(self.length_display) self.length_label_layout.addStretch() self.length_slider = QSlider(Qt.Horizontal) self.length_slider.setMinimum(4) self.length_slider.setMaximum(20) self.length_slider.setPageStep(1) self.length_slider.setValue(10) self.length_display.setText(str(self.length_slider.sliderPosition())) self.length_slider.valueChanged.connect(self.length_slider_changed) self.length_label.setBuddy(self.length_slider) self.layout.addLayout(self.length_label_layout) self.layout.addWidget(self.length_slider) # Button self.generate_button = QPushButton("Erzeugen") self.generate_button.clicked.connect(self.generate_password) self.generate_button.setAutoDefault(True) self.layout.addWidget(self.generate_button) # Password self.password_label = QLabel("&Passwort:") self.password = QLabel() self.password.setTextFormat(Qt.PlainText) self.password.setAlignment(Qt.AlignCenter) self.password.setFont(QFont("Helvetica", 18, QFont.Bold)) self.password_label.setBuddy(self.password) self.layout.addWidget(self.password_label) self.layout.addWidget(self.password) # Iteration display self.message_label = QLabel() self.message_label.setTextFormat(Qt.RichText) self.message_label.setVisible(False) self.layout.addWidget(self.message_label) # Window layout self.layout.addStretch() self.setGeometry(0, 30, 300, 400) self.setWindowTitle("c't SESAM") self.maser_password_edit.setFocus() self.show() def length_slider_changed(self): self.length_display.setText(str(self.length_slider.sliderPosition())) self.reset_iterations() def reset_iterations(self): self.iterations = 4096 self.message_label.setVisible(False) self.password.setText('') self.clipboard.setText('') def move_focus(self): line_edits = [self.maser_password_edit, self.domain_edit, self.username_edit] for i, edit in enumerate(line_edits): if edit.hasFocus() and i + 1 < len(line_edits): line_edits[i + 1].setFocus() return True self.generate_button.setFocus() def generate_password(self): if len(self.domain_edit.text()) <= 0: self.reset_iterations() self.message_label.setText( '<span style="font-size: 10px; color: #aa0000;">Bitte geben Sie eine Domain an.</span>') self.message_label.setVisible(True) return False if self.letters_checkbox.isChecked() or \ self.digits_checkbox.isChecked() or \ self.special_characters_checkbox.isChecked(): self.generator.set_password_characters( use_letters=self.letters_checkbox.isChecked(), use_digits=self.digits_checkbox.isChecked(), use_special_characters=self.special_characters_checkbox.isChecked()) else: self.reset_iterations() self.message_label.setText( '<span style="font-size: 10px; color: #aa0000;">Bei den aktuellen Einstellungen ' + 'kann kein Passwort berechnet werden.</span>') self.message_label.setVisible(True) return False password = self.generator.generate( master_password=self.maser_password_edit.text(), domain=self.domain_edit.text(), username=self.username_edit.text(), length=self.length_slider.sliderPosition(), iterations=self.iterations ) self.password.setText(password) self.password.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) self.clipboard.setText(password) self.message_label.setText( '<span style="font-size: 10px; color: #888888;">Das Passwort wurde ' + str(self.iterations) + ' mal gehasht <br />und in die Zwischenablage kopiert.</span>') self.message_label.setVisible(True) self.iterations += 1
class RadioApp(QWidget): def __init__(self): super().__init__() self.edit = False self.left_dock_create() self.middle_dock_create() self.right_dock_create() self.slotans_create() self.box = QHBoxLayout() self.box.addLayout(self.volbalayout) self.box.addLayout(self.middlelayout) self.box.addLayout(self.rightlayout) self.mainlayout = QVBoxLayout() self.mainlayout.addLayout(self.box) self.setLayout(self.mainlayout) def left_dock_create(self): self.statlabel = QLabel("RSSI: --") self.logolabel = QLabel() self.logolabel.setPixmap( QPixmap(os.path.join(script_path, "../assets/logo.png"))) self.statlabel.setFont(QFont("DejaVu Sans", 12)) self.btnvolba = [] for i in range(1, 5): self.btnvolba.append(QPushButton("Voľba {}".format(i))) self.presetaddbtn = QPushButton() self.presetaddbtn.setIcon(QIcon(QPixmap("../assets/add.png"))) self.volbalayout = QVBoxLayout() self.volbalayout.addWidget(self.logolabel) self.volbalayout.addWidget(self.statlabel) for btn in self.btnvolba: self.volbalayout.addWidget(btn) self.volbalayout.addWidget(self.presetaddbtn) def middle_dock_create(self): self.frekv = QLabel() self.frekv.setFont(QFont("DejaVu Sans", 26)) self.write_frekv() self.btnstepleft = QPushButton("<") self.btnseekdown = QPushButton("<<") self.btnseekup = QPushButton(">>") self.btnstepright = QPushButton(">") self.laybtnmv = QHBoxLayout() self.laybtnmv.addWidget(self.btnseekdown) self.laybtnmv.addWidget(self.btnstepleft) self.laybtnmv.addWidget(self.btnstepright) self.laybtnmv.addWidget(self.btnseekup) self.labelrdsdt = QLabel("RDS") self.labelrdsdt.setFont(QFont("DejaVu Sans", 12)) self.frekvlayout = QHBoxLayout() self.frekvlayout.addWidget(self.frekv) self.frekvlayout.setAlignment(Qt.AlignCenter) self.middlelayout = QVBoxLayout() self.middlelayout.addLayout(self.frekvlayout) self.middlelayout.addLayout(self.laybtnmv) self.middlelayout.addWidget(self.labelrdsdt) def right_dock_create(self): self.btnonoff = QPushButton("Reset") self.slidvol = QSlider(Qt.Vertical) self.slidvol.setMinimum(0) self.slidvol.setMaximum(100) self.slidvol.setValue(50) self.labspeaker = QLabel() self.labspeaker.setPixmap( QPixmap(os.path.join(script_path, "../assets/speaker.png"))) self.sndvolumelabel = QLabel() self.rightlayout = QVBoxLayout() self.rightlayout.addWidget(self.btnonoff) self.rightlayout.addWidget(self.slidvol) self.rightlayout.addWidget(self.sndvolumelabel) self.rightlayout.addWidget(self.labspeaker) def slotans_create(self): self.slidvol.valueChanged.connect(self.set_radiovolume) self.btnstepleft.clicked.connect(lambda: self.step_frekv("d")) self.btnstepright.clicked.connect(lambda: self.step_frekv("u")) self.btnseekdown.clicked.connect(lambda: self.set_seek("d")) self.btnseekup.clicked.connect(lambda: self.set_seek("u")) self.presetaddbtn.clicked.connect(self.preset_editmode) self.btnonoff.clicked.connect(self.reset_radio) for btn in self.btnvolba: btn.clicked.connect(self.preset_choose) self.timerrssi = QTimer() self.timerrssi.timeout.connect(self.write_stats) self.timerrssi.start(3000) # ms def reset_radio(self): dev_radio.shutdown() dev_radio.poweron() def preset_editmode(self): if self.edit == True: # Chceme sa vrátiť do normálneho režimu -> zvrátime editačný for btn in self.btnvolba: btn.setStyleSheet("") btn.clicked.disconnect() btn.clicked.connect(self.preset_choose) else: # Vstupujeme do editačného režimu for btn in self.btnvolba: btn.setStyleSheet("background-color: #30f030;") btn.clicked.disconnect() btn.clicked.connect(self.preset_set) self.edit = not self.edit def preset_set(self): button = self.sender() if isinstance(button, QPushButton): button.setText("{:.2f}".format(dev_radio.getfrequency() / 100)) self.preset_editmode() def preset_choose(self): button = self.sender() if isinstance(button, QPushButton): try: frekv = int(float(button.text()) * 100) except ValueError: return dev_radio.setfrequency(frekv) self.write_frekv() def preset_save(self): with open("preset.txt", mode="w") as fw: for btn in self.btnvolba: try: fw.write("{},".format(int(float(btn.text()) * 100))) except ValueError: fw.write(" ,") def preset_restore(self): try: fr = open("preset.txt", mode="r") pres_list = fr.read().split(",") except FileNotFoundError: return fr.close() if len(pres_list) - 1 < len(self.btnvolba): print("Chyba: Zoznam predvolieb je krátky") return for i, btn in enumerate(self.btnvolba): try: btn.setText("{:.2f}".format(int(pres_list[i]) / 100)) except ValueError: continue def set_seek(self, direction): if direction == "u": dev_radio.seekup() elif direction == "d": dev_radio.seekdown() self.write_frekv() def step_frekv(self, direction): curr_frekv = dev_radio.getfrequency() if direction == "u": curr_frekv += 10 if curr_frekv > dev_radio.freqhigh: curr_frekv = dev_radio.freqlow elif direction == "d": curr_frekv -= 10 if curr_frekv < dev_radio.freqlow: curr_frekv = dev_radio.freqhigh dev_radio.setfrequency(curr_frekv) self.write_frekv() def write_frekv(self): self.frekv.setText("<b>{:.2f} MHz</b>".format( dev_radio.getfrequency() / 100)) def write_stats(self): self.statlabel.setText("<b>RSSI: {}</b>".format(dev_radio.getrssi())) def set_radiovolume(self): vol_percent = self.slidvol.value() self.sndvolumelabel.setText("{}%".format(vol_percent)) new_volume = int(map_range(vol_percent, 0, 100, 0, 15)) dev_radio.setvolume(new_volume) def rds_psshow(self, station): print("Stanica: {}".format(station)) def rds_txtshow(self, text): print("Text: {}".format(text)) def rds_tmshow(self, hodiny, minuty): print("{}:{}".format(hodiny, minuty))
def initUI(self): self.setWindowTitle(self.title) self.setGeometry(self.left, self.top, self.width, self.height) # Select analysis file button button = QPushButton('Select analysis file', self) button.setFont(QFont('Arial', 8)) button.setToolTip('*.inp CalculiX analysis file.') button.move(10, 10) button.clicked.connect(self.on_click) # Text box - file path and name self.textbox_file_name = QLineEdit(self) self.textbox_file_name.move(120, 15) self.textbox_file_name.resize(420, 20) self.textbox_file_name.setText("None analysis file selected") self.textbox_file_name.setFont(QFont('Arial', 8)) self.textbox_file_name.setToolTip('Analysis file.') # Update button button1 = QPushButton('Update domains', self) button1.setFont(QFont('Arial', 8)) button1.setToolTip('Update naming inputs and material data from FreeCAD.') button1.move(10, 50) button1.clicked.connect(self.on_click1) # Domains definition # Label above domains definition label21 = QLabel('Domain 0', self) label21.setFont(QFont('Arial', 10)) label21.setStyleSheet("font-weight: bold") label21.move(120, 50) label22 = QLabel('Domain 1', self) label22.setFont(QFont('Arial', 10)) label22.setStyleSheet("font-weight: bold") label22.move(260, 50) label23 = QLabel('Domain 2', self) label23.setFont(QFont('Arial', 10)) label23.setStyleSheet("font-weight: bold") label23.move(400, 50) label24 = QLabel('Material object', self) label24.setFont(QFont('Arial', 8)) label24.move(20, 80) label25 = QLabel('Thickness object', self) label25.setFont(QFont('Arial', 8)) label25.move(20, 110) label26 = QLabel('As design domain', self) label26.setFont(QFont('Arial', 8)) label26.move(20, 140) label27 = QLabel('Stress limit [MPa]', self) label27.setFont(QFont('Arial', 8)) label27.move(20, 170) # Combo box - select domain by material object self.combo = QComboBox(self) self.combo.setFont(QFont('Arial', 8)) self.combo.setToolTip('Material object to define the domain.') self.combo.move(120, 80) self.combo.resize(140, 30) self.combo.currentIndexChanged.connect(self.on_change) self.combo1 = QComboBox(self) self.combo1.setFont(QFont('Arial', 8)) self.combo1.setToolTip('Material object to define the domain.') self.combo1.move(260, 80) self.combo1.resize(140, 30) self.combo1.currentIndexChanged.connect(self.on_change1) self.combo2 = QComboBox(self) self.combo2.setFont(QFont('Arial', 8)) self.combo2.setToolTip('Material object to define the domain.') self.combo2.move(400, 80) self.combo2.resize(140, 30) self.combo2.currentIndexChanged.connect(self.on_change2) # Combo box - select thickness object self.combo0t = QComboBox(self) self.combo0t.setFont(QFont('Arial', 8)) self.combo0t.setToolTip('Thickness object to specify if domain is for shells.') self.combo0t.move(120, 110) self.combo0t.resize(140, 30) self.combo1t = QComboBox(self) self.combo1t.setFont(QFont('Arial', 8)) self.combo1t.setToolTip('Thickness object to specify if domain is for shells.') self.combo1t.move(260, 110) self.combo1t.resize(140, 30) self.combo2t = QComboBox(self) self.combo2t.setFont(QFont('Arial', 8)) self.combo2t.setToolTip('Thickness object to specify if domain is for shells.') self.combo2t.move(400, 110) self.combo2t.resize(140, 30) self.textbox3 = QLineEdit(self) self.textbox3.setFont(QFont('Arial', 8)) self.textbox3.move(120, 170) self.textbox3.resize(40, 20) # self.textbox3.setText("") self.textbox3.setToolTip('Thickness [mm] of shell elements in the domain.\n' 'This value overwrites thickness defined in FreeCAD') self.textbox4 = QLineEdit(self) self.textbox4.setFont(QFont('Arial', 8)) self.textbox4.move(260, 170) self.textbox4.resize(40, 20) # self.textbox4.setText("") self.textbox4.setToolTip('Thickness [mm] of shell elements in the domain.\n' 'This value overwrites thickness defined in FreeCAD') self.textbox5 = QLineEdit(self) self.textbox5.setFont(QFont('Arial', 8)) self.textbox5.move(400, 170) self.textbox5.resize(40, 20) # self.textbox5.setText("") self.textbox5.setToolTip('Thickness [mm] of shell elements in the domain.\n' 'This value overwrites thickness defined in FreeCAD') # Check box - design or nondesign self.checkbox = QCheckBox('', self) self.checkbox.setChecked(True) self.checkbox.setToolTip('Check to be the design domain.') self.checkbox.move(120, 140) self.checkbox1 = QCheckBox('', self) self.checkbox1.setChecked(True) self.checkbox1.setToolTip('Check to be the design domain.') self.checkbox1.move(260, 140) self.checkbox2 = QCheckBox('', self) self.checkbox2.setChecked(True) self.checkbox2.setToolTip('Check to be the design domain.') self.checkbox2.move(400, 140) # Text box - stress limit self.textbox = QLineEdit(self) self.textbox.setFont(QFont('Arial', 8)) self.textbox.move(120, 170) self.textbox.resize(40, 20) # self.textbox.setText("") self.textbox.setToolTip('Von Mises stress [MPa] limit, when reached, material removing will stop.') self.textbox1 = QLineEdit(self) self.textbox1.setFont(QFont('Arial', 8)) self.textbox1.move(260, 170) self.textbox1.resize(40, 20) # self.textbox1.setText("") self.textbox1.setToolTip('Von Mises stress [MPa] limit, when reached, material removing will stop.') self.textbox2 = QLineEdit(self) self.textbox2.setFont(QFont('Arial', 8)) self.textbox2.move(400, 170) self.textbox2.resize(40, 20) # self.textbox2.setText("") self.textbox2.setToolTip('Von Mises stress [MPa] limit, when reached, material removing will stop.') # Filters # Label above filter definition label31 = QLabel('Filter 0', self) label31.setFont(QFont('Arial', 10)) label31.setStyleSheet("font-weight: bold") label31.move(120, 220) label32 = QLabel('Filter 1', self) label32.setFont(QFont('Arial', 10)) label32.setStyleSheet("font-weight: bold") label32.move(260, 220) label33 = QLabel('Filter 2', self) label33.setFont(QFont('Arial', 10)) label33.setStyleSheet("font-weight: bold") label33.move(400, 220) label34 = QLabel('Type', self) label34.setFont(QFont('Arial', 8)) label34.move(20, 240) label35 = QLabel('Range [mm]', self) label35.setFont(QFont('Arial', 8)) label35.move(20, 270) label36 = QLabel('Direction vector', self) label36.setFont(QFont('Arial', 8)) label36.move(20, 300) label37 = QLabel('Apply to', self) label37.setFont(QFont('Arial', 8)) label37.move(20, 330) # Combo box - select filter type self.combo6 = QComboBox(self) self.combo6.setFont(QFont('Arial', 8)) self.combo6.setToolTip('Filters:\n' '"simple" to suppress checkerboard effect,\n' '"casting" to prescribe casting direction (opposite to milling direction)\n' 'Recommendation: for casting use as first "casting" and as second "simple"') self.combo6.addItem("None") self.combo6.addItem("simple") self.combo6.addItem("casting") self.combo6.setCurrentIndex(1) self.combo6.move(120, 240) self.combo6.currentIndexChanged.connect(self.on_change6) self.combo7 = QComboBox(self) self.combo7.setFont(QFont('Arial', 8)) self.combo7.setToolTip('Filters:\n' '"simple" to suppress checkerboard effect,\n' '"casting" to prescribe casting direction (opposite to milling direction)\n' 'Recommendation: for casting use as first "casting" and as second "simple"') self.combo7.addItem("None") self.combo7.addItem("simple") self.combo7.addItem("casting") self.combo7.move(260, 240) self.combo7.currentIndexChanged.connect(self.on_change7) self.combo8 = QComboBox(self) self.combo8.setFont(QFont('Arial', 8)) self.combo8.setToolTip('Filters:\n' '"simple" to suppress checkerboard effect,\n' '"casting" to prescribe casting direction (opposite to milling direction)\n' 'Recommendation: for casting use as first "casting" and as second "simple"') self.combo8.addItem("None") self.combo8.addItem("simple") self.combo8.addItem("casting") self.combo8.move(400, 240) self.combo8.currentIndexChanged.connect(self.on_change8) # Combo box - select filter range self.combo6r = QComboBox(self) self.combo6r.setFont(QFont('Arial', 8)) self.combo6r.setToolTip('auto - automatically calculates element size and uses two times for the filter range' '\n') self.combo6r.addItem("auto") self.combo6r.addItem("manual") self.combo6r.move(120, 270) self.combo6r.currentIndexChanged.connect(self.on_change6r) self.combo7r = QComboBox(self) self.combo7r.setFont(QFont('Arial', 8)) self.combo7r.setEnabled(False) self.combo7r.setToolTip('auto - automatically calculates element size and uses two times for the filter range' '\n') self.combo7r.addItem("auto") self.combo7r.addItem("manual") self.combo7r.move(260, 270) self.combo7r.currentIndexChanged.connect(self.on_change7r) self.combo8r = QComboBox(self) self.combo8r.setFont(QFont('Arial', 8)) self.combo8r.setEnabled(False) self.combo8r.setToolTip('auto - automatically calculates element size and uses two times for the filter range' '\n') self.combo8r.addItem("auto") self.combo8r.addItem("manual") self.combo8r.move(400, 270) self.combo8r.currentIndexChanged.connect(self.on_change8r) # Text box - filter range self.textbox6 = QLineEdit(self) self.textbox6.setFont(QFont('Arial', 8)) self.textbox6.move(190, 270) self.textbox6.resize(50, 20) self.textbox6.setText("0.") self.textbox6.setEnabled(False) self.textbox6.setToolTip('Manual filter range [mm], \n' 'recommended two times mesh size.') self.textbox7 = QLineEdit(self) self.textbox7.setFont(QFont('Arial', 8)) self.textbox7.move(330, 270) self.textbox7.resize(50, 20) self.textbox7.setText("0.") self.textbox7.setEnabled(False) self.textbox7.setToolTip('Manual filter range [mm], \n' 'recommended two times mesh size.') self.textbox7.setEnabled(False) self.textbox8 = QLineEdit(self) self.textbox8.setFont(QFont('Arial', 8)) self.textbox8.move(470, 270) self.textbox8.resize(50, 20) self.textbox8.setText("0.") self.textbox8.setEnabled(False) self.textbox8.setToolTip('Manual filter range [mm], \n' 'recommended two times mesh size.') self.textbox8.setEnabled(False) # Text box - casting direction self.textbox9 = QLineEdit(self) self.textbox9.setFont(QFont('Arial', 8)) self.textbox9.move(120, 300) self.textbox9.resize(80, 20) self.textbox9.setText("0, 0, 1") self.textbox9.setEnabled(False) self.textbox9.setToolTip('Casting direction vector, e.g. direction in z axis:\n' '0, 0, 1\n\n' 'solid void\n' 'XXXXXX.................\n' 'XXX........................\n' 'XX........................... --> z axis\n' 'XXXXX....................\n' 'XXXXXXXXXXX......') self.textbox10 = QLineEdit(self) self.textbox10.setFont(QFont('Arial', 8)) self.textbox10.move(260, 300) self.textbox10.resize(80, 20) self.textbox10.resize(80, 20) self.textbox10.setText("0, 0, 1") self.textbox10.setEnabled(False) self.textbox10.setToolTip('Casting direction vector, e.g. direction in z axis:\n' '0, 0, 1\n\n' 'solid void\n' 'XXXXXX.................\n' 'XXX........................\n' 'XX........................... --> z axis\n' 'XXXXX....................\n' 'XXXXXXXXXXX......') self.textbox11 = QLineEdit(self) self.textbox11.setFont(QFont('Arial', 8)) self.textbox11.move(400, 300) self.textbox11.resize(80, 20) self.textbox11.setText("0, 0, 1") self.textbox11.setEnabled(False) self.textbox11.setToolTip('Casting direction vector, e.g. direction in z axis:\n' '0, 0, 1\n\n' 'solid void\n' 'XXXXXX.................\n' 'XXX........................\n' 'XX........................... --> z axis\n' 'XXXXX....................\n' 'XXXXXXXXXXX......') # list widget - select domains self.widget = QListWidget(self) self.widget.setFont(QFont('Arial', 8)) self.widget.setToolTip('Domains affected by the filter.\n' 'Select only from domains which you defined above.') self.widget.move(120, 330) self.widget.resize(140, 120) self.widget.setSelectionMode(QAbstractItemView.MultiSelection) self.widget1 = QListWidget(self) self.widget1.setFont(QFont('Arial', 8)) self.widget1.setToolTip('Domains affected by the filter.\n' 'Select only from domains which you defined above.') self.widget1.move(260, 330) self.widget1.resize(140, 120) self.widget1.setSelectionMode(QAbstractItemView.MultiSelection) self.widget1.setEnabled(False) self.widget2 = QListWidget(self) self.widget2.setFont(QFont('Arial', 8)) self.widget2.setToolTip('Domains affected by the filter.\n' 'Select only from domains which you defined above.') self.widget2.move(400, 330) self.widget2.resize(140, 120) self.widget2.setSelectionMode(QAbstractItemView.MultiSelection) self.widget2.setEnabled(False) # Other settings label40 = QLabel('Other settings', self) label40.setFont(QFont('Arial', 10)) label40.setStyleSheet("font-weight: bold") label40.move(10, 470) # AR, RR slider label41 = QLabel('Change per iteration: low', self) label41.setFont(QFont('Arial', 8)) label41.setFixedWidth(160) label41.move(10, 500) label42 = QLabel('high', self) label42.setFont(QFont('Arial', 8)) label42.move(240, 500) self.slider = QSlider(Qt.Horizontal, self) self.slider.setRange(1, 3) self.slider.setSingleStep(1) self.slider.setValue(2) self.slider.move(150, 500) self.slider.resize(80, 30) self.slider.setToolTip('Sets mass change per iteration, which is controlled as\n' 'slow: mass_addition_ratio=0.01, mass_removal_ratio=0.02\n' 'middle: mass_addition_ratio=0.015, mass_removal_ratio=0.03\n' 'fast: mass_addition_ratio=0.03, mass_removal_ratio=0.06') # optimization base combobox label51 = QLabel('Optimization base', self) label51.setFont(QFont('Arial', 8)) label51.move(10, 530) self.combo51 = QComboBox(self) self.combo51.setFont(QFont('Arial', 8)) self.combo51.setToolTip('Basic principle to determine if element should remain or be removed:\n' '"stiffness" to maximize stiffness (minimize compliance),\n' '"heat" to maximize heat flow.') self.combo51.addItem("stiffness") self.combo51.addItem("heat") self.combo51.move(120, 530) # mass goal ratio label52 = QLabel('Mass goal ratio', self) label52.setFont(QFont('Arial', 8)) label52.move(10, 560) self.textbox52 = QLineEdit(self) self.textbox52.setFont(QFont('Arial', 8)) self.textbox52.move(120, 560) self.textbox52.resize(50, 20) self.textbox52.setText("0.4") self.textbox52.setToolTip('Fraction of all design domains masses to be achieved;\n' 'between 0 and 1.') # generate conf. file button button21 = QPushButton('Generate conf. file', self) button21.setFont(QFont('Arial', 8)) button21.setToolTip('Writes configuration file with optimization parameters.') button21.move(10, 600) button21.clicked.connect(self.on_click21) button21.setFont(QFont('Arial', 8)) # edit conf. file button button22 = QPushButton('Edit conf. file', self) button22.setFont(QFont('Arial', 8)) button22.setToolTip('Opens configuration file for hand modifications.') button22.move(10, 630) button22.clicked.connect(self.on_click22) # run optimization button button23 = QPushButton('Run optimization', self) button23.setFont(QFont('Arial', 8)) button23.setToolTip('Writes configuration file and runs optimization.') button23.move(10, 660) button23.clicked.connect(self.on_click23) # generate conf file and run optimization button button24 = QPushButton('Generate conf.\nfile and run\noptimization', self) button24.setFont(QFont('Arial', 8)) button24.setToolTip('Writes configuration file and runs optimization.') button24.move(120, 600) button24.resize(100, 90) button24.clicked.connect(self.on_click24) # help buttons label41 = QLabel('Help', self) label41.setFont(QFont('Arial', 10)) label41.setStyleSheet("font-weight: bold") label41.move(440, 560) button31 = QPushButton('Example', self) button31.setFont(QFont('Arial', 8)) button31.setToolTip('https://github.com/fandaL/beso/wiki/Example-4:-GUI-in-FreeCAD') button31.move(440, 590) # button31.resize(80, 50) button31.clicked.connect(self.on_click31) button32 = QPushButton('Conf. comments', self) button32.setFont(QFont('Arial', 8)) button32.setToolTip('https://github.com/fandaL/beso/blob/master/beso_conf.py') button32.move(440, 620) # button32.resize(80, 50) button32.clicked.connect(self.on_click32) button33 = QPushButton('Close', self) button33.setFont(QFont('Arial', 8)) button33.move(440, 690) # button33.resize(80, 50) button33.clicked.connect(self.on_click33) # open log file button40 = QPushButton('Open log file', self) button40.setFont(QFont('Arial', 8)) button40.setToolTip('Opens log file in your text editor.\n' '(Does not refresh automatically.)') button40.move(10, 690) button40.clicked.connect(self.on_click40) self.on_click1() # first update self.show()
class LoginView(View): """`View` derived class. Defines the log in widget""" login = Signal(( str, str, str, bool, )) def __init__(self, parent=None): """ Init method. Initializes parent classes :param parent: Reference to a `QWidget` object to be used as parent """ super(LoginView, self).__init__(parent) self.createWidgets() self.createLayouts() self.setFixedSize(250, 340) def createLayouts(self): """Put widgets into layouts, thus creating the widget""" mainLayout = QHBoxLayout() fieldsLayout = QVBoxLayout() ftpInfoLayout = QHBoxLayout() buttonLayout = QHBoxLayout() mainLayout.addStretch(20) fieldsLayout.addStretch(80) fieldsLayout.addWidget(self.linkLabel) fieldsLayout.addWidget(self.line) fieldsLayout.addStretch(20) ftpInfoLayout.addWidget(self.hostLabel, 50, Qt.AlignLeft) ftpInfoLayout.addStretch(20) ftpInfoLayout.addWidget(self.sslLabel, 20, Qt.AlignRight) ftpInfoLayout.addWidget(self.sslCheck, 10, Qt.AlignRight) fieldsLayout.addLayout(ftpInfoLayout) fieldsLayout.addWidget(self.hostEdit) fieldsLayout.addWidget(self.usernameLabel) fieldsLayout.addWidget(self.usernameEdit) fieldsLayout.addWidget(self.passwdLabel) fieldsLayout.addWidget(self.passwdEdit) fieldsLayout.addStretch(30) buttonLayout.addStretch(50) buttonLayout.addWidget(self.loginButton, 50, Qt.AlignRight) fieldsLayout.addLayout(buttonLayout) fieldsLayout.addStretch(20) mainLayout.addLayout(fieldsLayout, 30) mainLayout.addStretch(20) self.setLayout(mainLayout) def createWidgets(self): """Create children widgets needed by this view""" fieldsWidth = 200 labelsFont = View.labelsFont() editsFont = View.editsFont() self.setLogo() self.hostLabel = QLabel(self) self.hostEdit = QLineEdit(self) self.sslLabel = QLabel(self) self.sslCheck = QCheckBox(self) self.hostLabel.setText('FTP Location') self.hostLabel.setFont(labelsFont) self.hostEdit.setFixedWidth(fieldsWidth) self.hostEdit.setFont(editsFont) self.sslLabel.setText('SSL') self.sslLabel.setFont(labelsFont) self.usernameLabel = QLabel(self) self.usernameEdit = QLineEdit(self) self.usernameLabel.setText('Username') self.usernameLabel.setFont(labelsFont) self.usernameEdit.setFixedWidth(fieldsWidth) self.usernameEdit.setFont(editsFont) self.passwdLabel = QLabel(self) self.passwdEdit = QLineEdit(self) self.passwdLabel.setText('Password') self.passwdLabel.setFont(labelsFont) self.passwdEdit.setFixedWidth(fieldsWidth) self.passwdEdit.setEchoMode(QLineEdit.Password) self.passwdEdit.setFont(editsFont) self.passwdEdit.returnPressed.connect(self.onLoginClicked) self.loginButton = QPushButton(self) self.loginButton.setText('Login') self.loginButton.setFont(labelsFont) self.loginButton.setFixedWidth(fieldsWidth / 2) self.loginButton.clicked.connect(self.onLoginClicked) # Sets previously stored values into the fields, if any settings = get_settings() self.hostEdit.setText(settings.value(SettingsKeys['host'], '')) self.usernameEdit.setText(settings.value(SettingsKeys['username'], '')) self.passwdEdit.setText( crypt.decrypt(settings.value(SettingsKeys['passwd'], ''))) # Unicode to boolean conversion ssl = settings.value(SettingsKeys['ssl'], u'true') ssl = True if ssl == u'true' else False self.sslCheck.setChecked(ssl) @Slot() def onLoginClicked(self): """ Slot. Called on the user clicks on the `loginButton` button """ # Takes out the user input from the fields host = self.hostEdit.text() username = self.usernameEdit.text() passwd = self.passwdEdit.text() ssl = self.sslCheck.isChecked() print 'Logging in: %s, %s, %s' % (host, username, '*' * len(passwd)) if len(host) > 0: # If the fields are valid, store them using a `QSettings` object # and triggers a log in request settings = get_settings() settings.setValue(SettingsKeys['host'], host) settings.setValue(SettingsKeys['username'], username) settings.setValue(SettingsKeys['passwd'], crypt.encrypt(passwd)) settings.setValue(SettingsKeys['ssl'], ssl) self.setEnabled(False) self.login.emit(host.strip(), username, passwd, ssl) @Slot() def onFailedLogIn(self): """ Slot. Called when the log in request fails """ # Enables the fields again for user input self.setEnabled(True)
class SyncView(View): """`View` derived class. Defines the sync widget""" sync = Signal((str,)) def __init__(self, parent=None): """ Init method. Initializes parent classes :param parent: Reference to a `QWidget` object to be used as parent """ super(SyncView, self).__init__(parent) self.createWidgets() self.createLayouts() self.setFixedSize(580, 340) self.status.setMessage('Ready') def createLayouts(self): """Put widgets into layouts, thus creating the widget""" mainLayout = QHBoxLayout() fieldsLayout = QVBoxLayout() pathLayout = QHBoxLayout() buttonLayout = QHBoxLayout() mainLayout.addStretch(10) fieldsLayout.addStretch(50) fieldsLayout.addWidget(self.linkLabel) fieldsLayout.addWidget(self.line) fieldsLayout.addWidget(self.localdirLabel) pathLayout.addWidget(self.localdirEdit) pathLayout.addWidget(self.browseButton) fieldsLayout.addLayout(pathLayout) buttonLayout.addStretch(50) buttonLayout.addWidget(self.syncButton, 50, Qt.AlignRight) fieldsLayout.addLayout(buttonLayout) fieldsLayout.addStretch(10) fieldsLayout.addWidget(self.statusLabel) fieldsLayout.addWidget(self.status) fieldsLayout.addStretch(80) mainLayout.addLayout(fieldsLayout, 60) mainLayout.addStretch(10) self.setLayout(mainLayout) def createWidgets(self): """Create children widgets needed by this view""" fieldsWidth = 450 labelsFont = View.labelsFont() editsFont = View.editsFont() self.setLogo() self.localdirLabel = QLabel(self) self.localdirEdit = QLineEdit(self) self.localdirLabel.setText('Choose a folder') self.localdirLabel.setFont(labelsFont) self.localdirEdit.setFixedWidth(fieldsWidth) self.localdirEdit.setReadOnly(False) self.localdirEdit.setFont(editsFont) self.browseButton = QPushButton(self) self.browseButton.setText('Browse') self.browseButton.setFont(labelsFont) self.syncButton = QPushButton(self) self.syncButton.setText('Sync') self.syncButton.setFont(labelsFont) self.browseButton.clicked.connect(self.onBrowseClicked) self.syncButton.clicked.connect(self.onSyncClicked) settings = get_settings() self.localdirEdit.setText(settings.value(SettingsKeys['localdir'], '')) self.statusLabel = QLabel(self) self.statusLabel.setText('Status') self.statusLabel.setFont(View.labelsFont()) self.status = StatusArea(self) @Slot() def onBrowseClicked(self): """Slot. Called when the user clicks on the `browseButton` button""" # Presents the user with a native directory selector window localdir = QFileDialog.getExistingDirectory() localdir = QDir.fromNativeSeparators(localdir) if len(localdir) > 0: # If `localdir`'s value is good, store it using a `QSettings` object # and triggers a sync request. # Careful with '\' separators on Windows. localdir = QDir.toNativeSeparators(localdir) get_settings().setValue(SettingsKeys['localdir'], localdir) self.localdirEdit.setText(localdir) @Slot() def onSyncClicked(self): """Slot. Called when the user clicks on the `syncButton` button""" localdir = self.localdirEdit.text() if len(localdir) > 0: self.syncButton.setEnabled(False) self.sync.emit(localdir)
class SymbolWort(QWidget): def __init__(self): QWidget.__init__(self) self.setWindowTitle("Symbol-Worte") self.thread=MyWorker(self) self.thread.start() self.thread.calculator.calculationDone.connect(self.calculationDone) self.initUI() def about(self): QMessageBox.information(self,u"Über Symbol-Worte",u"Symbol-Worte ist ein kleines, zum Spaß entwickeltes, Programm. Es nutzt die Open-Source Entwicklungsumgebung Python (www.python.org) und PySide (Qt-Schnittstelle). Es ist unter GPL v.3 veröffentlicht. Entwickelt von Peter Waldert.") def update(self): text=self.lineEdit.text() if text.lower() != self.responseLabel.text().lower(): self.thread.startCalculation(text) def calculationDone(self,ok): if ok: self.responseLabel.setText(self.thread.calculator.result) else: self.responseLabel.setText(u"Keine Treffer") self.updateTable(self.thread.calculator.resultElements) def updateAuto(self,checked): if checked: self.lineEdit.textEdited.connect(self.update) else: self.lineEdit.textEdited.disconnect(self.update) def updateMaxLength(self,checked): if checked: self.lineEdit.setMaxLength(10) else: self.lineEdit.setMaxLength(100) def setupTable(self): self.tableWidget.setColumnCount(3) self.tableWidget.setHorizontalHeaderLabels(["OZ","Sym","Name"]) self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows) self.tableWidget.setSelectionMode(QTableWidget.SingleSelection) self.tableWidget.setEditTriggers(QTableWidget.NoEditTriggers) self.tableWidget.setAlternatingRowColors(True) def updateTable(self,elements): self.tableWidget.clearContents() self.tableWidget.setRowCount(len(elements)) row=0 for element in elements: self.tableWidget.setItem(row,0,QTableWidgetItem(str(element.atomicNumber))) self.tableWidget.setItem(row,1,QTableWidgetItem(elements[row].symbol)) self.tableWidget.setItem(row,2,QTableWidgetItem(elements[row].name)) row+=1 self.tableWidget.resizeColumnsToContents() def initUI(self): wordLabel=QLabel("&Wort:") responseLabel=QLabel("Symbol-Wort:") progressLabel=QLabel("Rechen-Fortschritt:") self.lineEdit=QLineEdit() self.updateButton=QPushButton("&Berechnen") self.autoUpdate=QCheckBox("&Auto-Berechnung") self.responseLabel=QLabel() wordLabel.setBuddy(self.lineEdit) self.tableWidget=QTableWidget() self.progressView=ProgressView() self.disableMaxLengthAction=QAction("Zeichenmaximum (Achtung!)",self) self.disableMaxLengthAction.setCheckable(True) self.disableMaxLengthAction.toggled.connect(self.updateMaxLength) self.disableMaxLengthAction.setChecked(True) self.setupTable() self.progressView.setProgress(self.thread.calculator.progress) self.progressView.abortButton.setIcon(QIcon.fromTheme("process-stopp",QIcon("Abort.png"))) self.progressView.abortButton.setToolTip("Stoppe die Berechnung") self.lineEdit.setValidator(QRegExpValidator(QRegExp("[A-Za-z]+"))) self.lineEdit.setToolTip("Nur Zeichen von A-Z") self.lineEdit.setContextMenuPolicy(Qt.ActionsContextMenu) self.lineEdit.addAction(self.disableMaxLengthAction) self.responseLabel.setSizePolicy(QSizePolicy.Preferred,QSizePolicy.Fixed) self.responseLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken) self.aboutButton=QPushButton(u"Über") f=self.responseLabel.font() f.setPointSize(24) self.responseLabel.setFont(f) self.lineEdit.returnPressed.connect(self.update) self.updateButton.clicked.connect(self.update) self.autoUpdate.stateChanged.connect(self.updateAuto) self.aboutButton.clicked.connect(self.about) layout=QGridLayout() layout.addWidget(wordLabel,0,0) layout.addWidget(self.lineEdit,0,1) layout.addWidget(self.updateButton,0,2) layout.addWidget(self.autoUpdate,1,1,1,2) layout.addWidget(responseLabel,2,0) layout.addWidget(self.responseLabel,2,1,1,2) layout.addWidget(self.tableWidget,3,0,1,3) layout.addWidget(progressLabel,4,0) layout.addWidget(self.progressView,5,0,1,3) layout.addWidget(self.aboutButton,6,2) self.setLayout(layout) def closeEvent(self,event): self.thread.quit() self.thread.wait() event.accept() def keyPressEvent(self,event): if event.key() == Qt.Key_Escape: self.thread.calculator.progress.abort() event.accept() else: event.ignore()
class SafeLock(QWidget): def __init__(self): super(SafeLock, self).__init__() main_layout = QVBoxLayout(self) self.Version = '0.5 beta' self.s_error = "QStatusBar{color:red;font-weight:1000;}" self.s_loop = "QStatusBar{color:black;font-weight:1000;}" self.s_norm = "QStatusBar{color:blue;font-style:italic;" self.s_norm += "font-weight:500;}" self.Processing = None self.CP = None self.PPbar = None self.key = None self.DFiles = [] self.picon = r_path("images/favicon.png") self.plogo = r_path("images/logo.png") if name == 'nt': self.picon = r_path("images\\favicon.png") self.plogo = r_path("images\\logo.png") self.icon = QIcon(self.picon) self.logo = QIcon(self.plogo) self.center() self.setStyle() self.setMW(main_layout) self.setSB(main_layout) self.show() def db(self, password="******", dbname="untitled.sld", dc=True): eng = create_engine("sqlite:///%s" % dbname, connect_args={'check_same_thread': False}) Base = declarative_base(bind=eng) Session = sessionmaker(bind=eng) session = Session() class Identifier(Base): __tablename__ = "identifier" id = Column(Integer, primary_key=True) version = Column(Binary) kvd = Column(Binary) def __init__(self, version, kvd): self.id = 0 self.version = version self.kvd = kvd class Folder(Base): __tablename__ = 'folders' id = Column(Integer, primary_key=True) path = Column(Unicode) def __init__(self, path="Empty"): self.path = path class File(Base): __tablename__ = 'files' id = Column(Integer, primary_key=True) name = Column(String) f_id = Column(Integer, ForeignKey('folders.id'), nullable=True) bb = Column(Binary) def __init__(self, name="empty", f_id=0, bb=1010): self.name = name self.f_id = f_id self.bb = bb if dc: Base.metadata.create_all() enc = encryptit(sha256(self.Version).digest(), sha256(password).digest()) session.add(Identifier(enc[0], enc[1])) session.commit() return [eng, Base, session, File, Folder, Identifier, password] def checkP(self, db): try: d = db[2].query(db[5]).filter_by(id=0).first() if d is not None: if isenct(self.Version, d.version, db[6], d.kvd): return True except: pass return False def setStyle(self): self.setMaximumWidth(410) self.setMinimumWidth(410) self.setMaximumHeight(370) self.setMinimumHeight(370) self.setWindowIcon(self.icon) self.activateWindow() self.setWindowTitle("safelock " + self.Version) self.setToolTip( u"단순히 끌어다 놓는 것으로 파일이나 폴더를 암호화하거나" + u" .sld 파일을 복호화할 수 있습니다.") self.setAcceptDrops(True) self.show() def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def setMW(self, ml): ll = QVBoxLayout() self.mIcon = QLabel() self.mIcon.setAlignment(Qt.AlignCenter) mmicon = self.logo.pixmap(250, 230, QIcon.Active, QIcon.On) self.mIcon.setPixmap(mmicon) self.mInst = QLabel( # u"<center>(Drag and drop files or folders to encrypt them)<br>" + u"<center>(마우스로 끌어다 놓으십시오)<br>" + u"<u>최대 2GB 파일 또는 디렉토리만 가능</u></center>") font = QFont() font.setPointSize(13) font.setBold(True) font.setWeight(75) self.fInst = QLabel('<center></center>') self.mInst.setFont(font) ll.addWidget(self.mIcon) ll.addWidget(self.mInst) ll.addWidget(self.fInst) ml.addLayout(ll) def setSB(self, ml): self.statusb = QStatusBar() ml.addWidget(self.statusb) def modSB(self): if self.PPbar is None: self.PPbar = True self.statusb.clear() self.pbar = QProgressBar() self.pbar.setMaximum(100) self.pbar.setMinimum(0) self.plabel = QLabel() self.statusb.addWidget(self.plabel, 0.5) self.statusb.addWidget(self.pbar, 3) else: self.PPbar = None self.statusb.removeWidget(self.plabel) self.statusb.removeWidget(self.pbar) self.statusb.clear() # def searchF(self, dirname): # filelist = [] # try: # filenames = listdir(dirname) # for filename in filenames: # full_filename = path.join(dirname, filename) # if path.isdir(full_filename): # tmplist = self.searchF(full_filename) # for tmpfile in tmplist: # filelist.append(tmpfile) # else: # tmp = full_filename.replace('\\','/') # filelist.append(tmp) # except PermissionError: # pass # return filelist def saveFile(self, fl): fname, _ = QFileDialog.getSaveFileName(self, u"암호화 경로 설정", fl, "Safelock file (*.sld)") if '.' in fname: tm = fname.split('.') tm = tm[len(tm) - 1] if tm == "sld": try: if path.isfile(fname): remove(fname) except: pass return fname if len(fname) <= 0: return None fname += ".sld" try: if path.isfile(fname): remove(fname) except: pass return fname def extTo(self, fl): fname = QFileDialog.getExistingDirectory(self, u"복호화 경로 설정", fl) if len(fname) <= 0: return None return fname def getPass(self): passwd, re = QInputDialog.getText(self, u"비밀번호", u"입력하신 비밀번호 :", QLineEdit.Password) if len(passwd) > 0 : passwd2, re = QInputDialog.getText(self, u"비밀번호", u"다시한번 입력하세요 :", QLineEdit.Password) if passwd != passwd2: self.errorMsg(u"비밀번호가 맞지 않습니다") return False else: if not re: return False if len(passwd) <= 0: return None return passwd else: if not re: return False else: return None def getPass2(self): passwd, re = QInputDialog.getText(self, u"비밀번호", u"입력하신 비밀번호 :", QLineEdit.Password) if not re: return False if len(passwd) <= 0: return None return passwd def errorMsg(self, msg=u"에러 발생 !"): QMessageBox.critical(self, "Error", msg) return True def aboutMsgg(self): Amsg = u"<center>SafeLock %s " % self.Version Amsg += u"은 Mozilla Public License 버전 2.0에 " Amsg += u"따라 허가된 무료 오픈소스 프로젝트 입니다.<br><br>" Amsg += u" 본 프로그램에 대한 더 많은 정보를 원하시면:<br> " Amsg += u"<b><a href='https://github.com/mjuc4/safelock'> " Amsg += u"https://github.com/mjuc4/safelock/ </a> </b></center>" QMessageBox.about(self, "About", Amsg) return True def getSession(self): self.eng = eng(self.password, self.dbname) Session = sessionmaker(bind=self.eng) self.Base = declarative_base(bind=self.eng) self.Base.metadata.create_all() self.session = Session() return self.session def dragEnterEvent(self, e): if e.mimeData().hasUrls: e.accept() else: e.ignore() def dragMoveEvent(self, e): if e.mimeData().hasUrls: e.accept() else: e.ignore() def dropEvent(self, e): if e.mimeData().hasUrls: e.setDropAction(Qt.CopyAction) e.accept() self.DFiles = [] for url in e.mimeData().urls(): try: if sysname == 'darwin': from Foundation import NSURL fname = NSURL.URLWithString_( url.toString()).filePathURL().path() else: fname = url.toLocalFile() self.DFiles.append(fname) except: pass self.dealD(self.DFiles) else: event.ignore() def in_loop(self): if self.Processing is None: self.Processing = True self.setAcceptDrops(False) self.mIcon.setEnabled(False) self.mInst.setEnabled(False) self.fInst.setText(u"<center>| 취소는 더블 클릭 |</center>") self.setToolTip("Double-Click anywhere to cancel") else: self.Processing = None self.setAcceptDrops(True) self.mIcon.setEnabled(True) self.mInst.setEnabled(True) self.fInst.setText(u"<center>| 취소는 더블 클릭 |</center>") self.setToolTip( u"단순히 끌어다 놓는 것으로 파일이나 폴더를 암호화하거나" + u" .sld 파일을 복호화할 수 있습니다.") def dealD(self, files): def tpp(inp): a = path.basename(inp) return inp.replace(a, '') if len(files) < 1: return False elif len(files) >= 1: if len(files) == 1: tf = files[0].split('.') tf = tf[len(tf) - 1] if tf == 'sld': pw = self.getPass2() if pw is None: self.errorMsg(u"비밀번호 입력하십쇼!") return False elif not pw: return False if not self.checkP(self.db(sha256(pw).digest(), files[0], dc=False)): self.errorMsg( u"비밀번호가 맞지 않습니다. 다시 시도하세요") return False else: fold = self.extTo(tpp(files[0])) if fold is not None: self.CP = fold self.in_loop() self.P = DecryptTH(fold, self.db(pw, files[0], dc=False), sha256(pw).digest()) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) return True pw = self.getPass() if pw is None: self.errorMsg(u"비밀번호 입력하십시오 !") elif not pw: pass else: fil = self.saveFile(tpp(files[0])) if fil is not None: if path.isfile(fil): try: remove(fil) except: pass self.CP = fil self.in_loop() self.P = EncryptTH(files, self.db(pw, fil), sha256(pw).digest()) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) return True @Slot(object) def handleStatusMessage(self, message): self.statusb.setStyleSheet(self.s_loop) def getIT(f, o): return int((f / o) * 100) mm = message.split('/') if mm[len(mm) - 1] == '%': if self.PPbar is None: self.modSB() self.pbar.setValue(getIT(int(mm[0]), int(mm[1]))) self.setWindowTitle("Processing : " + str(getIT(int(mm[0]), int(mm[1]))) + "%") self.plabel.setText(mm[0] + '/' + mm[1]) else: self.unsetCursor() if self.PPbar is not None: self.modSB() if message[:7] == '# Error': if self.Processing: self.in_loop() self.statusb.setStyleSheet(self.s_error) self.cleanup() elif message[:6] == '# Stop': self.statusb.setStyleSheet(self.s_error) elif message[:6] == '# Done': if self.Processing: self.in_loop() self.statusb.setStyleSheet(self.s_norm) if message.find('encrypted')>=0 : QMessageBox.question(None,'success',"Encrypted succes") else: QMessageBox.question(None,'success',"Decrypted succes") elif message == "# Loading": self.setCursor(Qt.BusyCursor) self.statusb.setStyleSheet(self.s_norm) self.setWindowTitle('safelock ' + self.Version) self.statusb.showMessage(message) def mousePressEvent(self, event): if event.type() == QEvent.Type.MouseButtonDblClick: if self.Processing is None: self.aboutMsgg() else: self.closeEvent() def closeEvent(self, event=None): if self.Processing is not None: if event is not None: r = QMessageBox.question( self, "Making sure", "Are you sure you want to exit, during an active" + " process ?", QMessageBox.Yes | QMessageBox.No) else: r = QMessageBox.question( self, "Making sure", "Are you sure, you to cancel ?", QMessageBox.Yes | QMessageBox.No) if r == QMessageBox.Yes: self.P.stop() self.cleanup() if event is not None: self.in_loop() event.accept() else: self.in_loop() else: if event is not None: event.ignore() else: if self.CP is not None: try: if path.isfile(self.CP + '-journal'): remove(self.CP + '-journal') except: pass if event is not None: event.accept() def cleanup(self): if self.CP is not None: try: if path.isfile(self.CP + '-journal'): remove(self.CP + '-journal') if path.isfile(self.CP): remove(self.CP) except: pass
def __AddGridLabel(self, grid, lblText, custFont, row, column, justification): sd = QLabel(lblText, self) sd.setFont(custFont) grid.addWidget(sd, row, column, alignment = justification)
class qHotField(QWidget): def __init__(self, name, mytype, initial_value, value_list = None, pos = "left", help_text = None, help_instance = None, min_size = 0, max_size = None, handler = None, multiline=False): QWidget.__init__(self) if max_size == None: max_size = 300 self.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed) # Let it expand horizontally but not vertically self.name = name self.mytype = mytype self.multiline = multiline self.setContentsMargins(1, 1, 1, 1) self.is_popup = (value_list != None) if self.is_popup: self.value_list = [str(v) for v in value_list] # It's possible the values won't be strings. if pos == "top": self.layout1 = QVBoxLayout() else: self.layout1=QHBoxLayout() self.layout1.setContentsMargins(1, 1, 1, 1) self.layout1.setSpacing(1) self.setLayout(self.layout1) if mytype == bool: self.cb = QCheckBox(name) self.cb.setFont(regular_small_font) self.layout1.addWidget(self.cb) self.cb.setChecked(initial_value) if handler != None: self.cb.toggled.connect(handler) else: if not self.is_popup: if multiline: self.efield=QPlainTextEdit("") self.efield.appendPlainText(str(initial_value)) else: self.efield = QLineEdit("Default Text") self.efield.setText(str(initial_value)) if handler != None: self.efield.textChanged.connect(handler) else: self.efield = QComboBox() self.efield.addItems(value_list) if len(value_list) != 0: self.efield.setCurrentIndex(value_list.index(initial_value)) self.efield.setSizeAdjustPolicy(QComboBox.AdjustToContents) if handler != None: self.efield.currentIndexChanged.connect(handler) self.layout1.setContentsMargins(5, 5, 5, 5) # Popups need a little more space self.layout1.setSpacing(2) self.efield.setFont(regular_small_font) self.label = QLabel(name) self.label.setFont(regular_small_font) if pos == "right": self.layout1.addWidget(self.efield) self.layout1.addWidget(self.label) else: self.layout1.addWidget(self.label) self.layout1.addWidget(self.efield) self.efield.setMaximumWidth(max_size) if min_size != 0: self.efield.setMinimumWidth(min_size) self.layout1.addStretch() if help_text != None: if (help_instance == None): print "No help instance specified." else: help_button_widget = help_instance.create_button(name, help_text) self.layout1.addWidget(help_button_widget) def repopulate_list(self, initial_value, value_list): if not self.is_popup: print "This qHotField is not a popup list. So it can't be repopulated" return self.value_list = [str(v) for v in value_list] # It's possible the values won't be strings self.efield.clear() self.efield.addItems(value_list) self.efield.setCurrentIndex(value_list.index(initial_value)) return def get_myvalue(self): if self.mytype == bool: return self.cb.isChecked() else: if self.is_popup: the_txt = self.efield.currentText() else: if self.multiline: the_txt = self.efield.toPlainText() else: the_txt = self.efield.text() if (self.mytype == str) or (self.mytype == unicode): return (self.mytype)(the_txt) else: # if we have a numerical type, the user might have entered a list separated by spaces. Handle that specially the_val = re.findall(r"\S+", the_txt) # We might have a list of values separated by spaces if this is a numerical variable if len(the_val) == 1: # it's just a single value result = (self.mytype)(the_txt) else: # it's a list. We want to convert treat this as a monte sequence res = [] for v in the_val: res.append((self.mytype)(v)) result = MonteSequence(res) return result def set_myvalue(self, val): if self.mytype == bool: self.cb.setChecked(val) elif self.is_popup: self.efield.setCurrentIndex(self.value_list.index(val)) else: if type(val) == list: result = "" for x in val: result = result + str(x) + " " self.efield.setText(result) else: if self.multiline: self.efield.clear() self.efield.appendPlainText(str(val)) else: self.efield.setText(str(val)) value = property(get_myvalue, set_myvalue)
class PositionPanel(QtGui.QWidget): positionTableWidget = None summaryTable = None movementFilterWidget = None row = 0 summaryRow = 0 positionColumnList = "Asset Name;Position;Unit Cost;Market Price;Change%;Invested amount;Valuated amount;Tenor;Maturity Date;Gross PNL;Net PNL;Gross%PNL;Net%PNL;Realized Pnl;%Portfolio;WeightedPNL%".split( ";") summaryColumnList = "Custody;Asset type;Invested Amount;Valuated Amount;Net PnL;Net%PNL;Realized Pnl;RPnL + NPnL;%Portfolio;WeightedPNL%".split( ";") def __init__(self): super(self.__class__, self).__init__() self.layout = QtGui.QGridLayout(self) self.movementFilterWidget = MovementFilterWidget() self.layout.addWidget(self.movementFilterWidget, 1, 0) def clearTables(self): self.row = 0 self.summaryRow = 0 self.createTable() self.createSummaryTable() self.createGeneralInfoPanel() def createSummaryTable(self): self.summaryTableWidget = QTableWidget() self.summaryTableWidget.setRowCount(7) self.summaryTableWidget.setColumnCount(len(self.summaryColumnList)) self.summaryTableWidget.setEditTriggers( QtGui.QAbstractItemView.NoEditTriggers) self.summaryTableWidget.setHorizontalHeaderLabels( self.summaryColumnList) #self.summaryTableWidget.setSortingEnabled(True) #self.summaryTableWidget.sortItems(0) self.summaryTableWidget.resizeColumnsToContents() self.summaryTableWidget.resizeRowsToContents() self.summaryTableWidget.setFixedSize(800, 200) self.layout.addWidget(self.summaryTableWidget, 1, 1) def createGeneralInfoPanel(self): self.generalInfoPanel = QWidget() self.generalInfoLayout = QtGui.QGridLayout(self.generalInfoPanel) self.lblUSDMXN = QLabel("USD/MXN") self.lblUSDMXN.font() self.lblUSDMXN.setFont( QtGui.QFont("MS Shell Dlg", 12, QtGui.QFont.Normal)) self.generalInfoLayout.addWidget(self.lblUSDMXN, 1, 1) self.lblUSDMXNValue = QLabel("0") self.lblUSDMXNValue.setFont( QtGui.QFont("MS Shell Dlg", 12, QtGui.QFont.Bold)) self.generalInfoLayout.addWidget(self.lblUSDMXNValue, 1, 2) self.generalInfoPanel.setFixedSize(200, 50) self.layout.addWidget(self.generalInfoPanel, 1, 2) def createTable(self): self.positionTableWidget = QTableWidget() self.positionTableWidget.setRowCount(27) self.positionTableWidget.setColumnCount( len(self.positionColumnList) + 1) self.positionTableWidget.setColumnHidden( Constant.CONST_COLUMN_POSITION_HIDDEN_ID, True) self.positionTableWidget.setEditTriggers( QtGui.QAbstractItemView.NoEditTriggers) self.positionTableWidget.setHorizontalHeaderLabels( self.positionColumnList) #self.positionTableWidget.setSortingEnabled(True) #self.positionTableWidget.sortItems(0) self.positionTableWidget.doubleClicked.connect(self.openMovementView) self.positionTableWidget.resizeColumnsToContents() self.positionTableWidget.resizeRowsToContents() self.layout.addWidget(self.positionTableWidget, 2, 0, 3, 3) def renderGeneralInfoPanel(self, usdMXNvalue): self.lblUSDMXNValue.setText(str(round(usdMXNvalue, 4))) #self.generalInfoLayout.addWidget(self.lblUSDMXNValue, 1, 2) def renderSummary(self, summaryDict): for (key, summaryItem) in sorted(summaryDict.iteritems()): if summaryItem.custodyName is None: isBold = True else: isBold = False #custodyName custodyNameItem = QTableWidgetItemString(summaryItem.custodyName, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_CUSTODY_NAME, custodyNameItem) #assetTypeName assetTypeNameItem = QTableWidgetItemString(summaryItem.assetType, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_ASSET_TYPE_NAME, assetTypeNameItem) #InvestedAmount investedAmountItem = QTableWidgetItemDecimal( summaryItem.investedAmount, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_INVESTED_AMOUNT, investedAmountItem) #valuatedAmount valuatedAmountItem = QTableWidgetItemDecimal( summaryItem.valuatedAmount, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_VALUATED_AMOUNT, valuatedAmountItem) #subTotalNetPnL netPnLItem = QTableWidgetItemDecimal(summaryItem.netPnL, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_NET_PNL, netPnLItem) #netPNLPercentage netPNLPercentageItem = QTableWidgetItemDecimal( summaryItem.getNetPnLPercentage(), isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_NET_PNL_PERCENTAGE, netPNLPercentageItem) #realizedPnl realizedPnlItem = QTableWidgetItemDecimal(summaryItem.realizedPnl, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_REALIZED_PNL, realizedPnlItem) #realizedPnlPlusNetPnL realizedPnlPlusNetPnLItem = QTableWidgetItemDecimal( summaryItem.realizedPnl + summaryItem.netPnL, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_REALIZED_PNL_PLUS_NET_PNL, realizedPnlPlusNetPnLItem) #positionPercentage positionPercentageItem = QTableWidgetItemDecimal( summaryItem.positionPercentage, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_POSITION_PERCENTAGE, positionPercentageItem) #weightedPnL weightedPnLItem = QTableWidgetItemDecimal(summaryItem.weightedPnL, isBold) self.summaryTableWidget.setItem( self.summaryRow, Constant.CONST_COLUMN_SUMMARY_CUST_WEIGHTED_PNL, weightedPnLItem) self.summaryRow += 1 def renderSubtotal(self, positionDict, assetType, isSIC): accValuatedAmount = Engine.getSubTotalValuatedAmount( positionDict, assetType, isSIC) accInvestedAmount = Engine.getSubTotalInvestedAmount( positionDict, assetType, isSIC) accRealizedPnl = Engine.getAccRealizedPnL(positionDict, assetType, isSIC) accPositionPercentage = Engine.getAccPositionPercentage( positionDict, assetType, isSIC) accGrossPnlPercentage = Engine.getAccGrossPnlPercentage( positionDict, assetType, isSIC) accNetPnlPercentage = Engine.getAccNetPnlPercentage( positionDict, assetType, isSIC) accNetPNL = Engine.getAccNetPNL(positionDict, assetType, isSIC) accWeightedPNL = Engine.getAccWeightedPNL(positionDict, assetType, isSIC) #Invested amount investedAmountItem = QTableWidgetItemDecimal(accInvestedAmount, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_INVESTED_AMOUNT, investedAmountItem) #sub total valuated amount subTotalValuatedAmountItem = QTableWidgetItemDecimal( accValuatedAmount, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_VALUATED_AMOUNT, subTotalValuatedAmountItem) #sub total Gross PNL subTotalGrossPNLItem = QTableWidgetItemDecimalColor( Engine.getSubtotalGrossPNL(positionDict, assetType, isSIC), True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL, subTotalGrossPNLItem) #sub total Net PNL subTotalNetPNLItem = QTableWidgetItemDecimalColor(accNetPNL, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_NET_PNL, subTotalNetPNLItem) #subTotalGrossPnLPercentage subTotalGrossPnLPercentage = QTableWidgetItemDecimalColor( accGrossPnlPercentage, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL_PERCENTAGE, subTotalGrossPnLPercentage) #pnLNetPercentage subTotalNetPnLPercentage = QTableWidgetItemDecimalColor( accNetPnlPercentage, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_NET_PERCENTAGE, subTotalNetPnLPercentage) #realizedPnL realizedPnLItem = QTableWidgetItemDecimalColor(accRealizedPnl, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_REALIZED_PNL, realizedPnLItem) #positionPercentage positionPercentageItem = QTableWidgetItemDecimal( accPositionPercentage, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_POSITION_PERCENTAGE, positionPercentageItem) #weightedPercentageItem weightedPercentageItem = QTableWidgetItemDecimal(accWeightedPNL, True) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_WEIGHTED_PNL, weightedPercentageItem) #HiddenID hiddenIDItem = QTableWidgetItemDecimal(self.row, False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_HIDDEN_ID, hiddenIDItem) def renderPositions(self, positionDict, assetType, isSIC): positionList = Engine.getPositionByAssetType(positionDict, assetType, isSIC) for position in positionList: print('rendering ' + position.getAssetName()) if (position.getTotalQuantity() != 0): position.row = self.row #assetName assetNameItem = QTableWidgetItemString(position.getAssetName(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_ASSET_NAME, assetNameItem) #totalQuantity totalQuantityItem = QTableWidgetItemInt( position.getTotalQuantity(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_QUANTITY, totalQuantityItem) #UnitCostOrRate unitCostItem = QTableWidgetItemDecimal( position.getUnitCostOrRate(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_PPP, unitCostItem) #Market price marketPriceItem = QTableWidgetItemDuoDecimal( position.getMarketPrice(), position.getMarketPriceOrig()) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_MARKET_PRICE, marketPriceItem) #changePercentage changePercentageItem = QTableWidgetItemStringPlusMinus( position.changePercentage, False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_CHANGE_PERCENTAGE, changePercentageItem) #Invested amount investedAmountItem = QTableWidgetItemDecimal( position.getInvestedAmount(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_INVESTED_AMOUNT, investedAmountItem) #Valuated amount valuatedAmountItem = QTableWidgetItemDuoDecimal( position.getValuatedAmount(), position.getValuatedAmountOrig()) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_VALUATED_AMOUNT, valuatedAmountItem) #Tenor tenorItem = QTableWidgetItemDuoInt(position.tenor, position.getElapsedDays()) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_TENOR, tenorItem) #Maturity Date maturityDateItem = QTableWidgetItemString( position.getMaturityDate(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_MATURITY_DATE, maturityDateItem) #GrossPnL grossPnlItem = QTableWidgetItemDecimalColor( position.getGrossPnL(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL, grossPnlItem) #netPnL netPnlItem = QTableWidgetItemDecimalColor( position.getNetPnL(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_NET_PNL, netPnlItem) #pnLGrossPercentage pnLGrossPercentageItem = QTableWidgetItemDecimalColor( position.getGrossPnLPercentage(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_PNL_PERCENTAGE, pnLGrossPercentageItem) #pnLNetPercentage pnLNetPercentageItem = QTableWidgetItemDecimalColor( position.getNetPnLPercentage(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_GROSS_NET_PERCENTAGE, pnLNetPercentageItem) #realizedPnL realizedPnLItem = QTableWidgetItemDecimalColor( position.getConsolidatedRealizedPnl(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_REALIZED_PNL, realizedPnLItem) #positionPercentage positionPercentageItem = QTableWidgetItemDecimal( position.getPositionPercentage(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_POSITION_PERCENTAGE, positionPercentageItem) #weightedPercentageItem weightedPercentageItem = QTableWidgetItemDecimal( position.getWeightedPnl(), False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_WEIGHTED_PNL, weightedPercentageItem) #HiddenID hiddenIDItem = QTableWidgetItemDecimal(self.row, False) self.positionTableWidget.setItem( self.row, Constant.CONST_COLUMN_POSITION_HIDDEN_ID, hiddenIDItem) self.row += 1 self.renderSubtotal(positionDict, assetType, isSIC) self.row += 1 def openMovementView(self): assetName = self.positionTableWidget.item( self.positionTableWidget.currentRow(), Constant.CONST_COLUMN_POSITION_ASSET_NAME).text() movementList = Engine.getMovementListByAsset( assetName, (self.movementFilterWidget.dateFromDate.date() ).toString("yyyy-M-dd"), (self.movementFilterWidget.dateToDate.date() ).toString("yyyy-M-dd")) self.movementView = MovementView(movementList) self.movementView.show()
class MainWindow(QWidget, object): master_password_label = None master_password_edit = None domain_label = None domain_edit = None username_label = None username_edit = None strength_label = None strength_selector = None password_label = None password = None sync_button = None clipboard_button = None setting = None decrypt_kgk_task = None settings_window = None def __init__(self): super(MainWindow, self).__init__() self.nam = QNetworkAccessManager() self.setWindowIcon(QIcon(os.path.join('icons', 'Logo_rendered_edited.png'))) layout = QBoxLayout(QBoxLayout.TopToBottom) layout.setContentsMargins(0, 0, 0, 0) self.preference_manager = PreferenceManager() self.kgk_manager = KgkManager() self.kgk_manager.set_preference_manager(self.preference_manager) self.settings_manager = PasswordSettingsManager(self.preference_manager) self.setting_dirty = True # Header bar header_bar = QFrame() header_bar.setStyleSheet( "QWidget { background: rgb(40, 40, 40); } " + "QToolButton { background: rgb(40, 40, 40); }" + "QToolTip { color: rgb(255, 255, 255); background-color: rgb(20, 20, 20); " + "border: 1px solid white; }") header_bar.setAutoFillBackground(True) header_bar.setFixedHeight(45) header_bar_layout = QBoxLayout(QBoxLayout.LeftToRight) header_bar_layout.addStretch() header_bar.setLayout(header_bar_layout) layout.addWidget(header_bar) self.create_header_bar(header_bar_layout) # Widget area main_area = QFrame() main_layout = QBoxLayout(QBoxLayout.TopToBottom) main_area.setLayout(main_layout) layout.addWidget(main_area) self.create_main_area(main_layout) # Window layout layout.addStretch() main_layout.addStretch() self.setLayout(layout) settings = QSettings() size = settings.value("MainWindow/size") if not size: size = QSize(350, 450) self.resize(size) position = settings.value("MainWindow/pos") if not position: position = QPoint(0, 24) self.move(position) self.setWindowTitle("c't SESAM") self.master_password_edit.setFocus() self.show() # noinspection PyUnresolvedReferences def create_header_bar(self, layout): self.sync_button = QToolButton() self.sync_button.setIconSize(QSize(30, 30)) self.sync_button.setIcon(QIcon(os.path.join("icons", "ic_action_sync.png"))) self.sync_button.setStyleSheet("border: 0px;") self.sync_button.setToolTip("Sync") self.sync_button.clicked.connect(self.sync_clicked) self.sync_button.setVisible(False) layout.addWidget(self.sync_button) self.clipboard_button = QToolButton() self.clipboard_button.setIconSize(QSize(30, 30)) self.clipboard_button.setIcon(QIcon(os.path.join("icons", "ic_action_copy.png"))) self.clipboard_button.setStyleSheet("border: 0px;") self.clipboard_button.setToolTip("in die Zwischenablage") self.clipboard_button.clicked.connect(self.copy_to_clipboard) self.clipboard_button.setVisible(False) layout.addWidget(self.clipboard_button) # noinspection PyUnresolvedReferences def create_main_area(self, layout): # Master password master_password_label = QLabel("&Master-Passwort:") self.master_password_edit = QLineEdit() self.master_password_edit.setEchoMode(QLineEdit.EchoMode.Password) self.master_password_edit.textChanged.connect(self.masterpassword_changed) self.master_password_edit.returnPressed.connect(self.move_focus) self.master_password_edit.editingFinished.connect(self.masterpassword_entered) self.master_password_edit.setMaximumHeight(28) master_password_label.setBuddy(self.master_password_edit) layout.addWidget(master_password_label) layout.addWidget(self.master_password_edit) # Domain domain_label = QLabel("&Domain:") self.domain_edit = QComboBox() self.domain_edit.setEditable(True) self.domain_edit.textChanged.connect(self.domain_changed) self.domain_edit.currentIndexChanged.connect(self.domain_changed) self.domain_edit.lineEdit().editingFinished.connect(self.domain_entered) self.domain_edit.lineEdit().returnPressed.connect(self.move_focus) self.domain_edit.setMaximumHeight(28) domain_label.setBuddy(self.domain_edit) layout.addWidget(domain_label) layout.addWidget(self.domain_edit) # Username self.username_label = QLabel("&Username:"******"&Passwortstärke:") self.strength_label.setVisible(False) self.strength_selector = PasswordStrengthSelector() self.strength_selector.set_min_length(4) self.strength_selector.set_max_length(36) self.strength_selector.setMinimumHeight(60) self.strength_selector.set_length(12) self.strength_selector.set_complexity(6) self.strength_selector.strength_changed.connect(self.strength_changed) self.strength_selector.setVisible(False) self.strength_label.setBuddy(self.strength_selector) layout.addWidget(self.strength_label) layout.addWidget(self.strength_selector) # Password self.password_label = QLabel("&Passwort:") self.password_label.setVisible(False) self.password = QLabel() self.password.setTextFormat(Qt.PlainText) self.password.setAlignment(Qt.AlignCenter) self.password.setFont(QFont("Helvetica", 18, QFont.Bold)) self.password.setVisible(False) self.password_label.setBuddy(self.password) layout.addWidget(self.password_label) layout.addWidget(self.password) def set_masterpassword(self, masterpassword): self.master_password_edit.setText(masterpassword) def set_domain(self, domain): self.domain_edit.lineEdit().setText(domain) def closeEvent(self, *args, **kwargs): settings = QSettings() settings.setValue("MainWindow/size", self.size()) settings.setValue("MainWindow/pos", self.pos()) settings.sync() def masterpassword_changed(self): self.kgk_manager.reset() self.decrypt_kgk_task = None self.clipboard_button.setVisible(False) if len(self.master_password_edit.text()) > 0: self.sync_button.setVisible(True) else: self.sync_button.setVisible(False) def masterpassword_entered(self): if len(self.master_password_edit.text()) > 0 and not self.decrypt_kgk_task: self.kgk_manager.get_kgk_crypter_salt() self.decrypt_kgk_task = DecryptKgkTask( self.master_password_edit.text(), self.preference_manager, self.kgk_manager, self.settings_manager, self.domain_edit) def set_visibilities(self): if len(self.domain_edit.lineEdit().text()) > 0: self.username_label.setVisible(True) self.username_edit.setVisible(True) self.strength_label.setVisible(True) self.strength_selector.setVisible(True) self.password_label.setVisible(True) self.password.setVisible(True) else: self.username_label.setVisible(False) self.username_edit.setVisible(False) self.strength_label.setVisible(False) self.strength_selector.setVisible(False) self.password_label.setVisible(False) self.password.setVisible(False) self.clipboard_button.setVisible(False) def domain_changed(self): self.setting_dirty = True self.password.setText("") self.clipboard_button.setVisible(False) self.set_visibilities() if self.kgk_manager.has_kgk() and (not self.decrypt_kgk_task or not self.decrypt_kgk_task.is_running()) and \ len(self.domain_edit.lineEdit().text()) > 0 and \ self.domain_edit.lineEdit().text() in self.settings_manager.get_domain_list(): self.domain_entered() def domain_entered(self): self.setting_dirty = self.domain_edit.lineEdit().text() not in self.settings_manager.get_domain_list() self.setting = self.settings_manager.get_setting(self.domain_edit.lineEdit().text()) self.username_edit.blockSignals(True) self.username_edit.setText(self.setting.get_username()) self.username_edit.blockSignals(False) self.strength_selector.blockSignals(True) self.strength_selector.set_length(self.setting.get_length()) self.strength_selector.set_complexity(self.setting.get_complexity()) self.strength_selector.set_extra_count(len(self.setting.get_extra_character_set())) self.strength_selector.blockSignals(False) self.generate_password() def move_focus(self): line_edits = [self.master_password_edit, self.domain_edit, self.username_edit] for i, edit in enumerate(line_edits): if edit.hasFocus() and i + 1 < len(line_edits): line_edits[i + 1].setFocus() return True self.generate_button.setFocus() def generate_password(self): if not self.kgk_manager.has_kgk(): self.kgk_manager.create_new_kgk() self.kgk_manager.create_and_save_new_kgk_block() if not self.kgk_manager.kgk_crypter or not self.kgk_manager.salt: self.kgk_manager.get_kgk_crypter(self.master_password_edit.text().encode('utf-8'), self.kgk_manager.get_kgk_crypter_salt()) if self.setting_dirty: self.setting.new_salt() self.setting.calculate_template() self.settings_manager.set_setting(self.setting) if not self.setting.get_legacy_password(): generator = CtSesam(self.setting.get_domain(), self.setting.get_username(), self.kgk_manager.get_kgk(), self.setting.get_salt(), self.setting.get_iterations()) password = generator.generate(self.setting) else: password = self.setting.get_legacy_password() self.password.setText(password) self.password.setTextInteractionFlags(Qt.TextSelectableByMouse | Qt.TextSelectableByKeyboard) self.clipboard_button.setVisible(True) self.settings_manager.store_local_settings(self.kgk_manager) self.setting_dirty = False def copy_to_clipboard(self): QApplication.clipboard().setText(self.password.text()) def username_changed(self): if self.setting: if self.setting.get_username() != self.username_edit.text(): self.setting.set_username(self.username_edit.text()) self.setting_dirty = True self.generate_password() def strength_changed(self, complexity, length): if self.setting: if self.setting.get_length() != length: self.setting.set_length(length) self.setting_dirty = True if self.setting.get_complexity() != complexity: self.setting.set_complexity(complexity) self.setting_dirty = True self.generate_password() def migrate_local_domains(self, new_kgk_manager): for domain in self.settings_manager.get_domain_list(): setting = self.settings_manager.get_setting(domain) generator = CtSesam(setting.get_domain(), setting.get_username(), self.kgk_manager.get_kgk(), setting.get_salt(), setting.get_iterations()) setting.set_legacy_password(generator.generate(setting)) self.settings_manager.set_setting(setting) self.kgk_manager = new_kgk_manager self.settings_manager.store_local_settings(self.kgk_manager) # noinspection PyUnresolvedReferences def sync_clicked(self): self.masterpassword_entered() if not self.settings_manager.sync_manager.has_settings(): self.show_sync_settings() else: pull_successful, data = self.settings_manager.sync_manager.pull() if pull_successful and len(data) > 0: remote_kgk_manager = KgkManager() remote_kgk_manager.update_from_blob(self.master_password_edit.text().encode('utf-8'), b64decode(data)) if len(self.preference_manager.get_kgk_block()) == 112 and \ remote_kgk_manager.has_kgk() and self.kgk_manager.has_kgk() and \ self.kgk_manager.get_kgk() != remote_kgk_manager.get_kgk(): if len(self.settings_manager.get_domain_list()) > 0: print("Lokal und auf dem Server gibt es unterschiedliche KGKs. Das ist ein Problem!") self.migrate_local_domains(remote_kgk_manager) else: if len(self.preference_manager.get_kgk_block()) != 112: self.kgk_manager = remote_kgk_manager self.kgk_manager.set_preference_manager(self.preference_manager) self.kgk_manager.store_local_kgk_block() self.settings_manager.update_from_export_data(remote_kgk_manager, b64decode(data)) self.domain_edit.blockSignals(True) current_domain = self.domain_edit.lineEdit().text() for i in reversed(range(self.domain_edit.count())): self.domain_edit.removeItem(i) self.domain_edit.insertItems(0, self.settings_manager.get_domain_list()) self.domain_edit.blockSignals(False) self.domain_edit.setEditText(current_domain) self.settings_manager.store_settings(self.kgk_manager) # noinspection PyUnresolvedReferences def show_sync_settings(self, url=None, username=None, password=None): self.settings_window = SettingsWindow( self.settings_manager.sync_manager, self.nam, url=self.settings_manager.sync_manager.server_address, username=self.settings_manager.sync_manager.username, password=self.settings_manager.sync_manager.password, certificate=self.settings_manager.sync_manager.certificate) self.settings_window.finished.connect(self.sync_clicked)
class LoginView(View): """`View` derived class. Defines the log in widget""" login = Signal((str, str, str, bool,)) def __init__(self, parent=None): """ Init method. Initializes parent classes :param parent: Reference to a `QWidget` object to be used as parent """ super(LoginView, self).__init__(parent) self.createWidgets() self.createLayouts() self.setFixedSize(250, 340) def createLayouts(self): """Put widgets into layouts, thus creating the widget""" mainLayout = QHBoxLayout() fieldsLayout = QVBoxLayout() ftpInfoLayout = QHBoxLayout() buttonLayout = QHBoxLayout() mainLayout.addStretch(20) fieldsLayout.addStretch(80) fieldsLayout.addWidget(self.linkLabel) fieldsLayout.addWidget(self.line) fieldsLayout.addStretch(20) ftpInfoLayout.addWidget(self.hostLabel, 50, Qt.AlignLeft) ftpInfoLayout.addStretch(20) ftpInfoLayout.addWidget(self.sslLabel, 20, Qt.AlignRight) ftpInfoLayout.addWidget(self.sslCheck, 10, Qt.AlignRight) fieldsLayout.addLayout(ftpInfoLayout) fieldsLayout.addWidget(self.hostEdit) fieldsLayout.addWidget(self.usernameLabel) fieldsLayout.addWidget(self.usernameEdit) fieldsLayout.addWidget(self.passwdLabel) fieldsLayout.addWidget(self.passwdEdit) fieldsLayout.addStretch(30) buttonLayout.addStretch(50) buttonLayout.addWidget(self.loginButton, 50, Qt.AlignRight) fieldsLayout.addLayout(buttonLayout) fieldsLayout.addStretch(20) mainLayout.addLayout(fieldsLayout, 30) mainLayout.addStretch(20) self.setLayout(mainLayout) def createWidgets(self): """Create children widgets needed by this view""" fieldsWidth = 200 labelsFont = View.labelsFont() editsFont = View.editsFont() self.setLogo() self.hostLabel = QLabel(self) self.hostEdit = QLineEdit(self) self.sslLabel = QLabel(self) self.sslCheck = QCheckBox(self) self.hostLabel.setText('FTP Location') self.hostLabel.setFont(labelsFont) self.hostEdit.setFixedWidth(fieldsWidth) self.hostEdit.setFont(editsFont) self.sslLabel.setText('SSL') self.sslLabel.setFont(labelsFont) self.usernameLabel = QLabel(self) self.usernameEdit = QLineEdit(self) self.usernameLabel.setText('Username') self.usernameLabel.setFont(labelsFont) self.usernameEdit.setFixedWidth(fieldsWidth) self.usernameEdit.setFont(editsFont) self.passwdLabel = QLabel(self) self.passwdEdit = QLineEdit(self) self.passwdLabel.setText('Password') self.passwdLabel.setFont(labelsFont) self.passwdEdit.setFixedWidth(fieldsWidth) self.passwdEdit.setEchoMode(QLineEdit.Password) self.passwdEdit.setFont(editsFont) self.passwdEdit.returnPressed.connect(self.onLoginClicked) self.loginButton = QPushButton(self) self.loginButton.setText('Login') self.loginButton.setFont(labelsFont) self.loginButton.setFixedWidth(fieldsWidth / 2) self.loginButton.clicked.connect(self.onLoginClicked) # Sets previously stored values into the fields, if any settings = get_settings() self.hostEdit.setText(settings.value(SettingsKeys['host'], '')) self.usernameEdit.setText(settings.value(SettingsKeys['username'], '')) self.passwdEdit.setText(crypt.decrypt(settings.value(SettingsKeys['passwd'], ''))) # Unicode to boolean conversion ssl = settings.value(SettingsKeys['ssl'], u'true') ssl = True if ssl == u'true' else False self.sslCheck.setChecked(ssl) @Slot() def onLoginClicked(self): """ Slot. Called on the user clicks on the `loginButton` button """ # Takes out the user input from the fields host = self.hostEdit.text() username = self.usernameEdit.text() passwd = self.passwdEdit.text() ssl = self.sslCheck.isChecked() print 'Logging in: %s, %s, %s' % (host, username, '*' * len(passwd)) if len(host) > 0: # If the fields are valid, store them using a `QSettings` object # and triggers a log in request settings = get_settings() settings.setValue(SettingsKeys['host'], host) settings.setValue(SettingsKeys['username'], username) settings.setValue(SettingsKeys['passwd'], crypt.encrypt(passwd)) settings.setValue(SettingsKeys['ssl'], ssl) self.setEnabled(False) self.login.emit(host.strip(), username, passwd, ssl) @Slot() def onFailedLogIn(self): """ Slot. Called when the log in request fails """ # Enables the fields again for user input self.setEnabled(True)
class LevelCompletionView(QFrame): """ View of the Level Completion Status """ def __init__(self, level, width, height, parent=None): """ Initialize the Level Completion View """ QFrame.__init__(self, parent) self.level = level self.setup() self.updateView() self.color = QColor(200, 200, 200) self.setStyleSheet("QFrame { background-color: %s }" % self.color.name()) self.resize(width, height) def setup(self): """ Setup the View """ self.setupFont() self.setupLevelCompletionLabel() self.setupCompletionDetailsLabel() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(32) def setupLevelCompletionLabel(self): """ Setup the Power Label """ self.font = QFont() self.font.setPointSize(32) self.levelCompletionLabel = QLabel("You Won!", self) self.levelCompletionLabel.move(32, 16) self.levelCompletionLabel.setFont(self.font) self.levelCompletionLabel.setVisible(False) def setupCompletionDetailsLabel(self): """ Setup the Remaining Mines Label """ self.font = QFont() self.font.setPointSize(24) self.completionDetailsLabel = QLabel("Destroyed!", self) self.completionDetailsLabel.move(32, 64) self.completionDetailsLabel.setFont(self.font) self.completionDetailsLabel.setVisible(False) def updateView(self): """ Update the View """ self.updateLevelCompletionLabel() self.updateCompletionDetailsLabel() def updateLevelCompletionLabel(self): """ Update the Power Label """ if self.level.won(): self.levelCompletionLabel.setText("You Won!") self.levelCompletionLabel.setVisible(True) elif self.level.lost(): self.levelCompletionLabel.setText("Game Over!") self.levelCompletionLabel.setVisible(True) def updateCompletionDetailsLabel(self): """ Update the Remaining Mines Label """ if self.level.destroyed(): self.completionDetailsLabel.setText("Destroyed") self.completionDetailsLabel.setVisible(True) elif self.level.noPower() and not self.level.won(): self.completionDetailsLabel.setText("Insufficient Power") self.completionDetailsLabel.setVisible(True) elif self.level.won(): text = "" if self.level.completionRating.awarded: text += "C" if self.level.moveRating.awarded: text += "M" if self.level.powerRating.awarded: text += "P" self.completionDetailsLabel.setText(text) self.completionDetailsLabel.setVisible(True)
class SafeLock(QWidget): def __init__(self): super(SafeLock, self).__init__() main_layout = QVBoxLayout(self) self.Version = '0.5 beta' self.s_error = "QStatusBar{color:red;font-weight:1000;}" self.s_loop = "QStatusBar{color:black;font-weight:1000;}" self.s_norm = "QStatusBar{color:blue;font-style:italic;" self.s_norm += "font-weight:500;}" self.Processing = None self.CP = None self.PPbar = None self.key = None self.DFiles = [] self.picon = r_path("images/favicon.png") self.plogo = r_path("images/logo.png") if name == 'nt': self.picon = r_path("images\\favicon.png") self.plogo = r_path("images\\logo.png") self.icon = QIcon(self.picon) self.logo = QIcon(self.plogo) self.center() self.setStyle() self.setMW(main_layout) self.setSB(main_layout) self.show() def db(self, password="******", dbname="untitled.sld", dc=True): eng = create_engine("sqlite:///%s" % dbname, connect_args={'check_same_thread': False}) Base = declarative_base(bind=eng) Session = sessionmaker(bind=eng) session = Session() class Identifier(Base): __tablename__ = "identifier" id = Column(Integer, primary_key=True) version = Column(Binary) kvd = Column(Binary) def __init__(self, version, kvd): self.id = 0 self.version = version self.kvd = kvd class Folder(Base): __tablename__ = 'folders' id = Column(Integer, primary_key=True) path = Column(String) def __init__(self, path="Empty"): self.path = path class File(Base): __tablename__ = 'files' id = Column(Integer, primary_key=True) name = Column(String) f_id = Column(Integer, ForeignKey('folders.id'), nullable=True) bb = Column(Binary) def __init__(self, name="empty", f_id=0, bb=1010): self.name = name self.f_id = f_id self.bb = bb if dc: Base.metadata.create_all() enc = encryptit( sha256(self.Version).digest(), sha256(password).digest()) session.add(Identifier(enc[0], enc[1])) session.commit() return [eng, Base, session, File, Folder, Identifier, password] def checkP(self, db): try: d = db[2].query(db[5]).filter_by(id=0).first() if d is not None: if isenct(self.Version, d.version, db[6], d.kvd): return True except: pass return False def setStyle(self): self.setMaximumWidth(410) self.setMinimumWidth(410) self.setMaximumHeight(370) self.setMinimumHeight(370) self.setWindowIcon(self.icon) self.activateWindow() self.setWindowTitle("safelock " + self.Version) self.setToolTip("Just drag and drop any files or folders" + " to ecrypt or a .sld file to decrypt") self.setAcceptDrops(True) self.show() def center(self): qrect = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qrect.moveCenter(cp) self.move(qrect.topLeft()) def setMW(self, ml): ll = QVBoxLayout() self.mIcon = QLabel() self.mIcon.setAlignment(Qt.AlignCenter) mmicon = self.logo.pixmap(250, 230, QIcon.Active, QIcon.On) self.mIcon.setPixmap(mmicon) self.mInst = QLabel( "<center>(Drag and drop files or folders to encrypt them)<br>" + "(Drap and drop .sld file to decrypt it)<br>" + "<u>2GB max single file size to encrypt</u></center>") font = QFont() font.setPointSize(13) font.setBold(True) font.setWeight(75) self.fInst = QLabel('<center>| Double-Click for about |</center>') self.mInst.setFont(font) ll.addWidget(self.mIcon) ll.addWidget(self.mInst) ll.addWidget(self.fInst) ml.addLayout(ll) def setSB(self, ml): self.statusb = QStatusBar() ml.addWidget(self.statusb) def modSB(self): if self.PPbar is None: self.PPbar = True self.statusb.clear() self.pbar = QProgressBar() self.pbar.setMaximum(100) self.pbar.setMinimum(0) self.plabel = QLabel() self.statusb.addWidget(self.plabel, 0.5) self.statusb.addWidget(self.pbar, 3) else: self.PPbar = None self.statusb.removeWidget(self.plabel) self.statusb.removeWidget(self.pbar) self.statusb.clear() def saveFile(self, fl): fname, _ = QFileDialog.getSaveFileName(self, "Save encrypted file", fl, "Safelock file (*.sld)") if '.' in fname: tm = fname.split('.') tm = tm[len(tm) - 1] if tm == "sld": try: if path.isfile(fname): remove(fname) except: pass return fname if len(fname) <= 0: return None fname += ".sld" try: if path.isfile(fname): remove(fname) except: pass return fname def extTo(self, fl): fname = QFileDialog.getExistingDirectory(self, "Extract files to", fl) if len(fname) <= 0: return None return fname def getPass(self): passwd, re = QInputDialog.getText(self, "Password", "Enter password :"******"Something went wrong !"): QMessageBox.critical(self, "Error", msg) return True def aboutMsgg(self): Amsg = "<center>All credit reserved to the author of " Amsg += "safelock %s " % self.Version Amsg += ", This work is a free, open-source project licensed " Amsg += " under Mozilla Public License version 2.0 . <br><br>" Amsg += " visit for more info or report:<br> " Amsg += "<b><a href='https://safe-lock.github.io'> " Amsg += "https://safe-lock.github.io/ </a> </b></center>" QMessageBox.about(self, "About", Amsg) return True def getSession(self): self.eng = eng(self.password, self.dbname) Session = sessionmaker(bind=self.eng) self.Base = declarative_base(bind=self.eng) self.Base.metadata.create_all() self.session = Session() return self.session def dragEnterEvent(self, e): if e.mimeData().hasUrls: e.accept() else: e.ignore() def dragMoveEvent(self, e): if e.mimeData().hasUrls: e.accept() else: e.ignore() def dropEvent(self, e): if e.mimeData().hasUrls: e.setDropAction(Qt.CopyAction) e.accept() self.DFiles = [] for url in e.mimeData().urls(): try: if sysname == 'darwin': from Foundation import NSURL fname = NSURL.URLWithString_( url.toString()).filePathURL().path() else: fname = url.toLocalFile() self.DFiles.append(fname) except: pass self.dealD(self.DFiles) else: event.ignore() def in_loop(self): if self.Processing is None: self.Processing = True self.setAcceptDrops(False) self.mIcon.setEnabled(False) self.mInst.setEnabled(False) self.fInst.setText("<center>| Double-Click to cancel |</center>") self.setToolTip("Double-Click anywhere to cancel") else: self.Processing = None self.setAcceptDrops(True) self.mIcon.setEnabled(True) self.mInst.setEnabled(True) self.fInst.setText("<center>| Double-Click for about |</center>") self.setToolTip("Just drag and drop any files or folders" + " to ecrypt or a .sld file to decrypt") def dealD(self, files): def tpp(inp): a = path.basename(inp) return inp.replace(a, '') if len(files) < 1: return False elif len(files) >= 1: if len(files) == 1: tf = files[0].split('.') tf = tf[len(tf) - 1] if tf == 'sld': pw = self.getPass() if pw is None: self.errorMsg("You can't set an empty password !") return False elif not pw: return False if not self.checkP( self.db(sha256(pw).digest(), files[0], dc=False)): self.errorMsg("Wrong password entered, try again.") return False else: fold = self.extTo(tpp(files[0])) if fold is not None: self.CP = fold self.in_loop() self.P = DecryptTH(fold, self.db(pw, files[0], dc=False), sha256(pw).digest()) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) return True pw = self.getPass() if pw is None: self.errorMsg("You can't set an empty password !") elif not pw: pass else: fil = self.saveFile(tpp(files[0])) if fil is not None: if path.isfile(fil): try: remove(fil) except: pass self.CP = fil self.in_loop() self.P = EncryptTH(files, self.db(pw, fil), sha256(pw).digest()) self.P.start() self.P.somesignal.connect(self.handleStatusMessage) self.P.setTerminationEnabled(True) return True @Slot(object) def handleStatusMessage(self, message): self.statusb.setStyleSheet(self.s_loop) def getIT(f, o): return int((f / o) * 100) mm = message.split('/') if mm[len(mm) - 1] == '%': if self.PPbar is None: self.modSB() self.pbar.setValue(getIT(int(mm[0]), int(mm[1]))) self.setWindowTitle("Processing : " + str(getIT(int(mm[0]), int(mm[1]))) + "%") self.plabel.setText(mm[0] + '/' + mm[1]) else: self.unsetCursor() if self.PPbar is not None: self.modSB() if message[:7] == '# Error': if self.Processing: self.in_loop() self.statusb.setStyleSheet(self.s_error) self.cleanup() elif message[:6] == '# Stop': self.statusb.setStyleSheet(self.s_error) elif message[:6] == '# Done': if self.Processing: self.in_loop() self.statusb.setStyleSheet(self.s_norm) elif message == "# Loading": self.setCursor(Qt.BusyCursor) self.statusb.setStyleSheet(self.s_norm) self.setWindowTitle('safelock ' + self.Version) self.statusb.showMessage(message) def mousePressEvent(self, event): if event.type() == QEvent.Type.MouseButtonDblClick: if self.Processing is None: self.aboutMsgg() else: self.closeEvent() def closeEvent(self, event=None): if self.Processing is not None: if event is not None: r = QMessageBox.question( self, "Making sure", "Are you sure you want to exit, during an active" + " process ?", QMessageBox.Yes | QMessageBox.No) else: r = QMessageBox.question(self, "Making sure", "Are you sure, you to cancel ?", QMessageBox.Yes | QMessageBox.No) if r == QMessageBox.Yes: self.P.stop() self.cleanup() if event is not None: self.in_loop() event.accept() else: self.in_loop() else: if event is not None: event.ignore() else: if self.CP is not None: try: if path.isfile(self.CP + '-journal'): remove(self.CP + '-journal') except: pass if event is not None: event.accept() def cleanup(self): if self.CP is not None: try: if path.isfile(self.CP + '-journal'): remove(self.CP + '-journal') if path.isfile(self.CP): remove(self.CP) except: pass
def __init__(self, parent): super(Reports, self).__init__(parent) employee_eval = QLabel("<b>Individual Employee Evaluation</b> " "<br />including comments", self) font = employee_eval.font() font.setPointSize(13) employee_eval.setFont(font) self.employee_eval_print = QPushButton("&PRINT", self) self.employee_eval_pdf = QPushButton("&PDF", self) all_employees = QLabel("<b>All Employees</b> <br />sorted by evaluation " "score", self) all_employees.setFont(font) self.all_employees_print = QPushButton("&PRINT", self) self.all_employees_pdf = QPushButton("&PDF", self) all_employer = QLabel("<b>All Employer Information</b> <br />each employer " "with a list of employees", self) all_employer.setFont(font) self.all_employer_print = QPushButton("&PRINT", self) self.all_employer_pdf = QPushButton("&PDF", self) employee = QLabel("<b>Employee Information</b>", self) employee.setFont(font) self.employee_print = QPushButton("&PRINT", self) self.employee_pdf = QPushButton("&PDF", self) tps_report = QLabel("<b>TPS Report</b> <br />comprehensive total " "performance system", self) tps_report.setFont(font) self.tps_report_print = QPushButton("&PRINT", self) self.tps_report_pdf = QPushButton("&PDF", self) layout = QGridLayout(self) layout.addWidget(employee_eval, 0, 0) layout.addWidget(self.employee_eval_print, 0, 1) layout.addWidget(self.employee_eval_pdf, 0, 2) layout.addWidget(all_employees, 1, 0) layout.addWidget(self.all_employees_print, 1, 1) layout.addWidget(self.all_employees_pdf, 1, 2) layout.addWidget(all_employer, 2, 0) layout.addWidget(self.all_employer_print, 2, 1) layout.addWidget(self.all_employer_pdf, 2, 2) layout.addWidget(employee, 3, 0) layout.addWidget(self.employee_print, 3, 1) layout.addWidget(self.employee_pdf, 3, 2) layout.addWidget(tps_report, 4, 0) layout.addWidget(self.tps_report_print, 4, 1) layout.addWidget(self.tps_report_pdf, 4, 2)
class SyncView(View): """`View` derived class. Defines the sync widget""" sync = Signal((str, )) def __init__(self, parent=None): """ Init method. Initializes parent classes :param parent: Reference to a `QWidget` object to be used as parent """ super(SyncView, self).__init__(parent) self.createWidgets() self.createLayouts() self.setFixedSize(580, 340) self.status.setMessage('Ready') def createLayouts(self): """Put widgets into layouts, thus creating the widget""" mainLayout = QHBoxLayout() fieldsLayout = QVBoxLayout() pathLayout = QHBoxLayout() buttonLayout = QHBoxLayout() mainLayout.addStretch(10) fieldsLayout.addStretch(50) fieldsLayout.addWidget(self.linkLabel) fieldsLayout.addWidget(self.line) fieldsLayout.addWidget(self.localdirLabel) pathLayout.addWidget(self.localdirEdit) pathLayout.addWidget(self.browseButton) fieldsLayout.addLayout(pathLayout) buttonLayout.addStretch(50) buttonLayout.addWidget(self.syncButton, 50, Qt.AlignRight) fieldsLayout.addLayout(buttonLayout) fieldsLayout.addStretch(10) fieldsLayout.addWidget(self.statusLabel) fieldsLayout.addWidget(self.status) fieldsLayout.addStretch(80) mainLayout.addLayout(fieldsLayout, 60) mainLayout.addStretch(10) self.setLayout(mainLayout) def createWidgets(self): """Create children widgets needed by this view""" fieldsWidth = 450 labelsFont = View.labelsFont() editsFont = View.editsFont() self.setLogo() self.localdirLabel = QLabel(self) self.localdirEdit = QLineEdit(self) self.localdirLabel.setText('Choose a folder') self.localdirLabel.setFont(labelsFont) self.localdirEdit.setFixedWidth(fieldsWidth) self.localdirEdit.setReadOnly(False) self.localdirEdit.setFont(editsFont) self.browseButton = QPushButton(self) self.browseButton.setText('Browse') self.browseButton.setFont(labelsFont) self.syncButton = QPushButton(self) self.syncButton.setText('Sync') self.syncButton.setFont(labelsFont) self.browseButton.clicked.connect(self.onBrowseClicked) self.syncButton.clicked.connect(self.onSyncClicked) settings = get_settings() self.localdirEdit.setText(settings.value(SettingsKeys['localdir'], '')) self.statusLabel = QLabel(self) self.statusLabel.setText('Status') self.statusLabel.setFont(View.labelsFont()) self.status = StatusArea(self) @Slot() def onBrowseClicked(self): """Slot. Called when the user clicks on the `browseButton` button""" # Presents the user with a native directory selector window localdir = QFileDialog.getExistingDirectory() localdir = QDir.fromNativeSeparators(localdir) if len(localdir) > 0: # If `localdir`'s value is good, store it using a `QSettings` object # and triggers a sync request. # Careful with '\' separators on Windows. localdir = QDir.toNativeSeparators(localdir) get_settings().setValue(SettingsKeys['localdir'], localdir) self.localdirEdit.setText(localdir) @Slot() def onSyncClicked(self): """Slot. Called when the user clicks on the `syncButton` button""" localdir = self.localdirEdit.text() if len(localdir) > 0: self.syncButton.setEnabled(False) self.sync.emit(localdir)
class MassAttribute_UI(QDialog): """ The main UI """ class Applikator(QObject): """ This is the core applier which toggle the display of the corresponding widget and handling events' connections """ def __init__(self, parent=None): super(MassAttribute_UI.Applikator, self).__init__() self.root = parent def widget_event(self, t): """ Return the correct widget's event depending on attribute's type :param t: the attribute's type :type t: str :return: the event :rtype : Signal """ return { 'float': self.root.W_EDI_float.valueChanged, 'enum': self.root.W_EDI_enum.currentIndexChanged, 'int': self.root.W_EDI_int.valueChanged, 'bool': self.root.W_EDI_bool.stateChanged, 'str': self.root.W_EDI_str.textChanged, 'd3': self.root.W_EDI_d3.valuesChanged, 'd4': self.root.W_EDI_d4.valuesChanged, 'color': self.root.W_EDI_color.colorChanged }[t] def unset_editors(self): """ Toggle off all editors and disconnect the current one """ for widget in (self.root.W_EDI_float, self.root.W_EDI_int, self.root.W_EDI_enum, self.root.W_EDI_bool, self.root.W_EDI_str, self.root.W_EDI_d3, self.root.W_EDI_d4, self.root.W_EDI_color): widget.setVisible(False) # trying to force disconnection try: self.widget_event(self.root.ctx).disconnect( self.root.apply_value) except (KeyError, RuntimeError): pass def prepare(applier_name): """ A decorator to prepare the attribute depending on type for the corresponding widget and getting the attribute's value :param applier_name: attribute's type :type applier_name: str """ def sub_wrapper(func): def wrapper(self, attr_path): self.unset_editors() self.root.ctx = applier_name self.root.__getattribute__('W_EDI_%s' % applier_name).setVisible(True) ret = func(self, cmds.getAttr(attr_path), attr_path) return ret return wrapper return sub_wrapper @staticmethod def get_bounds(obj, attr, min_default, max_default): """ Try to retrieve the range for the given attribute, if min or max fail it'll set default values :param obj: the object's name :type obj: str :param attr: attribute's name :type attr: str :param min_default: minimum default value :param max_default: max default value :type min_default: float | int :type max_default: float | int :return: minimum, maximum :rtype : tuple """ try: assert cmds.attributeQuery(attr, n=obj, mxe=True) maxi = cmds.attributeQuery(attr, n=obj, max=True)[0] except (RuntimeError, AssertionError): maxi = max_default try: assert cmds.attributeQuery(attr, n=obj, mne=True) mini = cmds.attributeQuery(attr, n=obj, min=True)[0] except (RuntimeError, AssertionError): mini = min_default return mini, maxi @prepare('float') def apply_float(self, value, path): """ Float attribute case :param value: attribute's value :param path: attribute's path = obj.attr """ obj, attr = path.split('.', 1) self.root.W_EDI_float.setRange( *self.get_bounds(obj, attr, -100.0, 100.0)) self.root.W_EDI_float.setValue(value) @prepare('enum') def apply_enum(self, value, path): """Enum case""" self.root.W_EDI_enum.clear() obj, attr = path.split('.', 1) try: enums = [ enum.split('=')[0] for enum in cmds.attributeQuery( attr, n=obj, listEnum=True)[0].split(':') ] except RuntimeError: self.apply_int(path) else: self.root.W_EDI_enum.addItems(enums) self.root.W_EDI_enum.setCurrentIndex( enums.index(cmds.getAttr(path, asString=True))) @prepare('int') def apply_int(self, value, path): """Integer case""" obj, attr = path.split('.', 1) self.root.W_EDI_int.setRange( *self.get_bounds(obj, attr, -1000, 1000)) self.root.W_EDI_int.setValue(value) @prepare('bool') def apply_bool(self, value, path): """Boolean case""" self.root.W_EDI_bool.setChecked(value) self.root.W_EDI_bool.setText(path.split('.', 1)[1]) @prepare('str') def apply_str(self, value, path): """String case""" self.root.W_EDI_str.setText(value) @prepare('d3') def apply_d3(self, value, path): """3D array case""" self.root.W_EDI_d3.setValues(value[0]) @prepare('d4') def apply_d4(self, value, path): """4D array case""" self.root.W_EDI_d4.setValues(value[0]) @prepare('color') def apply_color(self, value, path): """Color case""" try: colors = value[0] self.root.W_EDI_color.setColor([int(c * 255) for c in colors]) except TypeError: self.apply_int(value, path) class Attribute(str): """ A custom string attribute class to ship more information into the string variable """ def __new__(cls, path='', super_type=Object): obj, attr = path.split('.', 1) str_obj = str.__new__(cls, attr) str_obj.obj, str_obj.attr = obj, attr str_obj.path = path str_obj.super_type = super_type str_obj.type = None return str_obj # static variables to pre-load icons and attributes short names ctx_icons = { 'float': QIcon(':render_decomposeMatrix.png'), 'enum': QIcon(':showLineNumbers.png'), 'bool': QIcon(':out_decomposeMatrix.png'), 'time': QIcon(':time.svg'), 'byte': QIcon(':out_defaultTextureList.png'), 'angle': QIcon(':angleDim.png'), 'string': QIcon(':text.png'), 'float3': QIcon(':animCurveTA.svg'), 'float4': QIcon(':animCurveTA.svg'), 'color': QIcon(':clampColors.svg') } for ctx in ('doubleLinear', 'double', 'long', 'short'): ctx_icons[ctx] = ctx_icons['float'] ctx_icons['double3'] = ctx_icons['float3'] ctx_icons['double4'] = ctx_icons['float4'] ctx_wide = { 'float': ('float', 'doubleLinear', 'double', 'long', 'short'), 'enum': ('enum', ), 'bool': ('bool', ), 'time': ('time', ), 'byte': ('byte', ), 'angle': ('doubleAngle', ), 'string': ('string', ), 'float3': ('double3', 'float3'), 'float4': ('double4', 'float4'), 'color': ('color', ) } def __init__(self, parent=None): super(MassAttribute_UI, self).__init__(parent) # Abstract self.applier = self.Applikator(self) self.selection = [] self.callback = None self.ctx = None # storing found attributes' types to avoid double check self.solved = {} self.setLocale(QLocale.C) self.setAttribute(Qt.WA_DeleteOnClose) self.setAttribute(Qt.WA_QuitOnClose) self.setFixedWidth(300) self.setWindowTitle('Massive Attribute Modifier') # UI L_main = QVBoxLayout() self.WV_title = QLabel('') self.WV_title.setVisible(False) self.WV_title.setFont(QFont('Verdana', 10)) self.WV_title.setContentsMargins(0, 0, 0, 7) self.WB_select = QPushButton('Select') self.WB_select.setVisible(False) self.WB_select.setFixedWidth(50) self.WB_select.clicked.connect(lambda: cmds.select(self.selection)) self.WB_update = QPushButton('Update') self.WB_update.setFixedWidth(50) self.WB_update.clicked.connect( lambda: self.update_attributes(cmds.ls(sl=True))) self.WV_search = Filter() self.WV_search.textChanged.connect(self.filter) self.WC_cases = QCheckBox('Case sensitive') self.WC_cases.stateChanged.connect(self.filter) self.WC_types = QCheckBox('Type filtering') self.WL_attrtype = QComboBox() self.WL_attrtype.setEnabled(False) for i, ctx in enumerate(sorted(self.ctx_wide)): self.WL_attrtype.addItem(ctx.title()) self.WL_attrtype.setItemIcon(i, self.ctx_icons[ctx]) L_attrtype = line(self.WC_types, self.WL_attrtype) self.WC_types.stateChanged.connect( partial(self.update_attributes, self.selection)) self.WC_types.stateChanged.connect(self.WL_attrtype.setEnabled) self.WL_attrtype.currentIndexChanged.connect(self.filter) self.WC_liveu = QCheckBox('Live') self.WC_liveu.stateChanged.connect(self.WB_update.setDisabled) self.WC_liveu.stateChanged.connect(self.set_callback) self.WC_histo = QCheckBox('Load history') self.WC_histo.setChecked(True) self.WC_histo.stateChanged.connect( partial(self.update_attributes, self.selection)) self.WC_child = QCheckBox('Children') self.WC_child.stateChanged.connect( partial(self.update_attributes, self.selection)) options = group( 'Options', line(self.WC_cases, L_attrtype), line(self.WC_child, self.WC_histo, self.WC_liveu, self.WB_update)) options.layout().setSpacing(2) self.WL_attributes = QTreeWidget() self.WL_attributes.setStyleSheet( 'QTreeView {alternate-background-color: #1b1b1b;}') self.WL_attributes.setAlternatingRowColors(True) self.WL_attributes.setHeaderHidden(True) self.WL_attributes.setRootIsDecorated(False) self.objs_attr = set() self.shps_attr = set() self.W_EDI_float = FloatBox() self.W_EDI_int = IntBox() self.W_EDI_enum = QComboBox() self.W_EDI_bool = QCheckBox() self.W_EDI_str = QLineEdit() self.W_EDI_d3 = Double3() self.W_EDI_d4 = Double4() self.W_EDI_color = ColorPicker() # Final layout L_title = line(self.WV_title, self.WB_select) L_title.setStretch(0, 1) L_main.addLayout(L_title) L_main.setAlignment(Qt.AlignLeft) L_main.addWidget(self.WV_search) L_main.addWidget(options) L_main.addWidget(self.WL_attributes) L_edits = col(self.W_EDI_bool, self.W_EDI_int, self.W_EDI_float, self.W_EDI_enum, self.W_EDI_str, self.W_EDI_d3, self.W_EDI_d4, self.W_EDI_color) L_edits.setContentsMargins(0, 8, 0, 0) L_main.addLayout(L_edits) L_main.setStretch(3, 1) L_main.setSpacing(2) self.appliers = { 'float': self.applier.apply_float, 'enum': self.applier.apply_enum, 'bool': self.applier.apply_bool, 'time': self.applier.apply_float, 'byte': self.applier.apply_int, 'angle': self.applier.apply_float, 'string': self.applier.apply_str, 'float3': self.applier.apply_d3, 'float4': self.applier.apply_d4, 'color': self.applier.apply_color } self.setLayout(L_main) # final settings self.WL_attributes.itemSelectionChanged.connect(self.update_setter) self.applier.unset_editors() def closeEvent(self, *args, **kwargs): self.set_callback(False) def set_callback(self, state): """ Toggle selection event callback :param state: checkbox's state :type state: bool | int """ if state and not self.callback: self.callback = MEventMessage.addEventCallback( 'SelectionChanged', self.update_attributes) self.update_attributes(cmds.ls(sl=True)) elif not state and self.callback: MMessage.removeCallback(self.callback) self.callback = None @staticmethod def format_title(nodes): """ Extract the matching characters from a given nodes selection, if begin matches it will return "joint*" with a wildcard when names don't match :param nodes: objects' list :type nodes: list | tuple :return: the formatted name with the corresponding characters :rtype : str """ res = None if nodes: # we get the first node as a reference node = nodes[0] # and compare with the other nodes subs = [w for w in nodes if w != node] l = 1 valid = True # will continue until l (length) match the full name's length or until names don't match while l < len(node) and valid: for sub in subs: if not sub.startswith(node[:l]): valid = False break else: l += 1 # if matching characters isn't long enough we only display the number of nodes selected if l <= 3: res = '%i objects' % len(nodes) # otherwise showing matching pattern elif l < len(node) or len(nodes) > 1: res = node[:l - 1] + '* (%i objects)' % len(nodes) else: res = node return res @staticmethod def get_history(node): """ Extract history for the given node :rtype: list """ return cmds.listHistory(node, il=2, pdo=True) or [] @staticmethod def get_shapes(node): """ Extract shape(s) for the given node :rtype: list """ return cmds.listRelatives(node, s=True, ni=True, f=True) def get_attributes_type(self, attrs): """ For a given list of attributes of type Attribute, will loop through and fill the type parameter of the attribute with the corresponding type, if type is invalid or not handled, it'll remove it :param attrs: attributes' list :type attrs: [MassAttribute_UI.Attribute] :return: cleaned and filled attributes' list :rtype: [MassAttribute_UI.Attribute] """ attrs = list(attrs) # first we sort the attributes' list attrs.sort() # then we try to extract the attribute's type for i, attr in enumerate(attrs): try: if attr.attr in self.solved: attr.type = self.solved[attr.attr] raise RuntimeError tpe = cmds.getAttr(attr.path, typ=True) assert tpe attr.type = tpe self.solved[attr.attr] = tpe except (AssertionError, ValueError, RuntimeError): pass # defining a to-remove list rm_list = set() layers = {'3': 'XYZ', '4': 'XYZW'} for i, attr in enumerate(attrs): if i in rm_list: continue # we handle some special cases here, if ever the attribute list contains RGB and separate R, G and B we # assume it's a color, if it's a double3 or float3 and we find the corresponding XYZ, we remove then to # avoid duplicates if attr.endswith('RGB'): if '%sR' % attr[:-3] in attrs: attr.type = 'color' for chan in 'RGB': rm_list.add(attrs.index('%s%s' % (attr[:-3], chan))) # if the attribute's type isn't in the list, we remove elif attr.type not in MassAttribute_UI.ctx_icons: rm_list.add(i) elif attr.endswith('R'): if '%sG' % attr[:-1] in attrs and attr[:-1] in attrs: attr.type = 'color' for chan in 'RGB': rm_list.add(attrs.index('%s%s' % (attr[:-1], chan))) elif attr.type in ('double3', 'double4', 'float3', 'float4'): if '%sX' % attr in attrs: for chan in layers[attr.type[-1]]: rm_list.add(attrs.index('%s%s' % (attr, chan))) # finally cleaning the list for i in sorted(rm_list, reverse=True): attrs.pop(i) return attrs def apply_value(self, value): """ When the value is modified in the UI, we forward the given value and applies to the object's :param value: attribute's value, mixed type :type value: mixed """ # We get the only selected object in list and get it's super type (Shape, History or Object) and # type (float, int, string) item = self.WL_attributes.selectedItems()[0] attr = item.attribute shape = attr.super_type == Shape histo = attr.super_type == History tpe = item.attribute.type # eq dict for each context value = { 'bool': bool, 'int': int, 'float': float, 'enum': int, 'str': str, 'd3': list, 'd4': list, 'color': list }[self.ctx](value) # converting the selection into a set cmds.undoInfo(openChunk=True) targets = set(self.selection) # we propagate to children if 'Children' checkbox is on if self.WC_child.isChecked(): for obj in list(targets): targets |= set(cmds.listRelatives(obj, ad=True)) # if the target attribute is on the history, we add all selection's history to the list if histo: for obj in list(targets): targets.remove(obj) targets |= set(self.get_history(obj)) # then we loop through target objects for obj in targets: # if the target is on the shape we get object's shape if shape and not histo: shapes = self.get_shapes(obj) if obj in shapes: continue else: obj = shapes[0] # then we try to apply depending on attribute's type try: correct_path = attr.path.replace(attr.obj, obj) if tpe == 'string': cmds.setAttr(correct_path, value, type='string') elif tpe in ('double3', 'double4', 'float3', 'float4', 'color'): cmds.setAttr(correct_path, *value, type='double%d' % len(value)) else: cmds.setAttr(correct_path, value) except RuntimeError: pass cmds.undoInfo(closeChunk=True) def update_setter(self): """ When the list's selection changes we update the applier widget """ item = self.WL_attributes.selectedItems() # abort if no item is selected if not len(item): return # getting attribute's parameter attr = item[0].attribute if len(self.selection): try: # looping until we find a context having the current attribute's type for applier in self.ctx_wide: if attr.type in self.ctx_wide[applier]: break # then we apply for the given path (obj.attribute) self.appliers[applier](attr.path) # and connecting event to the self.apply_value function self.applier.widget_event(self.ctx).connect(self.apply_value) # otherwise selection or type is invalid except IndexError: self.ctx = None def update_attributes(self, selection=None, *args): """ Update the attributes for the given selection, looping through objects' attributes, finding attr in common between all objects then cleaning the lists, doing the same for shapes and / or histories :param selection: object's selection """ # redefining lists as set to intersect union etc self.objs_attr = set() self.shps_attr = set() # pre init self.WL_attributes.clear() self.applier.unset_editors() self.selection = selection or (cmds.ls( sl=True) if self.WC_liveu.isChecked() else self.selection) self.WV_title.setText(self.format_title(self.selection)) self.WV_title.setVisible(bool(len(self.selection))) self.WB_select.setVisible(bool(len(self.selection))) if not len(self.selection): return def get_usable_attrs(obj, super_type): """ Small internal function to get a compatible attributes' list for the given object and assign the given super_type to it (Object, Shape or History) :param obj: object's name :type obj: str :param super_type: attribute's main type :type super_type: Object | Shape | History :return: """ return set([ MassAttribute_UI.Attribute('%s.%s' % (obj, attr), super_type) for attr in cmds.listAttr( obj, se=True, ro=False, m=True, w=True) ]) if len(self.selection): self.objs_attr = get_usable_attrs(self.selection[0], Object) # if we also want the object's history we add it to the initial set if self.WC_histo.isChecked(): for histo in self.get_history(self.selection[0]): self.objs_attr |= get_usable_attrs(histo, History) # filling the shape's set for shape in (self.get_shapes(self.selection[0]) or []): self.shps_attr |= get_usable_attrs(shape, Shape) # if selection's length bigger than one we compare by intersection with the other sets if len(self.selection) > 1: for obj in self.selection: sub_attr = get_usable_attrs(obj, Object) if self.WC_histo.isChecked(): for histo in self.get_history(obj): sub_attr |= get_usable_attrs(histo, History) self.objs_attr.intersection_update(sub_attr) for shape in (self.get_shapes(self.selection[0]) or []): self.shps_attr.intersection_update( get_usable_attrs(shape, Shape)) # finally getting all intersecting attributes' types self.objs_attr = self.get_attributes_type(self.objs_attr) self.shps_attr = self.get_attributes_type(self.shps_attr) # and filtering the list self.filter() def add_set(self, iterable, title=None): """ Adding the given iterable to the list with a first Separator object with given title :param iterable: list of item's attributes :param title: Separator's name """ if len(iterable): # if title is given we first add a Separator item to indicate coming list title if title: self.WL_attributes.addTopLevelItem( QTreeWidget_Separator(title)) items = [] for attr in sorted(iterable): item = QTreeWidgetItem([attr]) # assigning the attribute itself inside a custom parameter item.attribute = attr items.append(item) # finally adding all the items to the list self.WL_attributes.addTopLevelItems(items) def filter(self): """ Filter the list with UI's parameters, such as name or type filtering, etc """ # pre cleaning self.WL_attributes.clear() # using regex compile to avoid re execution over many attributes mask = self.WV_search.text() case = 0 if self.WC_cases.isChecked() else re.IGNORECASE re_start = re.compile(r'^%s.*?' % mask, case) re_cont = re.compile(r'.*?%s.*?' % mask, case) # getting the four different lists obj_start = set([at for at in self.objs_attr if re_start.search(at)]) shp_start = set([at for at in self.shps_attr if re_start.search(at)]) # if type filtering is one we only extract the wanted attribute's type if self.WC_types.isChecked(): obj_start = set([ at for at in obj_start if at.type in self.ctx_wide[ self.WL_attrtype.currentText().lower()] ]) shp_start = set([ at for at in shp_start if at.type in self.ctx_wide[ self.WL_attrtype.currentText().lower()] ]) # finally adding the current sets if there is a mask we add the also the containing matches if mask: # getting contains filtering and type containers filtering obj_contains = obj_start.symmetric_difference( set([at for at in self.objs_attr if re_cont.search(at)])) shp_contains = shp_start.symmetric_difference( set([at for at in self.shps_attr if re_cont.search(at)])) if self.WC_types.isChecked(): obj_contains = set([ at for at in obj_contains if at.type in self.ctx_wide[ self.WL_attrtype.currentText().lower()] ]) shp_contains = set([ at for at in shp_contains if at.type in self.ctx_wide[ self.WL_attrtype.currentText().lower()] ]) # adding the sets self.add_set(obj_start, 'Obj attributes starting with') self.add_set(obj_contains, 'Obj attributes containing') self.add_set(shp_start, 'Shape attributes starting with') self.add_set(shp_contains, 'Shape attributes containing') else: self.add_set(obj_start, 'Object\'s attributes') self.add_set(shp_start, 'Shape\'s attributes') # and we select the first one if ever there is something in the list if self.WL_attributes.topLevelItemCount(): self.WL_attributes.setItemSelected( self.WL_attributes.topLevelItem(1), True)