From f31e665135a56ac5ee89b8db1a1a777e4da12449 Mon Sep 17 00:00:00 2001 From: Jason Lobo Date: Thu, 1 Oct 2020 19:51:38 +0100 Subject: [PATCH] Create display.py --- display.py | 424 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 424 insertions(+) create mode 100644 display.py diff --git a/display.py b/display.py new file mode 100644 index 0000000..a74623f --- /dev/null +++ b/display.py @@ -0,0 +1,424 @@ +import search +import sys +import webbrowser +from multiprocessing import freeze_support +from pathlib import Path +from PyQt5 import QtCore, QtGui, QtWidgets +from PyQt5.QtCore import QObject, QRunnable, QThreadPool, pyqtSignal, pyqtSlot +from PyQt5.QtWidgets import QButtonGroup + + +results_sorted = [] + + +class WorkerSignals(QObject): + search_signal = pyqtSignal(object) + + +class Worker(QRunnable): + def __init__(self, fn): + super(Worker, self).__init__() + self.fn = fn + self.signals = WorkerSignals() + + @pyqtSlot() + def run(self): + results_sorted = self.fn() + self.signals.search_signal.emit(results_sorted) + + +class Ui_MainWindow(object): + + def __init__(self): + self.threadpool = QThreadPool() + # print("Multithreading with maximum %d threads" % self.threadpool.maxThreadCount()) + + + def setupUi(self, MainWindow): + MainWindow.setObjectName("MainWindow") + MainWindow.resize(1209, 851) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Midlight, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Mid, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Shadow, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Highlight, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.AlternateBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ToolTipBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Midlight, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Mid, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Shadow, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Highlight, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.AlternateBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ToolTipBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Button, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Midlight, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Mid, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Base, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Window, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Shadow, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 120, 215)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Highlight, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.AlternateBase, brush) + brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ToolTipBase, brush) + MainWindow.setPalette(palette) + self.centralwidget = QtWidgets.QWidget(MainWindow) + self.centralwidget.setObjectName("centralwidget") + self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) + self.gridLayout.setContentsMargins(0, 0, 0, 0) + self.gridLayout.setObjectName("gridLayout") + self.scrollArea = QtWidgets.QScrollArea(self.centralwidget) + self.scrollArea.setFrameShape(QtWidgets.QFrame.NoFrame) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setObjectName("scrollArea") + self.scrollAreaWidgetContents = QtWidgets.QWidget() + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 1209, 851)) + self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") + self.gridLayout_2 = QtWidgets.QGridLayout(self.scrollAreaWidgetContents) + self.gridLayout_2.setObjectName("gridLayout_2") + self.frame = QtWidgets.QFrame(self.scrollAreaWidgetContents) + self.frame.setMaximumSize(QtCore.QSize(1100, 16777215)) + self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) + self.frame.setFrameShadow(QtWidgets.QFrame.Raised) + self.frame.setObjectName("frame") + self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame) + self.verticalLayout_4.setObjectName("verticalLayout_4") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.lineEdit = QtWidgets.QLineEdit(self.frame) + font = QtGui.QFont() + font.setFamily("Segoe UI Light") + font.setPointSize(20) + self.lineEdit.setFont(font) + self.lineEdit.setFrame(False) + self.lineEdit.setObjectName("lineEdit") + self.horizontalLayout.addWidget(self.lineEdit) + self.Search = QtWidgets.QPushButton(self.frame) + self.Search.setMinimumSize(QtCore.QSize(125, 0)) + font = QtGui.QFont() + font.setFamily("Segoe UI Light") + font.setPointSize(20) + self.Search.setFont(font) + self.Search.setFlat(True) + self.Search.setObjectName("Search") + self.Search.setStyleSheet("QPushButton {background-color: white}" + "QPushButton:hover {background-color: white}" + "QPushButton:pressed {border: solid}" + "QPushButton:pressed {border-width: 1px}" + "QPushButton:pressed {border-top-color: #808080}" + "QPushButton:pressed {border-left-color: #808080}" + "QPushButton:pressed {border-right-color: #CDCDCD}" + "QPushButton:pressed {border-bottom-color: #CDCDCD}") + + self.Search.clicked.connect(self.search_button_worker) + + + self.horizontalLayout.addWidget(self.Search) + self.verticalLayout.addLayout(self.horizontalLayout) + self.line = QtWidgets.QFrame(self.frame) + palette = QtGui.QPalette() + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Active, QtGui.QPalette.PlaceholderText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Inactive, QtGui.QPalette.PlaceholderText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.WindowText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Dark, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.Text, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.ButtonText, brush) + brush = QtGui.QBrush(QtGui.QColor(0, 0, 0, 128)) + brush.setStyle(QtCore.Qt.SolidPattern) + palette.setBrush(QtGui.QPalette.Disabled, QtGui.QPalette.PlaceholderText, brush) + self.line.setPalette(palette) + self.line.setFrameShape(QtWidgets.QFrame.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Sunken) + self.line.setObjectName("line") + self.verticalLayout.addWidget(self.line) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_2.addItem(spacerItem) + self.Clear = QtWidgets.QPushButton(self.frame) + self.Clear.setMinimumSize(QtCore.QSize(125, 0)) + font = QtGui.QFont() + font.setFamily("Segoe UI Light") + font.setPointSize(20) + self.Clear.setFont(font) + self.Clear.setFlat(True) + self.Clear.setObjectName("Clear") + self.Clear.setStyleSheet("QPushButton {background-color: white}" + "QPushButton:hover {background-color: white}" + "QPushButton:pressed {border: solid}" + "QPushButton:pressed {border-width: 1px}" + "QPushButton:pressed {border-top-color: #808080}" + "QPushButton:pressed {border-left-color: #808080}" + "QPushButton:pressed {border-right-color: #CDCDCD}" + "QPushButton:pressed {border-bottom-color: #CDCDCD}") + + self.Clear.clicked.connect(lambda state, spacer=True: self.clear_button(spacer)) + + self.horizontalLayout_2.addWidget(self.Clear) + self.verticalLayout.addLayout(self.horizontalLayout_2) + self.verticalLayout_4.addLayout(self.verticalLayout) + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + + spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem3) + self.verticalLayout_4.addLayout(self.verticalLayout_2) + self.gridLayout_2.addWidget(self.frame, 0, 0, 1, 1) + self.scrollArea.setWidget(self.scrollAreaWidgetContents) + self.gridLayout.addWidget(self.scrollArea, 0, 1, 1, 1) + MainWindow.setCentralWidget(self.centralwidget) + + self.retranslateUi(MainWindow) + QtCore.QMetaObject.connectSlotsByName(MainWindow) + + + def search_function(self, MainWindow, results_sorted): + self.buttongroup = QButtonGroup() + self.buttongroup.buttonClicked[int].connect(self.open_button) + for i, result in enumerate(results_sorted): + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_" + str(i)) + self.textEdit = QtWidgets.QTextEdit(self.frame) + # self.textEdit.setMinimumSize(QtCore.QSize(0, 110)) + # self.textEdit.setMaximumSize(QtCore.QSize(16777215, 110)) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(12) + + fontMetrics = QtGui.QFontMetrics(font) + result_2_text_size = fontMetrics.size(0, str(result[2])).width() + result_1_text_size = fontMetrics.size(0, str(result[1])).width() + self.textEdit.setMinimumSize(QtCore.QSize(0, 60 + 25 * ((int(result_2_text_size / 900) + 1) + (int(result_1_text_size / 900) + 1)))) + self.textEdit.setMaximumSize(QtCore.QSize(16777215, 60 + 25 * ((int(result_2_text_size / 900) + 1) + (int(result_1_text_size / 900) + 1)))) + + self.textEdit.setFont(font) + self.textEdit.setFrameShape(QtWidgets.QFrame.NoFrame) + self.textEdit.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.textEdit.setObjectName("textEdit_" + str(i)) + self.horizontalLayout_3.addWidget(self.textEdit) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) + self.horizontalLayout_3.addItem(spacerItem1) + self.Open_1 = QtWidgets.QPushButton(self.frame) + + self.buttongroup.addButton(self.Open_1, i) + + self.Open_1.setMinimumSize(QtCore.QSize(125, 0)) + font = QtGui.QFont() + font.setFamily("Segoe UI Light") + font.setPointSize(20) + self.Open_1.setFont(font) + self.Open_1.setFlat(True) + self.Open_1.setObjectName("Open_" + str(i)) + self.Open_1.setStyleSheet("QPushButton {background-color: white}" + "QPushButton:hover {background-color: white}" + "QPushButton:pressed {border: solid}" + "QPushButton:pressed {border-width: 1px}" + "QPushButton:pressed {border-top-color: #808080}" + "QPushButton:pressed {border-left-color: #808080}" + "QPushButton:pressed {border-right-color: #CDCDCD}" + "QPushButton:pressed {border-bottom-color: #CDCDCD}") + self.horizontalLayout_3.addWidget(self.Open_1) + self.verticalLayout_2.addLayout(self.horizontalLayout_3) + spacerItem2 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) + self.verticalLayout_2.addItem(spacerItem2) + + _translate = QtCore.QCoreApplication.translate + self.textEdit.setHtml(_translate("MainWindow", "\n" +"\n" +"

" + str(result[2]) + "

" +"


\n" +"

" + str(result[1])[:85] + "

")) + self.Open_1.setText(_translate("MainWindow", "Open")) + + + def open_button(self, id): + webbrowser.open(results_sorted[id][3], new=1) + + + def retranslateUi(self, MainWindow): + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) + self.Search.setText(_translate("MainWindow", "Search")) + self.Clear.setText(_translate("MainWindow", "Clear")) + + + def search_button_worker(self): + worker = Worker(self.search_button_signal) + worker.signals.search_signal.connect(self.search_button_slot) + + self.threadpool.start(worker) + + + def search_button_signal(self): + global results_sorted + + results_sorted = search.search_results(self.lineEdit.text(), self.base_path()) + + return results_sorted + + + def search_button_slot(self, results_sorted): + self.clear_button(False) + self.search_function(MainWindow, results_sorted) + + spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem3) + + + def clear_button(self, spacer): + + try: + i = 0 + while self.frame.findChild(QtWidgets.QPushButton, "Open_" + str(i)) != None: + self.frame.findChild(QtWidgets.QPushButton, "Open_" + str(i)).deleteLater() + i+=1 + except Exception as e: + print(e) + + try: + i = 0 + while self.frame.findChild(QtWidgets.QTextEdit, "textEdit_" + str(i)) != None: + self.frame.findChild(QtWidgets.QTextEdit, "textEdit_" + str(i)).deleteLater() + i+=1 + except Exception as e: + print(e) + + try: + for i in reversed(range(self.verticalLayout_2.count())): #range(len(results_sorted)+10): # + if isinstance(self.verticalLayout_2.itemAt(i), QtWidgets.QSpacerItem): + self.verticalLayout_2.takeAt(0) + except Exception as e: + print(e) + + if spacer: + spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) + self.verticalLayout_2.addItem(spacerItem3) + + + def base_path(self): + try: + base_path = sys._MEIPASS + except Exception: + base_path = Path.resolve(".") + + return Path(base_path) + + +if __name__ == "__main__": + freeze_support() + import sys + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() + ui = Ui_MainWindow() + ui.setupUi(MainWindow) + MainWindow.setWindowTitle("The Chomsky Index") + MainWindow.setWindowIcon(QtGui.QIcon(str(ui.base_path() / 'png' / 'icon_white.png'))) + MainWindow.show() + sys.exit(app.exec_())