Ejemplo n.º 1
0
class Main_Window(QMainWindow):
    def __init__(self):
        super(Main_Window, self).__init__()

        self.menubar = QMenuBar(self)
        self.statusbar = QStatusBar(self)
        self.centralwidget = QWidget(self)
        self.image_view = Image_View(self.centralwidget)
        self.horizontal_slider = QSlider(self.centralwidget)

        self.setup_ui()

    def setup_ui(self):
        # 1. self info
        self.setObjectName("Demo_1")
        self.resize(800, 600)

        # 2.1 sub widgets
        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 22))
        self.menubar.setObjectName("menubar")
        self.setMenuBar(self.menubar)

        # 2.2
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        # 2.3
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)

        self.image_view.setGeometry(QtCore.QRect(144, 10, 512, 512))
        self.image_view.setObjectName("image_view")

        self.horizontal_slider.setGeometry(QtCore.QRect(144, 530, 512, 22))
        self.horizontal_slider.setOrientation(QtCore.Qt.Horizontal)
        self.horizontal_slider.setObjectName("horizontal_slider")

        # 3 signals and slots
        self.horizontal_slider.valueChanged['int'].connect(self.image_view.repaint)
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        screen = app.primaryScreen()
        screenHeight = screen.size().height()
        screenWidth = screen.size().width()
        MainWindow.setObjectName("MainWindow")
        MainWindow.setFixedSize(1125, 800)
        MainWindow.setAutoFillBackground(False)
        myappid = u'Risk_Identefier'  # arbitrary string
        ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid)
        self.setWindowIcon(QtGui.QIcon('logo.png'))
        self.filedialog = QFileDialog()
        self.filedialog.setFixedSize(500, 500)
        self.fileName = ""
        self.msg = QMessageBox()
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.centralwidget.setStyleSheet("background: #707070;")
        self.progressBar = QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QtCore.QRect(50, 835 - 103, 200, 23))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.progressBar.hide()
        self.progressBarLabel = QLabel(self.centralwidget)
        self.progressBarLabel.setWordWrap(True)
        self.progressBarLabel.setGeometry(QtCore.QRect(500, 835 - 103, 300,
                                                       25))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.progressBarLabel.setFont(font)
        self.progressBarLabel.setObjectName("progressBarLabel")
        self.progressBarLabel.setStyleSheet("color: #effeff;")
        self.hideProgNumLabel = QLabel(self.centralwidget)
        self.hideProgNumLabel.setGeometry(QtCore.QRect(215, 835 - 103, 50, 23))
        self.hideProgNumLabel.setObjectName("hideProgNumLabel")
        self.hideProgNumLabel.setStyleSheet("background: #707070;")
        self.radioButtonML = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButtonML.setGeometry(QtCore.QRect(30, 640 - 103, 180, 23))
        self.radioButtonML.setObjectName("radioButtonML")
        self.radioButtonML.setFont(font)
        self.radioButtonML.setStyleSheet(
            "QRadioButton{color:#effeff} QRadioButton:indicator { image: url('images/uncheckedRadio.png'); width:20px; height: 150px;} QRadioButton:indicator:checked {image: url('images/radioChecked.png');}"
        )
        self.radioButtonML.setCursor(
            QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.radioButtonML.setChecked(True)
        self.radioButtonSearch = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButtonSearch.setGeometry(QtCore.QRect(
            30, 700 - 103, 171, 23))
        self.radioButtonSearch.setObjectName("radioButtonSearch")
        self.radioButtonSearch.setFont(font)
        self.radioButtonSearch.setStyleSheet(
            "QRadioButton{color:#effeff} QRadioButton:indicator { image: url('images/uncheckedRadio.png'); width:20px; height: 150px;} QRadioButton:indicator:checked {image: url('images/radioChecked.png');}"
        )
        self.radioButtonSearch.setCursor(
            QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.browseButton = QPushButton(self.centralwidget)
        self.browseButton.setGeometry(QtCore.QRect(30, 460 - 103, 171, 41))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.browseButton.setFont(font)
        self.browseButton.setAutoDefault(False)
        self.browseButton.setFlat(False)
        self.browseButton.setObjectName("browseButton")
        self.browseButton.setStyleSheet(
            "QPushButton{background: #914ed4; border-radius: 10px; color: #effeff; border: 3px outset black;} QPushButton:hover{background : #4838e8; border: 3px outset white;};"
        )
        self.browseButton.setCursor(QtGui.QCursor(
            QtCore.Qt.PointingHandCursor))
        self.titlePicture = QLabel(self.centralwidget)
        self.titlePicture.setGeometry(QtCore.QRect(0, 0, 1154, 347))
        self.titlePicture.setText("")
        self.titlePicture.setStyleSheet(
            "background-image: url('images/background.jpg')")
        self.titlePicture.setObjectName("titlePicture")
        self.logoPicture = QLabel(self.centralwidget)
        self.logoPicture.setGeometry(QtCore.QRect(975, 0, 150, 90))
        self.logoPicture.setText("")
        self.logoPicture.setStyleSheet(
            "background-image: url('images/logo.png')")
        self.logoPicture.setObjectName("logoPicture")
        self.title = QLabel(self.centralwidget)
        self.title.setGeometry(QtCore.QRect(50, 200, 381, 61))
        self.title.setStyleSheet("background: transparent; color: #effeff;")
        font = QtGui.QFont()
        font.setFamily("Times New Roman")
        font.setPointSize(40)
        font.setBold(True)
        font.setWeight(75)
        self.title.setFont(font)
        self.title.setObjectName("title")
        self.runButton = QPushButton(self.centralwidget)
        self.runButton.setGeometry(QtCore.QRect(282, 735 - 103, 561, 81))
        font = QtGui.QFont()
        font.setPointSize(20)
        self.runButton.setFont(font)
        self.runButton.setObjectName("runButton")
        self.runButton.setStyleSheet(
            "QPushButton{background: #914ed4; border-radius: 10px; color: #effeff; border: 3px outset black;} QPushButton:hover{background : #4838e8; border: 3px outset white;};"
        )
        self.runButton.setDefault(True)
        self.runButton.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.positiveCheckBox = QCheckBox(self.centralwidget)
        self.positiveCheckBox.setGeometry(QtCore.QRect(860, 530 - 103, 191,
                                                       20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.positiveCheckBox.setFont(font)
        self.positiveCheckBox.setChecked(True)
        self.positiveCheckBox.setObjectName("positiveCheckBox")
        self.positiveCheckBox.setStyleSheet(
            "QCheckBox{color:#effeff} QCheckBox:indicator { image: url('images/unchecked.png'); width:20px; height: 150px;} QCheckBox:indicator:checked {image: url('images/checked.png');}"
        )
        self.positiveCheckBox.setCursor(
            QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.negativeCheckBox = QCheckBox(self.centralwidget)
        self.negativeCheckBox.setChecked(True)
        self.negativeCheckBox.setGeometry(QtCore.QRect(860, 650 - 103, 191,
                                                       20))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.negativeCheckBox.setFont(font)
        self.negativeCheckBox.setAutoFillBackground(False)
        self.negativeCheckBox.setChecked(True)
        self.negativeCheckBox.setObjectName("negativeCheckBox")
        self.negativeCheckBox.setStyleSheet(
            "QCheckBox{color:#effeff} QCheckBox:indicator { image: url('images/unchecked.png'); width:20px; height: 150px;} QCheckBox:indicator:checked {image: url('images/checked.png');}"
        )
        self.negativeCheckBox.setCursor(
            QtGui.QCursor(QtCore.Qt.PointingHandCursor))
        self.positiveInput = QTextEdit(self.centralwidget)
        self.positiveInput.setGeometry(QtCore.QRect(500, 510 - 103, 331, 71))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.positiveInput.setFont(font)
        self.positiveInput.setObjectName("positiveInput")
        self.positiveInput.setStyleSheet(
            "background: white; border-radius: 10px;")
        self.positiveInput.setText(",".join(positiveList))
        self.negativeInput = QTextEdit(self.centralwidget)
        self.negativeInput.setGeometry(QtCore.QRect(500, 630 - 103, 331, 71))
        font = QtGui.QFont()
        font.setPointSize(10)
        self.negativeInput.setFont(font)
        self.negativeInput.setObjectName("negativeInput")
        self.negativeInput.setStyleSheet(
            "background: white; border-radius: 10px")
        self.negativeInput.setText(",".join(negativeList))
        self.sheetInput = QLineEdit(self.centralwidget)
        self.sheetInput.setGeometry(QtCore.QRect(30, 580 - 103, 171, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.sheetInput.setFont(font)
        self.sheetInput.setObjectName("sheetInput")
        self.sheetInput.setStyleSheet("background: white; border-radius: 10px")
        self.columnInput = QLineEdit(self.centralwidget)
        self.columnInput.setGeometry(QtCore.QRect(250, 580 - 103, 171, 31))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.columnInput.setFont(font)
        self.columnInput.setText("")
        self.columnInput.setObjectName("columnInput")
        self.columnInput.setStyleSheet(
            "background: white; border-radius: 10px")
        self.sheetNameLabel = QLabel(self.centralwidget)
        self.sheetNameLabel.setGeometry(QtCore.QRect(30, 550 - 103, 131, 21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.sheetNameLabel.setFont(font)
        self.sheetNameLabel.setObjectName("sheetNameLabel")
        self.sheetNameLabel.setStyleSheet("color: #effeff;")
        self.columnNameLabel = QLabel(self.centralwidget)
        self.columnNameLabel.setGeometry(QtCore.QRect(250, 550 - 103, 131, 16))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.columnNameLabel.setFont(font)
        self.columnNameLabel.setObjectName("columnNameLabel")
        self.columnNameLabel.setStyleSheet("color: #effeff;")
        self.positiveWordsLabel = QLabel(self.centralwidget)
        self.positiveWordsLabel.setGeometry(
            QtCore.QRect(500, 480 - 103, 601, 21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.positiveWordsLabel.setFont(font)
        self.positiveWordsLabel.setObjectName("positiveWordsLabel")
        self.positiveWordsLabel.setStyleSheet("color: #effeff;")
        self.negativeWordsLabel = QLabel(self.centralwidget)
        self.negativeWordsLabel.setGeometry(
            QtCore.QRect(500, 600 - 103, 611, 21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.negativeWordsLabel.setFont(font)
        self.negativeWordsLabel.setObjectName("negativeWordsLabel")
        self.negativeWordsLabel.setStyleSheet("color: #effeff;")
        self.selectedFileLabel = QLabel(self.centralwidget)
        self.selectedFileLabel.setGeometry(
            QtCore.QRect(225, 470 - 103, 270, 25))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.selectedFileLabel.setFont(font)
        self.selectedFileLabel.setText("")
        self.selectedFileLabel.setObjectName("selectedFileLabel")
        self.selectedFileLabel.setStyleSheet("color: #effeff;")
        self.searchInput = QTextEdit(self.centralwidget)
        self.searchInput.setGeometry(QtCore.QRect(500, 580 - 103, 601, 100))
        font = QtGui.QFont()
        font.setPointSize(12)
        self.searchInput.setFont(font)
        self.searchInput.setObjectName("sheetInput")
        self.searchInput.setStyleSheet(
            "background: white; border-radius: 10px")
        self.searchInputLabel = QLabel(self.centralwidget)
        self.searchInputLabel.setGeometry(QtCore.QRect(500, 550 - 103, 611,
                                                       21))
        font = QtGui.QFont()
        font.setPointSize(14)
        self.searchInputLabel.setFont(font)
        self.searchInputLabel.setObjectName("searchInputLabel")
        self.searchInputLabel.setStyleSheet("color: #effeff;")
        self.searchInput.hide()
        self.searchInputLabel.hide()

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1125, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.stop_words = stopwords.words('english')
        extended_stop_words = ['from', 're', 'use', 'any', 'also', 'known']
        self.stop_words.extend(extended_stop_words)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Risks Identifier"))
        self.browseButton.setText(_translate("MainWindow", "Browse For File"))
        self.radioButtonML.setText(_translate("MainWindow",
                                              "Machine Learning"))
        self.radioButtonSearch.setText(
            _translate("MainWindow", "Normal Search"))
        self.title.setText(_translate("MainWindow", "Risks Identifier"))
        self.runButton.setText(_translate("MainWindow", "Run Tool"))
        self.positiveCheckBox.setText(
            _translate("MainWindow", "Default Positive Words"))
        self.negativeCheckBox.setText(
            _translate("MainWindow", "Default Negative Words"))
        self.sheetNameLabel.setText(_translate("MainWindow", "Sheet Name:"))
        self.columnNameLabel.setText(_translate("MainWindow", "Column Name:"))
        self.progressBarLabel.setText(_translate("MainWindow", ""))
        self.positiveWordsLabel.setText(
            _translate(
                "MainWindow",
                "Positive words separated by commas (words must exist in documents):"
            ))
        self.negativeWordsLabel.setText(
            _translate(
                "MainWindow",
                "Negative words separated by commas (words must exist in documents):"
            ))
        self.searchInputLabel.setText(
            _translate("MainWindow",
                       "Words to search for seperated by commas:"))
Ejemplo n.º 3
0
class MainWindowUI(object):

    title = "Synspy Launcher"

    def __init__(self, MainWin):
        super(MainWindow).__init__()

        # Main Window
        MainWin.setObjectName("MainWindow")
        MainWin.setWindowTitle(
            MainWin.tr("%s %s" % (self.title, synspy_version)))
        MainWin.resize(800, 600)
        self.centralWidget = QWidget(MainWin)
        self.centralWidget.setObjectName("centralWidget")
        MainWin.setCentralWidget(self.centralWidget)
        self.verticalLayout = QVBoxLayout(self.centralWidget)
        self.verticalLayout.setContentsMargins(11, 11, 11, 11)
        self.verticalLayout.setSpacing(6)
        self.verticalLayout.setObjectName("verticalLayout")

        # Splitter for Worklist/Log
        self.splitter = QSplitter(Qt.Vertical)

        # Table View (Work list)
        self.workList = TableWidget(self.centralWidget)
        self.workList.setObjectName("tableWidget")
        self.workList.setStyleSheet("""
            QTableWidget {
                    border: 2px solid grey;
                    border-radius: 5px;
            }
            """)
        self.workList.setEditTriggers(
            QAbstractItemView.NoEditTriggers
        )  # use NoEditTriggers to disable editing
        self.workList.setAlternatingRowColors(True)
        self.workList.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.workList.setSelectionMode(QAbstractItemView.SingleSelection)
        self.workList.verticalHeader().setDefaultSectionSize(
            18)  # tighten up the row size
        self.workList.horizontalHeader().setStretchLastSection(True)
        # self.workList.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch)
        self.workList.setSortingEnabled(True)  # allow sorting
        self.workList.setContextMenuPolicy(Qt.ActionsContextMenu)
        self.workList.doubleClicked.connect(MainWin.on_actionLaunch_triggered)
        self.splitter.addWidget(self.workList)

        # Log Widget
        self.logTextBrowser = QPlainTextEditLogger(self.centralWidget)
        self.logTextBrowser.widget.setObjectName("logTextBrowser")
        self.logTextBrowser.widget.setStyleSheet("""
            QPlainTextEdit {
                    border: 2px solid grey;
                    border-radius: 5px;
                    background-color: lightgray;
            }
            """)
        self.splitter.addWidget(self.logTextBrowser.widget)

        # add splitter
        self.splitter.setSizes([600, 100])
        self.verticalLayout.addWidget(self.splitter)

        # Actions

        # Launch
        self.actionLaunch = QAction(MainWin)
        self.actionLaunch.setObjectName("actionLaunch")
        self.actionLaunch.setText(MainWin.tr("Launch Analysis"))
        self.actionLaunch.setToolTip(
            MainWin.tr("Launch the synspy-viewer process"))
        self.actionLaunch.setShortcut(MainWin.tr("Ctrl+L"))

        # Refresh
        self.actionRefresh = QAction(MainWin)
        self.actionRefresh.setObjectName("actionRefresh")
        self.actionRefresh.setText(MainWin.tr("Refresh Work List"))
        self.actionRefresh.setToolTip(MainWin.tr("Refresh the work list"))
        self.actionRefresh.setShortcut(MainWin.tr("Ctrl+R"))

        # Options
        self.actionOptions = QAction(MainWin)
        self.actionOptions.setObjectName("actionOptions")
        self.actionOptions.setText(MainWin.tr("Options"))
        self.actionOptions.setToolTip(MainWin.tr("Configuration Options"))
        self.actionOptions.setShortcut(MainWin.tr("Ctrl+P"))

        # Login
        self.actionLogin = QAction(MainWin)
        self.actionLogin.setObjectName("actionLogin")
        self.actionLogin.setText(MainWin.tr("Login"))
        self.actionLogin.setToolTip(MainWin.tr("Login to the server"))
        self.actionLogin.setShortcut(MainWin.tr("Ctrl+G"))

        # Logout
        self.actionLogout = QAction(MainWin)
        self.actionLogout.setObjectName("actionLogout")
        self.actionLogout.setText(MainWin.tr("Logout"))
        self.actionLogout.setToolTip(MainWin.tr("Logout of the server"))
        self.actionLogout.setShortcut(MainWin.tr("Ctrl+O"))

        # Exit
        self.actionExit = QAction(MainWin)
        self.actionExit.setObjectName("actionExit")
        self.actionExit.setText(MainWin.tr("Exit"))
        self.actionExit.setToolTip(MainWin.tr("Exit the application"))
        self.actionExit.setShortcut(MainWin.tr("Ctrl+Z"))

        # Help
        self.actionHelp = QAction(MainWin)
        self.actionHelp.setObjectName("actionHelp")
        self.actionHelp.setText(MainWin.tr("Help"))
        self.actionHelp.setToolTip(MainWin.tr("Help"))
        self.actionHelp.setShortcut(MainWin.tr("Ctrl+H"))

        # Mark Incomplete
        self.markIncompleteAction = QAction('Mark Incomplete', self.workList)
        self.markIncompleteAction.triggered.connect(MainWin.markIncomplete)

        # Tool Bar

        self.mainToolBar = QToolBar(MainWin)
        self.mainToolBar.setObjectName("mainToolBar")
        self.mainToolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        MainWin.addToolBar(Qt.TopToolBarArea, self.mainToolBar)

        # Launch
        self.mainToolBar.addAction(self.actionLaunch)
        self.actionLaunch.setIcon(qApp.style().standardIcon(
            QStyle.SP_MediaPlay))

        # Reload
        self.mainToolBar.addAction(self.actionRefresh)
        self.actionRefresh.setIcon(qApp.style().standardIcon(
            QStyle.SP_BrowserReload))

        # Options
        self.mainToolBar.addAction(self.actionOptions)
        self.actionOptions.setIcon(qApp.style().standardIcon(
            QStyle.SP_FileDialogDetailedView))

        # this spacer right justifies everything that comes after it
        spacer = QWidget()
        spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.mainToolBar.addWidget(spacer)

        # Login
        self.mainToolBar.addAction(self.actionLogin)
        self.actionLogin.setIcon(qApp.style().standardIcon(
            QStyle.SP_DialogApplyButton))

        # Logout
        self.mainToolBar.addAction(self.actionLogout)
        self.actionLogout.setIcon(qApp.style().standardIcon(
            QStyle.SP_DialogOkButton))

        # Help
        #self.mainToolBar.addAction(self.actionHelp)
        self.actionHelp.setIcon(qApp.style().standardIcon(
            QStyle.SP_MessageBoxQuestion))

        # Exit
        self.mainToolBar.addAction(self.actionExit)
        self.actionExit.setIcon(qApp.style().standardIcon(
            QStyle.SP_DialogCancelButton))

        # Status Bar

        self.statusBar = QStatusBar(MainWin)
        self.statusBar.setToolTip("")
        self.statusBar.setStatusTip("")
        self.statusBar.setObjectName("statusBar")
        MainWin.setStatusBar(self.statusBar)

        # finalize UI setup
        QMetaObject.connectSlotsByName(MainWin)
Ejemplo n.º 4
0
class AppWindow(QMainWindow):
    onRestart = pyqtSignal(name='onRestart')
    onSystemUIElementCreated = pyqtSignal(str,
                                          QWidget,
                                          name='onUIElementCreated')

    def __init__(self, dwarf_args, flags=None):
        super(AppWindow, self).__init__(flags)

        self.dwarf_args = dwarf_args

        self.session_manager = SessionManager(self)
        self.session_manager.sessionCreated.connect(self.session_created)
        self.session_manager.sessionStopped.connect(self.session_stopped)
        self.session_manager.sessionClosed.connect(self.session_closed)

        self._tab_order = [
            'memory', 'modules', 'ranges', 'jvm-inspector', 'jvm-debugger'
        ]

        self.menu = self.menuBar()
        self._is_newer_dwarf = False
        self.view_menu = None

        # dockwidgets
        self.watchers_dwidget = None
        self.hooks_dwiget = None
        self.bookmarks_dwiget = None
        self.registers_dock = None
        self.console_dock = None
        self.backtrace_dock = None
        self.threads_dock = None
        # panels
        self.asm_panel = None
        self.console_panel = None
        self.context_panel = None
        self.backtrace_panel = None
        self.contexts_list_panel = None
        self.data_panel = None
        self.emulator_panel = None
        self.ftrace_panel = None
        self.hooks_panel = None
        self.bookmarks_panel = None
        self.smali_panel = None
        self.java_inspector_panel = None
        self.java_explorer_panel = None
        self.java_trace_panel = None
        self.memory_panel = None
        self.modules_panel = None
        self.ranges_panel = None
        self.search_panel = None
        self.watchers_panel = None
        self.welcome_window = None

        self._ui_elems = []

        self.setWindowTitle(
            'Dwarf - A debugger for reverse engineers, crackers and security analyst'
        )

        # load external assets
        _app = QApplication.instance()

        self.remove_tmp_dir()

        # themes
        self.prefs = Prefs()
        self.set_theme(self.prefs.get('dwarf_ui_theme', 'black'))

        # load font
        if os.path.exists(utils.resource_path('assets/Anton.ttf')):
            QFontDatabase.addApplicationFont(
                utils.resource_path('assets/Anton.ttf'))
        if os.path.exists(utils.resource_path('assets/OpenSans-Regular.ttf')):
            QFontDatabase.addApplicationFont(
                utils.resource_path('assets/OpenSans-Regular.ttf'))
            font = QFont("OpenSans", 9, QFont.Normal)
            # TODO: add settingsdlg
            font_size = self.prefs.get('dwarf_ui_font_size', 12)
            font.setPixelSize(font_size)
            _app.setFont(font)
            if os.path.exists(utils.resource_path('assets/OpenSans-Bold.ttf')):
                QFontDatabase.addApplicationFont(
                    utils.resource_path('assets/OpenSans-Bold.ttf'))

        # mainwindow statusbar
        self.progressbar = QProgressBar()
        self.progressbar.setRange(0, 0)
        self.progressbar.setVisible(False)
        self.progressbar.setFixedHeight(15)
        self.progressbar.setFixedWidth(100)
        self.progressbar.setTextVisible(False)
        self.progressbar.setValue(30)
        self.statusbar = QStatusBar(self)
        self.statusbar.setAutoFillBackground(False)
        self.statusbar.addPermanentWidget(self.progressbar)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.main_tabs = QTabWidget(self)
        self.main_tabs.setMovable(False)
        self.main_tabs.setTabsClosable(True)
        self.main_tabs.setAutoFillBackground(True)
        self.main_tabs.tabCloseRequested.connect(self._on_close_tab)
        self.setCentralWidget(self.main_tabs)

        # pluginmanager
        self.plugin_manager = PluginManager(self)
        self.plugin_manager.reload_plugins()

        if self.dwarf_args.package is None:
            self.welcome_window = WelcomeDialog(self)
            self.welcome_window.setModal(True)
            self.welcome_window.onIsNewerVersion.connect(
                self._enable_update_menu)
            self.welcome_window.onUpdateComplete.connect(
                self._on_dwarf_updated)
            self.welcome_window.setWindowTitle(
                'Welcome to Dwarf - A debugger for reverse engineers, crackers and security analyst'
            )
            self.welcome_window.onSessionSelected.connect(self._start_session)
            # wait for welcome screen
            self.hide()
            self.welcome_window.show()
        else:
            if dwarf_args.package is not None:
                if dwarf_args.type is None:
                    # no device given check if package is local path
                    if os.path.exists(dwarf_args.package):
                        print('* Starting new LocalSession')
                        self._start_session('local')
                    else:
                        print('use -t to set sessiontype')
                        exit(0)
                else:
                    print('* Starting new Session')
                    self._start_session(dwarf_args.type)

    def _setup_main_menu(self):
        self.menu = self.menuBar()
        dwarf_menu = QMenu('Dwarf', self)
        theme = QMenu('Theme', dwarf_menu)
        theme.addAction('Black')
        theme.addAction('Dark')
        theme.addAction('Light')
        theme.triggered.connect(self._set_theme)
        dwarf_menu.addMenu(theme)
        dwarf_menu.addSeparator()
        if self._is_newer_dwarf:
            dwarf_menu.addAction('Update', self._update_dwarf)
        dwarf_menu.addAction('Close', self.session_manager.session.stop)
        self.menu.addMenu(dwarf_menu)

        session = self.session_manager.session
        if session is not None:
            session_menu = session.main_menu
            if isinstance(session_menu, list):
                for menu in session_menu:
                    self.menu.addMenu(menu)
            else:
                self.menu.addMenu(session_menu)

        # plugins
        if self.plugin_manager.plugins:
            self.plugin_menu = QMenu('Plugins', self)
            for plugin in self.plugin_manager.plugins:
                plugin_instance = self.plugin_manager.plugins[plugin]
                plugin_sub_menu = QMenu(plugin_instance.name, self.plugin_menu)

                try:
                    actions = plugin_instance.__get_top_menu_actions__()
                    for action in actions:
                        plugin_sub_menu.addAction(action)
                except:
                    pass

                if not plugin_sub_menu.isEmpty():
                    plugin_sub_menu.addSeparator()

                plugin_sub_menu.addAction(
                    'About', lambda: self._show_plugin_about(plugin))
                self.plugin_menu.addMenu(plugin_sub_menu)

            if not self.plugin_menu.isEmpty():
                self.menu.addMenu(self.plugin_menu)

        self.view_menu = QMenu('View', self)
        subview_menu = QMenu('Subview', self.view_menu)
        subview_menu.addAction('Search',
                               lambda: self.show_main_tab('search'),
                               shortcut=QKeySequence(Qt.CTRL + Qt.Key_F3))
        subview_menu.addAction('Emulator',
                               lambda: self.show_main_tab('emulator'),
                               shortcut=QKeySequence(Qt.CTRL + Qt.Key_F2))
        subview_menu.addAction('Disassembly',
                               lambda: self.show_main_tab('disassembly'),
                               shortcut=QKeySequence(Qt.CTRL + Qt.Key_F5))
        self.view_menu.addMenu(subview_menu)
        self.view_menu.addSeparator()
        self.menu.addMenu(self.view_menu)

        if self.dwarf_args.debug_script:
            debug_menu = QMenu('Debug', self)
            debug_menu.addAction('Reload core', self._menu_reload_core)
            debug_menu.addAction('Debug dwarf js core',
                                 self._menu_debug_dwarf_js)
            self.menu.addMenu(debug_menu)

        about_menu = QMenu('About', self)
        about_menu.addAction('Dwarf on GitHub', self._menu_github)
        about_menu.addAction('Documention', self._menu_documentation)
        about_menu.addAction('Api', self._menu_api)
        about_menu.addAction('Slack', self._menu_slack)
        about_menu.addSeparator()
        about_menu.addAction('Info', self._show_about_dlg)
        self.menu.addMenu(about_menu)

    def _show_plugin_about(self, plugin):
        plugin = self.plugin_manager.plugins[plugin]
        if plugin:
            info = plugin.__get_plugin_info__()

            version = utils.safe_read_map(info, 'version', '')
            description = utils.safe_read_map(info, 'description', '')
            author = utils.safe_read_map(info, 'author', '')
            homepage = utils.safe_read_map(info, 'homepage', '')
            license_ = utils.safe_read_map(info, 'license', '')

            utils.show_message_box(
                'Name: {0}\nVersion: {1}\nDescription: {2}\nAuthor: {3}\nHomepage: {4}\nLicense: {5}'
                .format(plugin.name, version, description, author, homepage,
                        license_))

    def _enable_update_menu(self):
        self._is_newer_dwarf = True

    def _update_dwarf(self):
        if self.welcome_window:
            self.welcome_window._update_dwarf()

    def _on_close_tab(self, index):
        tab_text = self.main_tabs.tabText(index)
        if tab_text:
            if tab_text.lower() in self.session_manager.session.non_closable:
                return
            try:
                self._ui_elems.remove(tab_text.lower())
            except ValueError:  # recheck ValueError: list.remove(x): x not in list
                pass
            self.main_tabs.removeTab(index)

    def _handle_tab_change(self):
        for index in range(self.main_tabs.count()):
            tab_name = self.main_tabs.tabText(index).lower().replace(' ', '-')
            if tab_name in self.session_manager.session.non_closable:
                self.main_tabs.tabBar().setTabButton(index, QTabBar.RightSide,
                                                     None)

                if tab_name in self._tab_order:
                    should_index = self._tab_order.index(tab_name)
                    if index != should_index:
                        self.main_tabs.tabBar().moveTab(index, should_index)

    def _on_dwarf_updated(self):
        self.onRestart.emit()

    def remove_tmp_dir(self):
        if os.path.exists('.tmp'):
            shutil.rmtree('.tmp', ignore_errors=True)

    def _set_theme(self, qaction):
        if qaction:
            self.set_theme(qaction.text())

    def _menu_reload_core(self):
        self.dwarf.load_script()

    def _menu_debug_dwarf_js(self):
        you_know_what_to_do = json.loads(
            self.dwarf._script.exports.debugdwarfjs())
        return you_know_what_to_do

    def show_main_tab(self, name):
        # elem doesnt exists? create it
        if name not in self._ui_elems:
            self._create_ui_elem(name)

        index = 0
        name = name.join(name.split()).lower()
        if name == 'memory':
            index = self.main_tabs.indexOf(self.memory_panel)
        elif name == 'ranges':
            index = self.main_tabs.indexOf(self.ranges_panel)
        elif name == 'search':
            index = self.main_tabs.indexOf(self.search_panel)
        elif name == 'modules':
            index = self.main_tabs.indexOf(self.modules_panel)
        elif name == 'disassembly':
            index = self.main_tabs.indexOf(self.asm_panel)
        elif name == 'data':
            index = self.main_tabs.indexOf(self.data_panel)
        elif name == 'emulator':
            index = self.main_tabs.indexOf(self.emulator_panel)
        elif name == 'java-trace':
            index = self.main_tabs.indexOf(self.java_trace_panel)
        elif name == 'jvm-inspector':
            index = self.main_tabs.indexOf(self.java_inspector_panel)
        elif name == 'jvm-debugger':
            index = self.main_tabs.indexOf(self.java_explorer_panel)
        elif name == 'smali':
            index = self.main_tabs.indexOf(self.smali_panel)

        self.main_tabs.setCurrentIndex(index)

    def jump_to_address(self, ptr, show_panel=True):
        if self.memory_panel is not None:
            if show_panel:
                self.show_main_tab('memory')
            self.memory_panel.read_memory(ptr)

    @pyqtSlot(name='mainMenuGitHub')
    def _menu_github(self):
        QDesktopServices.openUrl(QUrl('https://github.com/iGio90/Dwarf'))

    @pyqtSlot(name='mainMenuDocumentation')
    def _menu_api(self):
        QDesktopServices.openUrl(QUrl('https://igio90.github.io/Dwarf/'))

    @pyqtSlot(name='mainMenuApi')
    def _menu_documentation(self):
        QDesktopServices.openUrl(QUrl('https://igio90.github.io/Dwarf/api'))

    @pyqtSlot(name='mainMenuSlack')
    def _menu_slack(self):
        QDesktopServices.openUrl(
            QUrl('https://join.slack.com/t/resecret/shared_invite'
                 '/enQtMzc1NTg4MzE3NjA1LTlkNzYxNTIwYTc2ZTYyOWY1MT'
                 'Q1NzBiN2ZhYjQwYmY0ZmRhODQ0NDE3NmRmZjFiMmE1MDYwN'
                 'WJlNDVjZDcwNGE'))

    def _show_about_dlg(self):
        about_dlg = AboutDialog(self)
        about_dlg.show()

    def _create_ui_elem(self, elem):
        if not isinstance(elem, str):
            return

        if elem not in self._ui_elems:
            self._ui_elems.append(elem)

        elem_wiget = None

        if elem == 'watchers':
            from ui.panel_watchers import WatchersPanel
            self.watchers_dwidget = QDockWidget('Watchers', self)
            self.watchers_panel = WatchersPanel(self)
            # dont respond to dblclick mem cant be shown
            # self.watchers_panel.onItemDoubleClicked.connect(
            #    self._on_watcher_clicked)
            self.watchers_panel.onItemRemoved.connect(
                self._on_watcher_removeditem)
            self.watchers_panel.onItemAdded.connect(self._on_watcher_added)
            self.watchers_dwidget.setWidget(self.watchers_panel)
            self.watchers_dwidget.setObjectName('WatchersPanel')
            self.addDockWidget(Qt.LeftDockWidgetArea, self.watchers_dwidget)
            self.view_menu.addAction(self.watchers_dwidget.toggleViewAction())
            elem_wiget = self.watchers_panel
        elif elem == 'hooks':
            from ui.panel_hooks import HooksPanel
            self.hooks_dwiget = QDockWidget('Breakpoints', self)
            self.hooks_panel = HooksPanel(self)
            self.hooks_panel.onShowMemoryRequest.connect(
                self._on_watcher_clicked)
            self.hooks_panel.onHookRemoved.connect(self._on_hook_removed)
            self.hooks_dwiget.setWidget(self.hooks_panel)
            self.hooks_dwiget.setObjectName('HooksPanel')
            self.addDockWidget(Qt.LeftDockWidgetArea, self.hooks_dwiget)
            self.view_menu.addAction(self.hooks_dwiget.toggleViewAction())
            elem_wiget = self.hooks_panel
        elif elem == 'bookmarks':
            from ui.panel_bookmarks import BookmarksPanel
            self.bookmarks_dwiget = QDockWidget('Boomarks', self)
            self.bookmarks_panel = BookmarksPanel(self)
            self.bookmarks_panel.onShowMemoryRequest.connect(
                self._on_watcher_clicked)
            self.bookmarks_dwiget.setWidget(self.bookmarks_panel)
            self.bookmarks_dwiget.setObjectName('BookmarksPanel')
            self.addDockWidget(Qt.LeftDockWidgetArea, self.bookmarks_dwiget)
            self.view_menu.addAction(self.bookmarks_dwiget.toggleViewAction())
            elem_wiget = self.bookmarks_panel
        elif elem == 'registers':
            from ui.panel_context import ContextPanel
            self.registers_dock = QDockWidget('Context', self)
            self.context_panel = ContextPanel(self)
            self.registers_dock.setWidget(self.context_panel)
            self.registers_dock.setObjectName('ContextsPanel')
            self.addDockWidget(Qt.RightDockWidgetArea, self.registers_dock)
            self.view_menu.addAction(self.registers_dock.toggleViewAction())
            elem_wiget = self.context_panel
        elif elem == 'memory':
            from ui.panel_memory import MemoryPanel
            self.memory_panel = MemoryPanel(self)
            self.memory_panel.onShowDisassembly.connect(
                self._disassemble_range)
            self.memory_panel.dataChanged.connect(self._on_memory_modified)
            self.memory_panel.statusChanged.connect(self.set_status_text)
            self.main_tabs.addTab(self.memory_panel, 'Memory')
            elem_wiget = self.memory_panel
        elif elem == 'jvm-debugger':
            from ui.panel_java_explorer import JavaExplorerPanel
            self.java_explorer_panel = JavaExplorerPanel(self)
            self.main_tabs.addTab(self.java_explorer_panel, 'JVM debugger')
            self.main_tabs.tabBar().moveTab(
                self.main_tabs.indexOf(self.java_explorer_panel), 1)
            elem_wiget = self.java_explorer_panel
        elif elem == 'jvm-inspector':
            from ui.panel_java_inspector import JavaInspector
            self.java_inspector_panel = JavaInspector(self)
            self.main_tabs.addTab(self.java_inspector_panel, 'JVM inspector')
            elem_wiget = self.java_inspector_panel
        elif elem == 'console':
            from ui.panel_console import ConsolePanel
            self.console_dock = QDockWidget('Console', self)
            self.console_panel = ConsolePanel(self)
            if self.dwarf_args.script and len(
                    self.dwarf_args.script) > 0 and os.path.exists(
                        self.dwarf_args.script):
                with open(self.dwarf_args.script, 'r') as f:
                    self.console_panel.get_js_console(
                    ).function_content = f.read()
            self.dwarf.onLogToConsole.connect(self._log_js_output)
            self.dwarf.onLogEvent.connect(self._log_event)
            self.console_dock.setWidget(self.console_panel)
            self.console_dock.setObjectName('ConsolePanel')
            self.addDockWidget(Qt.BottomDockWidgetArea, self.console_dock)
            self.view_menu.addAction(self.console_dock.toggleViewAction())
            elem_wiget = self.console_panel
        elif elem == 'backtrace':
            from ui.panel_backtrace import BacktracePanel
            self.backtrace_dock = QDockWidget('Backtrace', self)
            self.backtrace_panel = BacktracePanel(self)
            self.backtrace_dock.setWidget(self.backtrace_panel)
            self.backtrace_dock.setObjectName('BacktracePanel')
            self.backtrace_panel.onShowMemoryRequest.connect(
                self._on_watcher_clicked)
            self.addDockWidget(Qt.RightDockWidgetArea, self.backtrace_dock)
            self.view_menu.addAction(self.backtrace_dock.toggleViewAction())
            elem_wiget = self.backtrace_panel
        elif elem == 'threads':
            from ui.panel_contexts_list import ContextsListPanel
            self.threads_dock = QDockWidget('Threads', self)
            self.contexts_list_panel = ContextsListPanel(self)
            self.dwarf.onThreadResumed.connect(
                self.contexts_list_panel.resume_tid)
            self.contexts_list_panel.onItemDoubleClicked.connect(
                self._manually_apply_context)
            self.threads_dock.setWidget(self.contexts_list_panel)
            self.threads_dock.setObjectName('ThreadPanel')
            self.addDockWidget(Qt.RightDockWidgetArea, self.threads_dock)
            self.view_menu.addAction(self.threads_dock.toggleViewAction())
            elem_wiget = self.contexts_list_panel
        elif elem == 'modules':
            from ui.panel_modules import ModulesPanel
            self.modules_panel = ModulesPanel(self)
            self.modules_panel.onModuleSelected.connect(
                self._on_module_dblclicked)
            self.modules_panel.onModuleFuncSelected.connect(
                self._on_modulefunc_dblclicked)
            self.modules_panel.onAddHook.connect(self._on_addmodule_hook)
            self.modules_panel.onDumpBinary.connect(self._on_dumpmodule)
            self.main_tabs.addTab(self.modules_panel, 'Modules')
            elem_wiget = self.modules_panel
        elif elem == 'ranges':
            from ui.panel_ranges import RangesPanel
            self.ranges_panel = RangesPanel(self)
            self.ranges_panel.onItemDoubleClicked.connect(
                self._range_dblclicked)
            self.ranges_panel.onDumpBinary.connect(self._on_dumpmodule)
            # connect to watcherpanel func
            self.ranges_panel.onAddWatcher.connect(
                self.watchers_panel.do_addwatcher_dlg)
            self.main_tabs.addTab(self.ranges_panel, 'Ranges')
            elem_wiget = self.ranges_panel
        elif elem == 'search':
            from ui.panel_search import SearchPanel
            self.search_panel = SearchPanel(self)
            self.search_panel.onShowMemoryRequest.connect(
                self._on_watcher_clicked)
            self.main_tabs.addTab(self.search_panel, 'Search')
            elem_wiget = self.search_panel
        elif elem == 'data':
            from ui.panel_data import DataPanel
            self.data_panel = DataPanel(self)
            self.main_tabs.addTab(self.data_panel, 'Data')
            elem_wiget = self.data_panel
        elif elem == 'disassembly':
            from ui.widgets.disasm_view import DisassemblyPanel
            self.asm_panel = DisassemblyPanel(self)
            self.asm_panel.disasm_view.onShowMemoryRequest.connect(
                self._on_disasm_showmem)
            self.main_tabs.addTab(self.asm_panel, 'Disassembly')
            elem_wiget = self.asm_panel
        elif elem == 'emulator':
            from ui.panel_emulator import EmulatorPanel
            self.emulator_panel = EmulatorPanel(self)
            self.main_tabs.addTab(self.emulator_panel, 'Emulator')
            elem_wiget = self.emulator_panel
        elif elem == 'java-trace':
            from ui.panel_java_trace import JavaTracePanel
            self.java_trace_panel = JavaTracePanel(self)
            self.main_tabs.addTab(self.java_trace_panel, 'JVM tracer')
            elem_wiget = self.java_trace_panel
        elif elem == 'smali':
            from ui.panel_smali import SmaliPanel
            self.smali_panel = SmaliPanel()
            self.main_tabs.addTab(self.smali_panel, 'Smali')
            elem_wiget = self.smali_panel
        else:
            print('no handler for elem: ' + elem)

        # make tabs unclosable and sort
        self._handle_tab_change()

        if elem_wiget is not None:
            self.onSystemUIElementCreated.emit(elem, elem_wiget)

        # TODO: remove add @2x
        for item in self.findChildren(QDockWidget):
            if item:
                if 'darwin' in sys.platform:
                    item.setStyleSheet(
                        'QDockWidget::title { padding-left:-30px; }')

    def set_theme(self, theme):
        if theme:
            theme = theme.replace(os.pardir, '').replace('.', '')
            theme = theme.join(theme.split()).lower()
            theme_style = 'assets/' + theme + '_style.qss'
            if not os.path.exists(utils.resource_path(theme_style)):
                return

            self.prefs.put('dwarf_ui_theme', theme)

            try:
                _app = QApplication.instance()
                with open(theme_style) as stylesheet:
                    _app.setStyleSheet(_app.styleSheet() + '\n' +
                                       stylesheet.read())
            except Exception as e:
                pass
                # err = self.dwarf.spawn(dwarf_args.package, dwarf_args.script)

    def set_status_text(self, txt):
        self.statusbar.showMessage(txt)

    # ************************************************************************
    # **************************** Properties ********************************
    # ************************************************************************
    @property
    def disassembly(self):
        return self.asm_panel

    @property
    def backtrace(self):
        return self.backtrace_panel

    @property
    def console(self):
        return self.console_panel

    @property
    def context(self):
        return self.context_panel

    @property
    def threads(self):
        return self.contexts_list_panel

    @property
    def emulator(self):
        return self.emulator_panel

    @property
    def ftrace(self):
        return self.ftrace_panel

    @property
    def hooks(self):
        return self.hooks_panel

    @property
    def java_inspector(self):
        return self.java_inspector_panel

    @property
    def java_explorer(self):
        return self.java_explorer_panel

    @property
    def memory(self):
        return self.memory_panel

    @property
    def modules(self):
        return self.memory_panel

    @property
    def ranges(self):
        return self.ranges_panel

    @property
    def watchers(self):
        return self.watchers_panel

    @property
    def dwarf(self):
        if self.session_manager.session is not None:
            return self.session_manager.session.dwarf
        else:
            return None

    # ************************************************************************
    # **************************** Handlers **********************************
    # ************************************************************************
    # session handlers
    def _start_session(self, session_type, session_data=None):
        if self.welcome_window is not None:
            self.welcome_window.close()
        self.session_manager.create_session(session_type,
                                            session_data=session_data)

    def _restore_session(self, session_data):
        if 'session' in session_data:
            session_type = session_data['session']
            self.dwarf_args.package = session_data['package']
            self.dwarf_args.spawn = True
            self._start_session(session_type, session_data=session_data)

    def session_created(self):
        # session init done create ui for it
        session = self.session_manager.session
        self._setup_main_menu()
        for ui_elem in session.session_ui_sections:
            ui_elem = ui_elem.join(ui_elem.split()).lower()
            self._create_ui_elem(ui_elem)

        self.dwarf.onProcessAttached.connect(self._on_attached)
        self.dwarf.onProcessDetached.connect(self._on_detached)
        self.dwarf.onScriptLoaded.connect(self._on_script_loaded)

        # hookup
        self.dwarf.onSetRanges.connect(self._on_setranges)
        self.dwarf.onSetModules.connect(self._on_setmodules)

        self.dwarf.onAddNativeHook.connect(self._on_add_hook)
        self.dwarf.onApplyContext.connect(self._apply_context)
        self.dwarf.onThreadResumed.connect(self.on_tid_resumed)

        self.dwarf.onSetData.connect(self._on_set_data)

        self.session_manager.start_session(self.dwarf_args)
        q_settings = QSettings("dwarf_window_pos.ini", QSettings.IniFormat)
        ui_state = q_settings.value('dwarf_ui_state')
        if ui_state:
            self.restoreGeometry(ui_state)
        window_state = q_settings.value('dwarf_ui_window', self.saveState())
        if window_state:
            self.restoreState(window_state)

        self.showMaximized()

    def session_stopped(self):
        self.remove_tmp_dir()
        self.menu.clear()

        self.main_tabs.clear()

        # actually we need to kill this. needs a refactor
        if self.java_trace_panel is not None:
            self.java_trace_panel = None

        for elem in self._ui_elems:
            if elem == 'watchers':
                self.watchers_panel.clear_list()
                self.watchers_panel.close()
                self.watchers_panel = None
                self.removeDockWidget(self.watchers_dwidget)
                self.watchers_dwidget = None
            elif elem == 'hooks':
                self.hooks_panel.close()
                self.hooks_panel = None
                self.removeDockWidget(self.hooks_dwiget)
                self.hooks_dwiget = None
            elif elem == 'registers':
                self.context_panel.close()
                self.context_panel = None
                self.removeDockWidget(self.registers_dock)
                self.registers_dock = None
            elif elem == 'memory':
                self.memory_panel.close()
                self.memory_panel = None
                self.main_tabs.removeTab(0)
                # self.main_tabs
            elif elem == 'jvm-debugger':
                self.java_explorer_panel.close()
                self.java_explorer_panel = None
                self.removeDockWidget(self.watchers_dwidget)
            elif elem == 'console':
                self.console_panel.close()
                self.console_panel = None
                self.removeDockWidget(self.console_dock)
                self.console_dock = None
            elif elem == 'backtrace':
                self.backtrace_panel.close()
                self.backtrace_panel = None
                self.removeDockWidget(self.backtrace_dock)
            elif elem == 'threads':
                self.contexts_list_panel.close()
                self.contexts_list_panel = None
                self.removeDockWidget(self.threads_dock)
                self.threads_dock = None
            elif elem == 'bookmarks':
                self.bookmarks_panel.close()
                self.bookmarks_panel = None
                self.removeDockWidget(self.bookmarks_dwiget)
                self.bookmarks_dwiget = None

    def session_closed(self):
        self._ui_elems = []
        self.hide()
        if self.welcome_window is not None:
            self.welcome_window.exec()

        # close if it was a commandline session
        if self.welcome_window is None:
            if self.dwarf_args.package:
                self.close()

    # ui handler
    def closeEvent(self, event):
        """ Window closed
            save stuff or whatever at exit

            detaches dwarf
        """
        # save windowstuff
        q_settings = QSettings("dwarf_window_pos.ini", QSettings.IniFormat)
        q_settings.setValue('dwarf_ui_state', self.saveGeometry())
        q_settings.setValue('dwarf_ui_window', self.saveState())

        if self.dwarf:
            try:
                self.dwarf.detach()
            except:
                pass
        super().closeEvent(event)

    def _on_watcher_clicked(self, ptr):
        """ Address in Watcher/Hookpanel was clicked
            show Memory
        """
        if '.' in ptr:  # java_hook
            file_path = ptr.replace('.', os.path.sep)
            if os.path.exists('.tmp/smali/' + file_path + '.smali'):
                if self.smali_panel is None:
                    self._create_ui_elem('smali')
                self.smali_panel.set_file('.tmp/smali/' + file_path + '.smali')
                self.show_main_tab('smali')
        else:
            self.memory_panel.read_memory(ptr=ptr)
            self.show_main_tab('memory')

    def _on_disasm_showmem(self, ptr, length):
        """ Address in Disasm was clicked
            adds temphighlight for bytes from current instruction
        """
        self.memory_panel.read_memory(ptr)
        self.memory_panel.add_highlight(
            HighLight('attention', utils.parse_ptr(ptr), length))
        self.show_main_tab('memory')

    def _on_watcher_added(self, ptr):
        """ Watcher Entry was added
        """
        try:
            # set highlight
            self.memory_panel.add_highlight(
                HighLight('watcher', ptr, self.dwarf.pointer_size))
        except HighlightExistsError:
            pass

    def _on_watcher_removeditem(self, ptr):
        """ Watcher Entry was removed
            remove highlight too
        """
        self.memory_panel.remove_highlight(ptr)

    def _on_module_dblclicked(self, data):
        """ Module in ModulePanel was doubleclicked
        """
        addr, size = data
        addr = utils.parse_ptr(addr)
        size = int(size, 10)
        self.memory_panel.read_memory(ptr=addr, length=size)
        self.show_main_tab('Memory')

    def _on_modulefunc_dblclicked(self, ptr):
        """ Function in ModulePanel was doubleclicked
        """
        ptr = utils.parse_ptr(ptr)
        self.memory_panel.read_memory(ptr=ptr)
        self.show_main_tab('Memory')

    def _on_dumpmodule(self, data):
        """ DumpBinary MenuItem in ModulePanel was selected
        """
        ptr, size = data
        ptr = utils.parse_ptr(ptr)
        size = int(size, 10)
        self.dwarf.dump_memory(ptr=ptr, length=size)

    def _disassemble_range(self, mem_range):
        """ Disassemble MenuItem in Hexview was selected
        """
        if mem_range:
            if self.asm_panel is None:
                self._create_ui_elem('disassembly')

            self.asm_panel.disassemble(mem_range)
            self.show_main_tab('disassembly')

    def _range_dblclicked(self, ptr):
        """ Range in RangesPanel was doubleclicked
        """
        ptr = utils.parse_ptr(ptr)
        self.memory_panel.read_memory(ptr=ptr)
        self.show_main_tab('Memory')

    # dwarf handlers
    def _log_js_output(self, output):
        if self.console_panel is not None:
            self.console_panel.get_js_console().log(output)

    def _log_event(self, output):
        if self.console_panel is not None:
            self.console_panel.get_events_console().log(output)

    def _on_setranges(self, ranges):
        """ Dwarf wants to set Ranges
            only hooked up to switch tab or create ui
            its connected in panel after creation
        """
        if self.ranges_panel is None:
            self.show_main_tab('ranges')
            # forward only now to panel it connects after creation
            self.ranges_panel.set_ranges(ranges)

    def _on_setmodules(self, modules):
        """ Dwarf wants to set Modules
            only hooked up to switch tab or create ui
            its connected in panel after creation
        """
        if self.modules_panel is None:
            self._create_ui_elem('modules')
            self.modules_panel.set_modules(modules)

        if self.modules_panel is not None:
            self.show_main_tab('modules')

    def _manually_apply_context(self, context):
        """
        perform additional operation if the context has been manually applied from the context list
        """
        self._apply_context(context, manual=True)

    def _apply_context(self, context, manual=False):
        # update current context tid
        # this should be on top as any further api from js needs to be executed on that thread
        is_initial_hook = context['reason'] >= 0
        if manual or (self.dwarf.context_tid and not is_initial_hook):
            self.dwarf.context_tid = context['tid']

        if 'context' in context:
            if not manual:
                self.threads.add_context(context)

            is_java = context['is_java']
            if is_java:
                if self.java_explorer_panel is None:
                    self._create_ui_elem('jvm-debugger')
                self.context_panel.set_context(context['ptr'], 1,
                                               context['context'])
                self.java_explorer_panel._set_handle_arg(-1)
                self.show_main_tab('jvm-debugger')
            else:
                self.context_panel.set_context(context['ptr'], 0,
                                               context['context'])

                if 'pc' in context['context']:
                    if not 'disassembly' in self._ui_elems or manual:
                        from lib.range import Range
                        _range = Range(Range.SOURCE_TARGET, self.dwarf)
                        _range.init_with_address(
                            int(context['context']['pc']['value'], 16))

                        self._disassemble_range(_range)

        if 'backtrace' in context:
            self.backtrace_panel.set_backtrace(context['backtrace'])

    def _on_add_hook(self, hook):
        try:
            # set highlight
            ptr = hook.get_ptr()
            ptr = utils.parse_ptr(ptr)
            self.memory_panel.add_highlight(
                HighLight('hook', ptr, self.dwarf.pointer_size))
        except HighlightExistsError:
            pass

    def _on_hook_removed(self, ptr):
        ptr = utils.parse_ptr(ptr)
        self.memory_panel.remove_highlight(ptr)

    def _on_addmodule_hook(self, data):
        ptr, name = data
        self.dwarf.hook_native(ptr, own_input=name)

    def on_tid_resumed(self, tid):
        if self.dwarf:
            if self.dwarf.context_tid == tid:
                # clear backtrace
                if 'backtrace' in self._ui_elems:
                    if self.backtrace_panel is not None:
                        self.backtrace_panel.clear()

                # remove thread
                if 'threads' in self._ui_elems:
                    if self.contexts_list_panel is not None:
                        self.contexts_list_panel.resume_tid(tid)

                # clear registers
                if 'registers' in self._ui_elems:
                    if self.context_panel is not None:
                        self.context_panel.clear()

                # clear jvm explorer
                if 'jvm-debugger' in self._ui_elems:
                    if self.java_explorer_panel is not None:
                        self.java_explorer_panel.clear_panel()

                # invalidate dwarf context tid
                self.dwarf.context_tid = 0

    def _on_set_data(self, data):
        if not isinstance(data, list):
            return

        if self.data_panel is None:
            self.show_main_tab('data')

        if self.data_panel is not None:
            self.data_panel.append_data(data[0], data[1], data[2])

    def show_progress(self, text):
        self.progressbar.setVisible(True)
        self.set_status_text(text)

    def hide_progress(self):
        self.progressbar.setVisible(False)
        self.set_status_text('')

    def _on_attached(self, data):
        self.setWindowTitle('Dwarf - Attached to %s (%s)' % (data[1], data[0]))

    def _on_detached(self, data):
        reason = data[1]

        if reason == 'application-requested':
            self.session_manager.session.stop()
            return 0

        ret = QDialogDetached.show_dialog(self.dwarf, data[0], data[1],
                                          data[2])
        if ret == 0:
            self.dwarf.restart_proc()
        elif ret == 1:
            self.session_manager.session.stop()

        return 0

    def _on_script_loaded(self):
        # restore the loaded session if any
        self.session_manager.restore_session()

    def _on_memory_modified(self, pos, length):
        data_pos = self.memory_panel.base + pos
        data = self.memory_panel.data[pos:pos + length]
        data = [data[0]]  # todo: strange js part

        if self.dwarf.dwarf_api('writeBytes', [data_pos, data]):
            pass
        else:
            utils.show_message_box('Failed to write Memory')

    def on_add_bookmark(self, ptr):
        """
        provide ptr as int
        """
        if self.bookmarks_panel is not None:
            self.bookmarks_panel._create_bookmark(ptr=hex(ptr))
Ejemplo n.º 5
0
class StringsEditorMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setup_ui()

        self.stringfile = None
        self.reset_in_process = False

        path = get_default_path()
        if path is None:
            self.default_path = ""
        else:
            self.default_path = path

        self.strings_list.currentItemChanged.connect(self.action_listwidget_change_item)
        self.button_set_message.pressed.connect(self.action_button_set_message)
        self.button_add_message.pressed.connect(self.action_button_add_message)
        self.button_remove_message.pressed.connect(self.action_button_delete_message)

    def reset(self):
        self.reset_in_process = True
        self.stringfile = None
        self.strings_list.clearSelection()
        self.strings_list.clear()
        self.textedit_content.clear()
        self.lineedit_path.clear()
        self.lineedit_playtime.clear()
        self.lineedit_audioname.clear()

        self.reset_in_process = False

    def action_button_add_message(self):
        if self.stringfile is not None:
            newmessage = Message(strings=[b"", b"", b"", b""], audioplaytime=0.0)
            self.stringfile.messages.append(newmessage)
            i = len(self.stringfile.messages) - 1
            entry = BWEntityEntry(i, "({0}): '{1}'-'{2}'".format(i,
                                                                 newmessage.get_path(),
                                                                 newmessage.get_message()))
            self.strings_list.addItem(entry)
            self.strings_list.setCurrentRow(i)

    def action_button_set_message(self):
        print("I was pressed")
        current = self.strings_list.currentItem()
        if current is not None and self.strings_list is not None:
            try:
                msg = self.stringfile.messages[current.xml_ref]
                print(current)
                msg.set_path(self.lineedit_path.text())
                msg.set_name(self.lineedit_audioname.text())
                msg.playtime = float(self.lineedit_playtime.text())
                msg.set_message(self.textedit_content.toPlainText())

                current.setText("({0}): '{1}'-'{2}'".format(current.xml_ref,
                                                            msg.get_path(),
                                                            msg.get_message()))
            except:
                traceback.print_exc()


    def action_button_delete_message(self):
        if self.stringfile is not None:
            lastindex = len(self.stringfile.messages) - 1
            lastmessage = self.stringfile.messages.pop()
            item = self.strings_list.takeItem(lastindex)

            self.strings_list.removeItemWidget(item)
            self.strings_list.setCurrentRow(lastindex-1)

            self.statusbar.showMessage("DELETED: ({0}) {1}".format(lastindex,
                                                                   trim_message(lastmessage.get_message())))

    def action_listwidget_change_item(self, current, previous):
        if current is not None:
            print(current.xml_ref)
            msg = self.stringfile.messages[current.xml_ref]
            self.lineedit_audioname.setText(msg.get_name())
            self.lineedit_path.setText(msg.get_path())
            self.lineedit_playtime.setText(str(msg.playtime))
            self.textedit_content.setText(msg.get_message())

    def button_load_strings(self):
        try:
            print("ok", self.default_path)
            self.xmlPath = ""
            filepath, choosentype = QFileDialog.getOpenFileName(
                self, "Open File",
                self.default_path,
                "BW string files (*.str);;All files (*)")
            print("doooone")
            if filepath:
                print("resetting")
                self.reset()
                print("done")

                with open(filepath, "rb") as f:
                    try:
                        self.stringfile = BWLanguageFile(f)
                        for i, msg in enumerate(self.stringfile.messages):
                            entry = BWEntityEntry(i, "({0}): '{1}'-'{2}'".format(i,
                                                                             msg.get_path(),
                                                                             msg.get_message()))
                            self.strings_list.addItem(entry)

                        pass
                        self.default_path = filepath
                    except Exception as error:
                        print("error", error)
                        traceback.print_exc()
        except Exception as er:
            print("errrorrr", error)
            traceback.print_exc()
        print("loaded")

    def button_save_strings(self):
        if self.stringfile is not None:
            filepath, choosentype = QFileDialog.getSaveFileName(
                self, "Save File",
                self.default_path,
                "BW level files (*.str);;All files (*)")
            print(filepath, "saved")
            if filepath:
                with open(filepath, "wb") as f:
                    self.stringfile.write(f)

                self.default_path = filepath
                set_default_path(filepath)
        else:
            pass # no level loaded, do nothing

    def setup_ui(self):
        self.setObjectName("MainWindow")
        self.resize(820, 760)
        self.setMinimumSize(QSize(720, 560))
        self.setWindowTitle("BW-StringsEdit")


        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)


        self.horizontalLayout = QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")

        self.strings_list = QListWidget(self.centralwidget)
        self.horizontalLayout.addWidget(self.strings_list)

        self.vertLayoutWidget = QWidget(self.centralwidget)
        self.verticalLayout = QVBoxLayout(self.vertLayoutWidget)
        self.button_add_message = QPushButton(self.centralwidget)
        self.button_remove_message = QPushButton(self.centralwidget)
        self.button_set_message = QPushButton(self.centralwidget)

        self.button_add_message.setText("Add Message")
        self.button_remove_message.setText("Delete Last Message")
        self.button_set_message.setText("Set Message Content")

        self.lineedit_path = QLineEdit(self.centralwidget)
        self.lineedit_audioname = QLineEdit(self.centralwidget)
        self.lineedit_playtime = QLineEdit(self.centralwidget)
        self.textedit_content = QTextEdit(self.centralwidget)

        for widget in ( self.button_remove_message, self.button_add_message, self.button_set_message,
                       self.lineedit_path, self.lineedit_audioname, self.lineedit_playtime, self.textedit_content):
            self.verticalLayout.addWidget(widget)

        self.horizontalLayout.addWidget(self.vertLayoutWidget)

        self.menubar = self.menuBar()#QMenuBar(self)
        #self.menubar.setGeometry(QRect(0, 0, 820, 30))
        #self.menubar.setObjectName("menubar")
        self.file_menu = self.menubar.addMenu("File")#QMenu(self.menubar)
        self.file_menu.setObjectName("menuLoad")
        #self.menubar.addMenu(self.file_menu)


        self.file_load_action = QAction("Load", self)
        self.file_load_action.triggered.connect(self.button_load_strings)
        self.file_menu.addAction(self.file_load_action)
        self.file_save_action = QAction("Save", self)
        self.file_save_action.triggered.connect(self.button_save_strings)
        self.file_menu.addAction(self.file_save_action)

        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        #self.setMenuBar(self.menubar)
        print("done")
Ejemplo n.º 6
0
class Ui_MainWindow(QtWidgets.QMainWindow):

    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        self.crmAuto = None
        self.setupUi()
        self.loading = LoadingDialog(self)
        self.backThread = None
        self.messageDialog = None
        self.signal = Signal()
        self.signal.connect(self.printMessage)
        self.logFile = open("log", "a")

    def setupUi(self):
        self.resize(572, 387)
        self.setObjectName("centralwidget")
        self.label = QLabel(self)
        self.label.setGeometry(QtCore.QRect(30, 40, 54, 12))
        self.label.setObjectName("label")
        self.label_2 = QLabel(self)
        self.label_2.setGeometry(QtCore.QRect(30, 80, 54, 12))
        self.label_2.setObjectName("label_2")
        self.excelPath = QLineEdit(self)
        self.excelPath.setGeometry(QtCore.QRect(90, 30, 381, 31))
        self.excelPath.setObjectName("excelPath")
        self.iniPath = QLineEdit(self)
        self.iniPath.setGeometry(QtCore.QRect(90, 70, 381, 31))
        self.iniPath.setObjectName("iniPath")

        self.label_3 = QLabel(self)
        self.label_3.setGeometry(QtCore.QRect(40, 130, 54, 12))
        self.label_3.setObjectName("label_3")
        self.label_4 = QLabel(self)
        self.label_4.setGeometry(QtCore.QRect(50, 170, 54, 12))
        self.label_4.setObjectName("label_4")
        self.account = QLineEdit(self)
        self.account.setGeometry(QtCore.QRect(90, 120, 381, 31))
        self.account.setObjectName("account")
        self.password = QLineEdit(self)
        self.password.setGeometry(QtCore.QRect(90, 160, 381, 31))
        self.password.setObjectName("password")
        self.password.setEchoMode(QLineEdit.Password)
        self.label_5 = QLabel(self)
        self.label_5.setGeometry(QtCore.QRect(3, 230, 80, 12))
        self.label_5.setObjectName("label_5")
        self.label_6 = QLabel(self)
        self.label_6.setGeometry(QtCore.QRect(210, 230, 54, 12))
        self.label_6.setObjectName("label_6")
        self.rowBox = QSpinBox(self)
        self.rowBox.setMinimum(3)
        self.rowBox.setGeometry(QtCore.QRect(270, 220, 41, 31))
        self.rowBox.setObjectName("spinBox")
        self.intervalBox = QDoubleSpinBox(self)
        self.intervalBox.setMinimum(0.05)
        self.intervalBox.setValue(1)
        self.intervalBox.setGeometry(QtCore.QRect(90, 220, 62, 31))
        self.intervalBox.setObjectName("doubleSpinBox")
        self.pushButton = QPushButton(self)
        self.pushButton.setGeometry(QtCore.QRect(480, 30, 75, 23))
        self.pushButton.setObjectName("pushButton")
        self.pushButton_2 = QPushButton(self)
        self.pushButton_2.setGeometry(QtCore.QRect(480, 70, 75, 23))
        self.pushButton_2.setObjectName("pushButton_2")

        self.pushButton_3 = QPushButton(self)
        self.pushButton_3.setGeometry(QtCore.QRect(20, 280, 91, 41))
        self.pushButton_3.setObjectName("pushButton_3")
        self.pushButton_4 = QPushButton(self)
        self.pushButton_4.setGeometry(QtCore.QRect(150, 280, 91, 41))
        self.pushButton_4.setObjectName("pushButton_4")
        self.pushButton_5 = QPushButton(self)
        self.pushButton_5.setGeometry(QtCore.QRect(280, 280, 91, 41))
        self.pushButton_5.setObjectName("pushButton_5")
        self.pushButton_6 = QPushButton(self)
        self.pushButton_6.setGeometry(QtCore.QRect(410, 280, 125, 41))
        self.pushButton_6.setObjectName("pushButton_6")

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 572, 23))
        self.menubar.setObjectName("menubar")
        self.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.retranslateUi()
        self.pushButton.clicked.connect(self.getExcelFilePath)
        self.pushButton_2.clicked.connect(self.getIniFilePath)
        self.pushButton_3.clicked.connect(self.login)
        self.pushButton_4.clicked.connect(self.startInput)
        self.pushButton_5.clicked.connect(self.cancelAlert)
        self.pushButton_6.clicked.connect(self.refreshFile)

    def retranslateUi(self):
        _translate = QtCore.QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "CRM+辅助录入脚本"))
        self.label.setText(_translate("MainWindow", "Excel文件:"))
        self.label_2.setText(_translate("MainWindow", "配置文件:"))
        self.pushButton.setText(_translate("MainWindow", "选择文件"))
        self.pushButton_2.setText(_translate("MainWindow", "选择文件"))
        self.label_3.setText(_translate("MainWindow", "用户名"))
        self.label_4.setText(_translate("MainWindow", "密码"))
        self.label_5.setText(_translate("MainWindow", "录入间隔(秒)"))
        self.label_6.setText(_translate("MainWindow", "录入行号"))
        self.pushButton_3.setText(_translate("MainWindow", "登陆"))
        self.pushButton_4.setText(_translate("MainWindow", "开始录入"))
        self.pushButton_5.setText(_translate("MainWindow", "去掉弹窗"))
        self.pushButton_6.setText(_translate("MainWindow", "刷新excel和配置文件"))

    def refreshFile(self):
        if self.crmAuto == None:
            self.printMessage("请先登录")
            return
        excelFile = str(self.excelPath.text())
        iniFile = str(self.iniPath.text())
        if excelFile == "":
            self.printMessage("请选择excel目录")
            return
        if iniFile == "":
            self.printMessage("请选择配置文件目录")
            return
        self.crmAuto.set_excel(excelFile)
        self.crmAuto.set_xpath(iniFile)
        self.printMessage("文件已刷新")

    def getExcelFilePath(self):
        filename = str(QFileDialog.getOpenFileName(self, filter="Excel File (*.xls *xlsx)"))
        list = filename.split("'")
        self.excelPath.setText(list[1])

    def getIniFilePath(self):
        filename = str(QFileDialog.getOpenFileName(self, filter="INI File (*.ini)"))
        list = filename.split("'")
        self.iniPath.setText(list[1])

    def login(self):
        excelFile = str(self.excelPath.text())
        iniFile = str(self.iniPath.text())
        account = str(self.account.text())
        password = str(self.password.text())
        if excelFile == "":
            self.printMessage("请选择excel目录")
            return
        if iniFile == "":
            self.printMessage("请选择配置文件目录")
            return
        if account == "":
            self.printMessage("请输入账号")
            return
        if password == "":
            self.printMessage("请输入密码")
            return
        self.crmAuto = CRMAuto(excelFile, iniFile)
        self.backThread = threading.Thread(target=self.onlogin, args=(account, password))
        self.loading.show()
        self.backThread.start()

    def onlogin(self, account, password):
        try:
            self.crmAuto.login(account, password)
        except UnexpectedAlertPresentException as e:
            self.signal.emit("出现严重错误,请重新登录再试\n" + traceback.format_exc())
        except Exception as e:
            traceback.print_exc(file=self.logFile)
            self.signal.emit("出错了,请重试\n" + traceback.format_exc())
        finally:
            self.loading.close()

    def startInput(self):
        if self.crmAuto == None:
            self.printMessage("请先登录")
            return
        row = self.rowBox.value()
        interval = self.intervalBox.value()
        self.crmAuto.set_row_index(row)
        self.crmAuto.set_interval(interval)
        self.printMessage("5秒后开始录入,请切换到浏览器窗口")
        self.loading.show()
        self.backThread = threading.Thread(target=self.autoInput)
        self.backThread.start()

    def autoInput(self):
        try:
            self.crmAuto.auto_input()
        except UnexpectedAlertPresentException as e:
            self.signal.emit("出现严重错误,请重新登录再试\n" + traceback.format_exc())
        except Exception as e:
            traceback.print_exc(file=self.logFile)
            self.signal.emit("出错了,请重试\n" + traceback.format_exc())
        finally:
            self.loading.close()

    def printMessage(self, message):
        self.messageDialog = QMessageBox.information(self, "警告", message)

    def cancelAlert(self):
        if self.crmAuto == None:
            self.printMessage("请先登录")
            return
        self.crmAuto.close_alert()
Ejemplo n.º 7
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        self.conn = pymysql.connect(
            host='10.26.1.10',
            port=3306,
            user='******',
            password='******',
            db='LGUAirline',
            charset='utf8',
        )

        self.cur = self.conn.cursor()

        self.sqlstring = "select * from students where "
        MainWindow.setObjectName("MainWindow")

        MainWindow.resize(760, 440)

        # 根据窗口的大小固定大小 这里相当于设置全屏
        MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())

        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.frame = QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(10, 10, 491, 121))
        self.frame.setFrameShape(QFrame.StyledPanel)
        self.frame.setFrameShadow(QFrame.Raised)
        self.frame.setObjectName("frame")
        self.check_Sid = QCheckBox(self.frame)
        self.check_Sid.setGeometry(QtCore.QRect(20, 10, 71, 16))
        self.check_Sid.setObjectName("check_Sid")
        self.check_Sage = QCheckBox(self.frame)
        self.check_Sage.setGeometry(QtCore.QRect(20, 70, 71, 16))
        self.check_Sage.setObjectName("check_Sage")
        self.check_Sname = QCheckBox(self.frame)
        self.check_Sname.setGeometry(QtCore.QRect(20, 40, 71, 16))
        self.check_Sname.setObjectName("check_Sname")
        self.check_Ssex = QCheckBox(self.frame)
        self.check_Ssex.setGeometry(QtCore.QRect(20, 100, 71, 16))
        self.check_Ssex.setObjectName("check_Ssex")
        self.Sid = QLineEdit(self.frame)
        self.Sid.setGeometry(QtCore.QRect(90, 10, 113, 16))
        self.Sid.setObjectName("Sid")
        self.Sname = QLineEdit(self.frame)
        self.Sname.setGeometry(QtCore.QRect(90, 40, 113, 16))
        self.Sname.setObjectName("Sname")
        self.first_Sage = QLineEdit(self.frame)
        self.first_Sage.setGeometry(QtCore.QRect(90, 70, 41, 16))
        self.first_Sage.setObjectName("first_Sage")
        self.Ssex = QLineEdit(self.frame)
        self.Ssex.setGeometry(QtCore.QRect(90, 100, 113, 16))
        self.Ssex.setObjectName("Ssex")
        self.label = QLabel(self.frame)
        self.label.setGeometry(QtCore.QRect(140, 70, 16, 16))
        self.label.setObjectName("label")
        self.last_Sage = QLineEdit(self.frame)
        self.last_Sage.setGeometry(QtCore.QRect(160, 70, 41, 16))
        self.last_Sage.setObjectName("last_Sage")
        self.check_Sdept = QCheckBox(self.frame)
        self.check_Sdept.setGeometry(QtCore.QRect(270, 40, 71, 16))
        self.check_Sdept.setObjectName("check_Sdept")
        self.Sdept = QLineEdit(self.frame)
        self.Sdept.setGeometry(QtCore.QRect(340, 40, 113, 16))
        self.Sdept.setObjectName("Sdept")
        self.Sclass = QLineEdit(self.frame)
        self.Sclass.setGeometry(QtCore.QRect(340, 10, 113, 16))
        self.Sclass.setObjectName("Sclass")
        self.check_Sclass = QCheckBox(self.frame)
        self.check_Sclass.setGeometry(QtCore.QRect(270, 10, 71, 16))
        self.check_Sclass.setObjectName("check_Sclass")
        self.Saddr = QLineEdit(self.frame)
        self.Saddr.setGeometry(QtCore.QRect(340, 70, 113, 16))
        self.Saddr.setObjectName("Saddr")
        self.check_Saddr = QCheckBox(self.frame)
        self.check_Saddr.setGeometry(QtCore.QRect(270, 70, 71, 16))
        self.check_Saddr.setObjectName("check_Saddr")
        self.find = QPushButton(self.frame)
        self.find.setGeometry(QtCore.QRect(380, 100, 75, 21))
        self.find.setObjectName("find")
        self.find.clicked.connect(self.find_btn)
        self.sql_out = QTextBrowser(self.centralwidget)
        self.sql_out.setGeometry(QtCore.QRect(10, 140, 740, 61))
        self.sql_out.setObjectName("sql_out")
        self.result_out = QTableWidget(self.centralwidget)
        self.result_out.setEditTriggers(
            QAbstractItemView.NoEditTriggers)  # 不可编辑表格
        self.result_out.setGeometry(QtCore.QRect(10, 210, 740, 171))
        self.result_out.setObjectName("result_out")
        self.result_out.setColumnCount(7)
        self.result_out.setRowCount(10)
        self.result_out.resizeColumnsToContents()
        self.result_out.resizeRowsToContents()
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(0, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(1, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(2, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(3, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(4, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(5, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(6, item)
        self.result_out.horizontalHeader().setDefaultSectionSize(100)
        self.result_out.horizontalHeader().setMinimumSectionSize(25)
        self.result_out.verticalHeader().setDefaultSectionSize(30)
        self.pushButton_2 = QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(675, 390, 75, 21))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.p2_clicked)
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 509, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def p2_clicked(self):
        self.pyqt_clicked1.emit()

    def find_btn(self):
        self.pyqt_clicked2.emit()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.check_Sid.setText(_translate("MainWindow", "学号", None))
        self.check_Sage.setText(_translate("MainWindow", "年龄自", None))
        self.check_Sname.setText(_translate("MainWindow", "姓名", None))
        self.check_Ssex.setText(_translate("MainWindow", "性别", None))
        self.label.setText(_translate("MainWindow", "到", None))
        self.check_Sdept.setText(_translate("MainWindow", "系", None))
        self.check_Sclass.setText(_translate("MainWindow", "班级", None))
        self.check_Saddr.setText(_translate("MainWindow", "地址", None))
        self.find.setText(_translate("MainWindow", "查询", None))
        self.sql_out.setText(self.sqlstring)
        item = self.result_out.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "Sid", None))
        item = self.result_out.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "Sname ", None))
        item = self.result_out.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "Sage", None))
        item = self.result_out.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "Ssex", None))
        item = self.result_out.horizontalHeaderItem(4)
        item.setText(_translate("MainWindow", "Sclass", None))
        item = self.result_out.horizontalHeaderItem(5)
        item.setText(_translate("MainWindow", "Sdept", None))
        item = self.result_out.horizontalHeaderItem(6)
        item.setText(_translate("MainWindow", "Saddr", None))
        self.pushButton_2.setText(_translate("MainWindow", "退出", None))

    def mousePressEvent(self, event):
        # if event.KeyWord == Qt.LeftButton:
        print("nihao")

    def buttonTest(self):
        temp_sqlstring = self.sqlstring
        is_first = True
        if self.check_Sid.isChecked():
            mystr = self.Sid.text()
            if is_first:
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "Sid = '" + self.Sid.text() + "'"
                else:
                    temp_sqlstring += "Sid like '" + self.Sid.text() + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and Sid = '" + self.Sid.text() + "'"
                else:
                    temp_sqlstring += " and Sid like '" + self.Sid.text() + "'"

        if self.check_Sname.isChecked():
            if is_first:
                mystr = self.Sname.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "Sname = '" + self.Sname.text() + "'"
                else:
                    temp_sqlstring += "Sname like '" + self.Sname.text() + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and Sname = '" + self.Sname.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and Sname like '" + self.Sname.text(
                    ) + "'"

        if self.check_Sage.isChecked():
            if is_first:
                is_first = False
                temp_sqlstring += "Sage >= " + self.first_Sage.text() + \
                                  " and Sage <= " + self.last_Sage.text()
            else:
                temp_sqlstring += " and Sage >= " + self.first_Sage.text() + \
                                  " and Sage <= " + self.last_Sage.text()

        if self.check_Ssex.isChecked():
            if is_first:
                is_first = False
                temp_sqlstring += "Ssex = '" + self.Ssex.text() + "'"
            else:
                temp_sqlstring += " and Ssex = '" + self.Ssex.text() + "'"

        if self.check_Sclass.isChecked():
            if is_first:
                mystr = self.Sclass.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "Sclass = '" + self.Sclass.text() + "'"
                else:
                    temp_sqlstring += "Sclass like '" + self.Sclass.text(
                    ) + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and Sclass = '" + self.Sclass.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and Sclass like '" + self.Sclass.text(
                    ) + "'"

        if self.check_Sdept.isChecked():
            if is_first:
                mystr = self.Sdept.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "Sdept = '" + self.Sdept.text() + "'"
                else:
                    temp_sqlstring += "Sdept like '" + self.Sdept.text() + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and Sdept = '" + self.Sdept.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and Sdept like '" + self.Sdept.text(
                    ) + "'"

        if self.check_Saddr.isChecked():
            if is_first:
                mystr = self.Saddr.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "Saddr = '" + self.Saddr.text() + "'"
                else:
                    temp_sqlstring += " and Saddr like '" + self.Saddr.text(
                    ) + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and Saddr = '" + self.Saddr.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and Saddr like '" + self.Saddr.text(
                    ) + "'"

        self.result_out.clearContents()  # 每一次查询时清除表格中信息
        if not (is_first):
            print(temp_sqlstring)
            self.cur.execute(temp_sqlstring)
            k = 0
            for i in self.cur:
                print("----------", i)
                w = 0
                for j in i:
                    # 这里是将int类型转成string类型,方便后面文本设置
                    if type(j) == int:
                        newItem = QTableWidgetItem(str(j))

                    else:
                        newItem = QTableWidgetItem(j)
                    # 根据循环标签一次对table中的格子进行设置
                    self.result_out.setItem(k, w, newItem)
                    w += 1
                k += 1

        self.sql_out.setText("")
        self.sql_out.append(temp_sqlstring)
        print("find button pressed")

    def buttonExit(self):
        self.conn.commit()
        self.cur.close()
        self.conn.close()
        self.close()

    def keyPressEvent(self, e):
        if e.key() == QtCore.Qt.Key_Escape:
            self.buttonExit()
Ejemplo n.º 8
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(500, 262)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
        self.button_find_id = QPushButton(self.centralwidget)
        self.button_find_id.setGeometry(QtCore.QRect(370, 10, 110, 32))
        self.button_find_id.setObjectName(_fromUtf8("button_find_id"))
        self.button_find_name = QPushButton(self.centralwidget)
        self.button_find_name.setGeometry(QtCore.QRect(370, 50, 110, 32))
        self.button_find_name.setObjectName(_fromUtf8("button_find_name"))
        self.button_find_cas = QPushButton(self.centralwidget)
        self.button_find_cas.setGeometry(QtCore.QRect(370, 90, 110, 32))
        self.button_find_cas.setObjectName(_fromUtf8("button_find_cas"))
        self.button_find_vpid = QPushButton(self.centralwidget)
        self.button_find_vpid.setGeometry(QtCore.QRect(370, 130, 110, 32))
        self.button_find_vpid.setObjectName(_fromUtf8("button_find_cas"))

        self.button_add = QPushButton(self.centralwidget)
        self.button_add.setGeometry(QtCore.QRect(150, 180, 110, 32))
        self.button_add.setObjectName(_fromUtf8("button_add"))

        self.button_stop = QPushButton(self.centralwidget)
        self.button_stop.setGeometry(QtCore.QRect(150, 210, 110, 32))
        self.button_stop.setObjectName(_fromUtf8("button_stop"))

        self.button_invent = QPushButton(self.centralwidget)
        self.button_invent.setGeometry(QtCore.QRect(20, 180, 120, 32))
        self.button_invent.setObjectName(_fromUtf8("button_invent"))

        self.button_invent_2 = QPushButton(self.centralwidget)
        self.button_invent_2.setGeometry(QtCore.QRect(20, 210, 120, 32))
        self.button_invent_2.setObjectName(_fromUtf8("button_invent_2"))

        self.button_delete = QPushButton(self.centralwidget)
        self.button_delete.setGeometry(QtCore.QRect(260, 210, 120, 32))
        self.button_delete.setObjectName(_fromUtf8("button_delete"))

        self.button_manual = QPushButton(self.centralwidget)
        self.button_manual.setGeometry(QtCore.QRect(260, 180, 120, 32))
        self.button_manual.setObjectName(_fromUtf8("button_delete"))  

        self.button_repop = QPushButton(self.centralwidget)
        self.button_repop.setGeometry(QtCore.QRect(380, 195, 110, 32))
        self.button_repop.setObjectName(_fromUtf8("button_repop"))     


        self.line_id = QLineEdit(self.centralwidget)
        self.line_id.setGeometry(QtCore.QRect(90, 10, 251, 21))
        self.line_id.setObjectName(_fromUtf8("line_id"))
        self.line_name = QLineEdit(self.centralwidget)
        self.line_name.setGeometry(QtCore.QRect(90, 50, 251, 21))
        self.line_name.setObjectName(_fromUtf8("line_name"))
        self.line_cas = QLineEdit(self.centralwidget)
        self.line_cas.setGeometry(QtCore.QRect(90, 90, 251, 21))
        self.line_cas.setObjectName(_fromUtf8("line_cas"))
        self.line_vpid = QLineEdit(self.centralwidget)
        self.line_vpid.setGeometry(QtCore.QRect(90, 130, 251, 21))
        self.line_vpid.setObjectName(_fromUtf8("line_cas"))       
        self.label_id = QLabel(self.centralwidget)
        self.label_id.setGeometry(QtCore.QRect(10, 10, 56, 13))
        self.label_id.setObjectName(_fromUtf8("label_id"))
        self.label_name = QLabel(self.centralwidget)
        self.label_name.setGeometry(QtCore.QRect(10, 50, 56, 13))
        self.label_name.setObjectName(_fromUtf8("label_name"))
        self.label_cas = QLabel(self.centralwidget)
        self.label_cas.setGeometry(QtCore.QRect(10, 90, 56, 13))
        self.label_cas.setObjectName(_fromUtf8("label_cas"))
        self.label_vpid = QLabel(self.centralwidget)
        self.label_vpid.setGeometry(QtCore.QRect(10, 130, 56, 13))
        self.label_vpid.setObjectName(_fromUtf8("label_cas"))       
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 500, 22))
        self.menubar.setObjectName(_fromUtf8("menubar"))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(_fromUtf8("statusbar"))
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        #connection
        #self.trigger=QtCore.pyqtSignal()
        #self.trigger.connect(self.button_add, QtCore.SIGNAL("released()"), self.new)
        #self.connect(self.button_stop, QtCore.SIGNAL("released()"), self.quit)
        #self.connect(self.button_find_id, QtCore.SIGNAL("released()"), self.find_id)
        #self.connect(self.button_find_name, QtCore.SIGNAL("released()"), self.find_name)
        #self.connect(self.button_find_vpid, QtCore.SIGNAL("released()"), self.find_vpid)
        #self.connect(self.button_find_cas, QtCore.SIGNAL("released()"), self.find_cas)
        #self.connect(self.button_invent, QtCore.SIGNAL("released()"), self.invent)
        #self.connect(self.button_invent_2, QtCore.SIGNAL("released()"), self.invent_2)
        #self.connect(self.button_delete, QtCore.SIGNAL("released()"), self.delete)
        #self.connect(self.button_manual, QtCore.SIGNAL("released()"), self.manu)
        #self.connect(self.button_repop, QtCore.SIGNAL("released()"), self.repop)
        self.button_stop.clicked.connect(self.quit)
        self.button_add.clicked.connect(self.new)
        self.button_find_id.clicked.connect(self.find_id)
        self.button_find_name.clicked.connect(self.find_name)
        self.button_find_vpid.clicked.connect(self.find_vpid)
        self.button_find_cas.clicked.connect(self.find_cas)
        self.button_invent.clicked.connect(self.invent)
        self.button_invent_2.clicked.connect(self.invent_2)
        self.button_delete.clicked.connect(self.delete)
        self.button_manual.clicked.connect(self.manu)
        self.button_repop.clicked.connect(self.repop)

    def invent(self) :
        prog=QProgressDialog("Compiling inventory...","Cancel",0,100,self)
        prog.open()
        allconn=cursor.connection()
        curs=allconn[0]
        data=allconn[1]
        curs.execute("""SELECT * FROM "main"."chem" WHERE "id" > 0 """)
        store=curs.fetchall()
        a=excel.makeinvent(store)
        a.begin()
        internal=0
        if prog.wasCanceled() :
                return None
        while internal != 100 :
            try :
                internal=(a.returnid()/len(store))*100
            except :
                internal=100
            prog.setValue(internal)
            if prog.wasCanceled() :
                return None
        b=a.returnbook()
        try :  
            fname=QFileDialog.getSaveFileName(self, 'Save File', '/','Excel File (*.xls)')[0]
            b.save(fname)
            QMessageBox.information(self, "Info", "Inventory was saved sucessfully.")
            if prog.wasCanceled() :
                return None
        except :
            QMessageBox.information(self, "Info", "Inventory was no saved.")

    def invent_2 (self) :

        prog=QProgressDialog("Compiling inventory...","Cancel",0,100,self)
        prog.open()
        allconn=cursor.connection()
        curs=allconn[0]
        data=allconn[1]
        curs.execute("""SELECT "storage" FROM "main"."chem" WHERE "id" > 0 """)
        store=curs.fetchall()
        newstore=[]
        count=-1
        if prog.wasCanceled() :
                return None
        for i in store :
            count=count+1
            if i[0] not in newstore :
                newstore.append(store[count][0])

        a=excel.makeinvent_2(newstore)
        a.begin()
        internal=[0,1]
        percent=0
        if prog.wasCanceled() :
                return None
        while percent != 100 :
            internal=(a.returnid())
            try :
                percent=((internal[0]/internal[1])*100)
            except :
                percent=100
            prog.setValue(percent)
            if prog.wasCanceled() :
                return None
        b=a.returnbook()
        try :  
            fname=QFileDialog.getSaveFileName(self, 'Save File', '/','Excel File (*.xls)')[0]
            b.save(fname)
            QMessageBox.information(self, "Info", "Inventory was saved sucessfully.")
        except :
            QMessageBox.information(self, "Info", "Inventory was no saved.")





    def new (self) :

        self.prop=display.Ui_chem()
        curs=cursor.connection()[0]
        curs.execute('''SELECT MAX(id) FROM chem''')
        maximum=curs.fetchone()[0]
        maximum=int(maximum)
        if maximum==-1 :
            maximum=0
        self.prop.line_id.setText(str(maximum+1))
        self.prop.line_id.setReadOnly(True)
        self.prop.show()


    def find_id (self) :
        allconn=cursor.connection()
        curs=allconn[0]
        data=allconn[1]
        idfind=str(self.line_id.text())
        idfind=(idfind,)
        curs.execute('''SELECT * FROM chem WHERE id=?''', idfind)
        data.commit()
        data.commit()
        store=curs.fetchone()
        if str(self.line_id.text())=="-1" :
            store=None
        data.close()
        if store != None :
            self.line_id.setText('')
            self.prop=display.Ui_chem()
            self.prop.line_name.setText(store[0])
            self.prop.line_vendor.setText(store[1])
            self.prop.line_vpid.setText(store[2])
            self.prop.line_cas.setText(store[3])
            self.prop.line_size.setText(store[4])
            self.prop.line_storage.setText(store[5])
            self.prop.line_room.setText(store[6])
            self.prop.line_id.setText(str(store[7]))
            self.prop.line_id.setReadOnly(True)
            self.prop.show()
        else :
            self.line_id.setText('')           
            QMessageBox.information(self, "Error", "ID doesn't exist")
            data.close()

    def find_vpid (self) :
        allconn=cursor.connection()
        curs=allconn[0]
        data=allconn[1]
        idfind=str(self.line_vpid.text())
        idfind=(idfind,)
        curs.execute('''SELECT * FROM chem WHERE vpid=?''', idfind)
        data.commit()
        data.commit()
        store=curs.fetchone()
        print(store[0])
        if store[0]=="CHEMDB\n" or store[0]=='CHEMDB' :
            store=None
        data.close()
        if store != None :
            self.line_id.setText('')
            self.prop=display.Ui_chem()
            self.prop.line_name.setText(store[0])
            self.prop.line_vendor.setText(store[1])
            self.prop.line_vpid.setText(store[2])
            self.prop.line_cas.setText(store[3])
            self.prop.line_size.setText(store[4])
            self.prop.line_storage.setText(store[5])
            self.prop.line_room.setText(store[6])
            self.prop.line_id.setText(str(store[7]))
            self.prop.line_id.setReadOnly(True)
            self.prop.show()
        else :
            self.line_id.setText('')           
            QMessageBox.information(self, "Error", "Vendor ID doesn't exist")
            data.close()

    def delete (self) :

        self.prop=delete.Ui_delete_entries()
        self.prop.show()

    def find_name (self) :
        allconn=cursor.connection()
        curs=allconn[0]
        data=allconn[1]
        idfind=str(self.line_name.text())
        idfind.lower()
        idfind="%"+idfind+"%"
        idfind=(idfind,)
        curs.execute('''SELECT "name", "id", "storage" FROM "main"."chem" where "name" LIKE ? LIMIT 0, 100''', idfind)
        data.commit()
        store=curs.fetchall()
        for item in store :
            if item[0]=="CHEMDB\n" or item[0]=="CHEMDB" :
                store.remove(item)
        if store != None and len(store)==1 :
            curs.execute('''SELECT * FROM "main"."chem" where "name" LIKE ? LIMIT 0, 100''', idfind)
            data.commit()
            store=curs.fetchall()
            for item in store :
                if item[0]=="CHEMDB\n" or item[0]=="CHEMDB" :
                    store.remove(item)
            data.close()
            self.line_name.setText('')
            self.prop=display.Ui_chem()
            self.prop.line_name.setText(store[0][0])
            self.prop.line_vendor.setText(store[0][1])
            self.prop.line_vpid.setText(store[0][2])
            self.prop.line_cas.setText(store[0][3])
            self.prop.line_size.setText(store[0][4])
            self.prop.line_storage.setText(store[0][5])
            self.prop.line_room.setText(store[0][6])
            self.prop.line_id.setText(str(store[0][7]))
            self.prop.line_id.setReadOnly(True)
            self.prop.show()        

        elif store != None and len(store)>1 :
            self.listing=listing.Ui_Form()
            self.listing.list.clear()
            reform=[]
            for produit in range(len(store)) :
                reform.append(str(store[produit][0])+" // STORE : "+ str(store[produit][2]) +" // ID : " + str(store[produit][1]))
                self.listing.list.addItem(reform[produit])
            data.close()
            if len(store)>=99 :
                QMessageBox.information(self, "Warning", "More than 100 references were found. Only displaying the first 100 records")
            self.line_name.setText('')
            self.listing.show()

        else :
            data.close()
            self.line_name.setText('')
            QMessageBox.information(self, "Error", "The research gave nothing back")

    def find_cas (self) :
        allconn=cursor.connection()
        curs=allconn[0]
        data=allconn[1]
        casfind=str(self.line_cas.text())
        casfind.lower()
        casfind=(casfind,)
        curs.execute('''SELECT * FROM "main"."chem" WHERE "cas"=?''', casfind)
        store=curs.fetchone()
        if store[0]=="CHEMDB\n" or store[0]=='CHEMDB' :
            store=None
        if store!=None :
            self.prop=display.Ui_chem()
            self.prop.line_name.setText(store[0])
            self.prop.line_vendor.setText(store[1])
            self.prop.line_vpid.setText(store[2])
            self.prop.line_cas.setText(store[3])
            self.prop.line_size.setText(store[4])
            self.prop.line_storage.setText(store[5])
            self.prop.line_room.setText(store[6])
            self.prop.line_id.setText(str(store[7]))
            self.prop.line_id.setReadOnly(True)
            self.line_cas.setText('')
            self.prop.show()

        else :
            QMessageBox.information(self, "Error", "Cannot found CAS")
            self.line_cas.setText('')
            data.close()

    def repop (self) :
        h=QMessageBox.question(self, "WARNING", "WARNING ! Repopulate will erase all the database by an Excel file generated by this database. Do not do this action randomly !!! Are you sur you want to continue ?")
        if h==QMessageBox.No :
            return None
        fname=QFileDialog.getOpenFileName(self, 'Choose an Excel File', '/','Excem File (*.xls)')[0]
        prog=QProgressDialog("Gathering Data...","Cancel",0,100,self)
        prog.open()
        if prog.wasCanceled() :
            return None
        rep=excel.repopulate(fname)
        try :
            rep.begin()
            if prog.wasCanceled() :
                return None
        except :
            return None
        state=int(rep.returnstate())
        prog.setLabelText("Repopulating...")
        while state==0 :
            prog.setValue(rep.returnpercent())
            state=rep.returnstate()
            prog.setCancelButton(None)
        if state==1 :
            prog.close()
            QMessageBox.information(self, "Sucess", "Repopulation Sucess")
        if state==-1 :
            QMessageBox.information(self, "Error", "Repopulation Failled")

    def abort(self) :
        return None


    def manu (self) :
        self.load=manual.Ui_manual()
        self.load.show()

    def quit (self) :
        QApplication.quit()

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "Chem Database", None))
        self.button_find_id.setText(_translate("MainWindow", "Find ID", None))
        self.button_find_vpid.setText(_translate("MainWindow", "Find Vendor ID", None))
        self.button_repop.setText(_translate("MainWindow", "Repopulate", None))
        self.button_find_name.setText(_translate("MainWindow", "Find Name", None))
        self.button_find_cas.setText(_translate("MainWindow", "Find CAS", None))
        self.button_add.setText(_translate("MainWindow", "Add Entry", None))
        self.button_stop.setText(_translate("MainWindow","Close Program",None))
        self.button_invent.setText(_translate("MainWindow","Inventory:Full",None))
        self.button_invent_2.setText(_translate("MainWindow","Inventory:Group",None))
        self.button_delete.setText(_translate('MainWindow','Delete Entries',None))
        self.button_manual.setText(_translate('MainWindow','Manual CMD',None))
        self.label_id.setText(_translate("MainWindow", "ID", None))
        self.label_name.setText(_translate("MainWindow", "Name", None))
        self.label_cas.setText(_translate("MainWindow", "CAS", None))
        self.label_vpid.setText(_translate("MainWindow", "Vendor ID", None))
Ejemplo n.º 9
0
class MainWindow(QMainWindow):

    #此处定义常量

    #此处定义信号

    def __init__(self):
        QMainWindow.__init__(self)

    def setup(self):
        #        定义主窗口
        self.setEnabled(True)
        self.resize(800, 600)
        self.setMinimumSize(QSize(800, 600))

        #        创建堆叠窗口
        self.mw_stacked_widget = StackedWidget()
        self.mw_stacked_widget.setup()

        #        创建参数列表窗口
        self.mw_paralist_dock = ParalistDock()
        self.mw_paralist_dock.setup()
        self.addDockWidget(Qt.DockWidgetArea(1), self.mw_paralist_dock)

        #        设置主窗口布局
        self.mainwindow_layout = QWidget(self)
        self.mainwindow_layout.setObjectName("mainwindow_layout")
        self.horizontalLayout = QHBoxLayout(self.mainwindow_layout)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.horizontalLayout.addWidget(self.mw_stacked_widget)
        self.setCentralWidget(self.mainwindow_layout)

        #        创建菜单栏
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        self.menu_file = QMenu(self.menubar)
        self.menu_file.setObjectName("menu_file")
        self.menu_import = QMenu(self.menu_file)
        self.menu_import.setObjectName("menu_import")
        self.menu_export = QMenu(self.menu_file)
        self.menu_export.setObjectName("menu_export")
        self.menu_edit = QMenu(self.menubar)
        self.menu_edit.setObjectName("menu_edit")
        self.menu_view = QMenu(self.menubar)
        self.menu_view.setObjectName("menu_view")
        self.menu_tools = QMenu(self.menubar)
        self.menu_tools.setObjectName("menu_tools")
        self.menu_window = QMenu(self.menubar)
        self.menu_window.setObjectName("menu_window")
        self.menu_help = QMenu(self.menubar)
        self.menu_help.setObjectName("menu_help")
        self.menu_analysis = QMenu(self.menubar)
        self.menu_analysis.setObjectName("menu_analysis")
        self.menu_mathematics = QMenu(self.menu_analysis)
        self.menu_mathematics.setObjectName("menu_mathematics")
        self.menu_data_manipulation = QMenu(self.menu_analysis)
        self.menu_data_manipulation.setObjectName("menu_data_manipulation")
        self.menu_data_manage = QMenu(self.menu_analysis)
        self.menu_data_manage.setObjectName("menu_data_manage")
        self.menu_plot = QMenu(self.menubar)
        self.menu_plot.setObjectName("menu_plot")
        self.setMenuBar(self.menubar)

        #        创建状态栏
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        #        创建工具栏
        self.toolbar = QToolBar(self)
        self.toolbar.setObjectName("toolbar")
        self.addToolBar(Qt.TopToolBarArea, self.toolbar)

        #        创建动作
        self.action_new = QAction(self)
        self.action_new.setObjectName("action_new")
        self.action_open = QAction(self)
        self.action_open.setObjectName("action_open")
        self.action_import_normal_datafile = QAction(self)
        self.action_import_normal_datafile.setObjectName(
            "action_import_normal_datafile")
        self.action_export_data = QAction(self)
        self.action_export_data.setObjectName("action_export_data")
        self.action_exit = QAction(self)
        self.action_exit.setObjectName("action_exit")
        self.action_simple_math = QAction(self)
        self.action_simple_math.setObjectName("action_simple_math")
        self.action_testpoint_manage = QAction(self)
        self.action_testpoint_manage.setObjectName("action_testpoint_manage")
        self.action_synchronization = QAction(self)
        self.action_synchronization.setObjectName("action_synchronization")
        self.action_tuning = QAction(self)
        self.action_tuning.setObjectName("action_tuning")
        self.action_para_manage = QAction(self)
        self.action_para_manage.setObjectName("action_para_manage")
        self.action_temp_manage = QAction(self)
        self.action_temp_manage.setObjectName("action_temp_manage")
        self.action_options = QAction(self)
        self.action_options.setObjectName("action_options")
        self.action_about = QAction(self)
        self.action_about.setObjectName("action_about")
        self.action_quick_plot = QAction(self)
        self.action_quick_plot.setObjectName("action_quick_plot")
        self.action_custom_defined_plot = QAction(self)
        self.action_custom_defined_plot.setObjectName(
            "action_custom_defined_plot")
        self.action_multi_source_plot = QAction(self)
        self.action_multi_source_plot.setObjectName("action_multi_source_plot")
        self.action_paralist_dock_isclosed = QAction(self)
        self.action_paralist_dock_isclosed.setCheckable(True)
        self.action_paralist_dock_isclosed.setChecked(True)
        self.action_paralist_dock_isclosed.setObjectName(
            "action_paralist_dock_isclosed")

        #        将动作添加到对应的菜单下
        self.menu_import.addAction(self.action_import_normal_datafile)
        self.menu_export.addAction(self.action_export_data)
        self.menu_file.addAction(self.action_new)
        self.menu_file.addAction(self.action_open)
        self.menu_file.addSeparator()
        self.menu_file.addAction(self.menu_import.menuAction())
        self.menu_file.addAction(self.menu_export.menuAction())
        self.menu_file.addSeparator()
        self.menu_file.addAction(self.action_exit)
        self.menu_view.addAction(self.action_paralist_dock_isclosed)
        self.menu_tools.addAction(self.action_options)
        self.menu_help.addAction(self.action_about)
        self.menu_mathematics.addAction(self.action_simple_math)
        self.menu_data_manipulation.addAction(self.action_testpoint_manage)
        self.menu_data_manipulation.addAction(self.action_synchronization)
        self.menu_data_manipulation.addAction(self.action_tuning)
        self.menu_data_manage.addAction(self.action_para_manage)
        self.menu_data_manage.addAction(self.action_temp_manage)
        self.menu_analysis.addAction(self.menu_mathematics.menuAction())
        self.menu_analysis.addAction(self.menu_data_manipulation.menuAction())
        self.menu_analysis.addAction(self.menu_data_manage.menuAction())
        self.menu_plot.addAction(self.action_quick_plot)
        self.menu_plot.addAction(self.action_custom_defined_plot)
        self.menu_plot.addAction(self.action_multi_source_plot)
        self.menubar.addAction(self.menu_file.menuAction())
        self.menubar.addAction(self.menu_edit.menuAction())
        self.menubar.addAction(self.menu_view.menuAction())
        self.menubar.addAction(self.menu_analysis.menuAction())
        self.menubar.addAction(self.menu_plot.menuAction())
        self.menubar.addAction(self.menu_tools.menuAction())
        self.menubar.addAction(self.menu_window.menuAction())
        self.menubar.addAction(self.menu_help.menuAction())
        self.toolbar.addAction(self.action_import_normal_datafile)

        self.retranslate()
        #        QMetaObject.connectSlotsByName(self)

        # =======连接信号与槽
        self.mw_paralist_dock.signal_close.connect(
            self.slot_paralist_dock_close)

# =============================================================================
# Views
# =============================================================================

# =============================================================================
#    与新建项目有关的显示

    def view_new(self):
        return NewProjectDialog().get_project_info()

    def view_set_window_title(self, title):
        if title:
            self.setWindowTitle(title + ' - Demo')
# =============================================================================
#    与打开项目有关的显示

#    响应打开项目的指令,函数返回一个str型的文件路径

    def view_open(self):
        sel_pro = QFileDialog.getExistingDirectory(self, 'Open Program')
        if sel_pro:
            sel_pro = sel_pro.replace('/', '\\')
            return sel_pro
        else:
            return None

    def view_open_status(self, status, pro_name):
        if status:

            tipDialog = QMessageBox(self)
            tipDialog.resize(300, 100)
            tipDialog.setWindowTitle("Information")
            tipDialog.setText("Open a project suceessfully!")
            tipDialog.exec_()
        else:
            tipDialog = QMessageBox(self)
            tipDialog.resize(300, 100)
            tipDialog.setWindowTitle("Caution")
            tipDialog.setText("Unsuceessfully, It's not a project!")
            tipDialog.exec_()

# =============================================================================
#    与关于数据导入有关的显示

#

# =============================================================================
#    与关于信息显示有关的显示

#    显示About信息

    def view_about(self):
        QMessageBox.about(
            self, QCoreApplication.translate("MainWindow", "关于演示程序"),
            QCoreApplication.translate(
                "MainWindow", """<b>演示程序</b>
            <br>试飞数据绘图软件
            <br>Copyright &copy; FTCC
            <p>由试飞中心试飞工程部绘图软件开发团队开发维护
            """))

# =============================================================================
#    与参数窗口有关的显示

#    响应参数窗口显示动作

    def control_paralist_dock_isclosed(self):
        if self.mw_paralist_dock.isHidden():
            self.mw_paralist_dock.setHidden(False)
        else:
            self.mw_paralist_dock.setHidden(True)

# =============================================================================
# Slots
# =============================================================================

#        参数窗口关闭后需要把视图下的勾选去掉

    def slot_paralist_dock_close(self):
        self.action_paralist_dock_isclosed.setChecked(False)

# =============================================================================
# 汉化
# =============================================================================

    def retranslate(self):
        _translate = QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "演示程序"))
        self.menu_file.setTitle(_translate("MainWindow", "文件"))
        self.menu_import.setTitle(_translate("MainWindow", "导入"))
        self.menu_export.setTitle(_translate("MainWindow", "导出"))
        self.menu_edit.setTitle(_translate("MainWindow", "编辑"))
        self.menu_view.setTitle(_translate("MainWindow", "视图"))
        self.menu_tools.setTitle(_translate("MainWindow", "工具"))
        self.menu_window.setTitle(_translate("MainWindow", "窗口"))
        self.menu_help.setTitle(_translate("MainWindow", "帮助"))
        self.menu_analysis.setTitle(_translate("MainWindow", "分析"))
        self.menu_mathematics.setTitle(_translate("MainWindow", "数学计算"))
        self.menu_data_manipulation.setTitle(_translate("MainWindow", "数据操作"))
        self.menu_data_manage.setTitle(_translate("MainWindow", "数据管理"))
        self.menu_plot.setTitle(_translate("MainWindow", "绘图"))
        self.mw_paralist_dock.setWindowTitle(_translate("MainWindow", "参数窗口"))
        self.mw_paralist_dock.line_edit_search_para.setPlaceholderText(
            _translate("MainWindow", "过滤器"))
        self.toolbar.setWindowTitle(_translate("MainWindow", "工具栏"))
        self.action_new.setText(_translate("MainWindow", "新建"))
        self.action_open.setText(_translate("MainWindow", "打开"))
        self.action_import_normal_datafile.setText(
            _translate("MainWindow", "通用数据"))
        self.action_export_data.setText(_translate("MainWindow", "数据文件"))
        self.action_export_data.setToolTip(_translate("MainWindow", "数据文件"))
        self.action_exit.setText(_translate("MainWindow", "退出"))
        self.action_simple_math.setText(_translate("MainWindow", "简单计算"))
        self.action_testpoint_manage.setText(_translate("MainWindow", "试验点"))
        self.action_synchronization.setText(_translate("MainWindow", "时间同步"))
        self.action_tuning.setText(_translate("MainWindow", "调频"))
        self.action_para_manage.setText(_translate("MainWindow", "参数"))
        self.action_temp_manage.setText(_translate("MainWindow", "模板"))
        self.action_options.setText(_translate("MainWindow", "选项"))
        self.action_about.setText(_translate("MainWindow", "关于"))
        self.action_quick_plot.setText(_translate("MainWindow", "快速绘图"))
        self.action_custom_defined_plot.setText(
            _translate("MainWindow", "自定义绘图"))
        self.action_multi_source_plot.setText(_translate("MainWindow", "并行绘图"))
        self.action_paralist_dock_isclosed.setText(
            _translate("MainWindow", "参数窗口"))
Ejemplo n.º 10
0
class AcquisitionWindow(QMainWindow):
    def __init__(self, parent=None):
        super(AcquisitionWindow, self).__init__(parent)
        self.initUI(self)

    # Setup UI elements
    def initUI(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.setGeometry(10, 290, 340, 500)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.gridLayoutWidget = QWidget(self.centralwidget)
        self.gridLayoutWidget.setGeometry(QRect(10, 30, 330, 236))
        self.gridLayoutWidget.setObjectName("gridLayoutWidget")
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setHorizontalSpacing(10)
        self.gridLayout.setObjectName("gridLayout")

        self.steadyStatLabel = QLabel(self.centralwidget)
        self.steadyStatLabel.setGeometry(QRect(10, 10, 111, 16))

        self.minVLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.minVLabel, 0, 0, 1, 1)
        self.minVText = QLineEdit(self)
        self.gridLayout.addWidget(self.minVText, 0, 1, 1, 1)
        self.minVText.editingFinished.connect(self.validateVoltages)

        self.maxVLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.maxVLabel, 1, 0, 1, 1)
        self.maxVText = QLineEdit(self)
        self.gridLayout.addWidget(self.maxVText, 1, 1, 1, 1)
        self.maxVText.editingFinished.connect(self.validateVoltages)

        self.startVLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.startVLabel, 2, 0, 1, 1)
        self.startVText = QLineEdit(self)
        self.startVText.editingFinished.connect(self.validateVoltages)
        self.gridLayout.addWidget(self.startVText, 2, 1, 1, 1)

        self.stepVLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.stepVLabel, 3, 0, 1, 1)
        self.stepVText = QLineEdit(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.stepVText, 3, 1, 1, 1)

        self.gateVLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.gateVLabel, 4, 0, 1, 1)
        self.gateVText = QLineEdit(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.gateVText, 4, 1, 1, 1)

        self.holdTLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.holdTLabel, 5, 0, 1, 1)
        self.holdTText = QLineEdit(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.holdTText, 5, 1, 1, 1)

        self.numAverScansLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.numAverScansLabel, 6, 0, 1, 1)
        self.numAverScansText = QLineEdit(self)
        self.gridLayout.addWidget(self.numAverScansText, 6, 1, 1, 1)

        self.delayBeforeMeasLabel = QLabel(self.gridLayoutWidget)
        self.gridLayout.addWidget(self.delayBeforeMeasLabel, 7, 0, 1, 1)
        self.delayBeforeMeasText = QLineEdit(self)
        self.gridLayout.addWidget(self.delayBeforeMeasText, 7, 1, 1, 1)

        self.trackingLabel = QLabel(self.centralwidget)
        self.trackingLabel.setGeometry(QRect(10, 280, 160, 16))

        self.enableTrackingBox = QCheckBox(self.centralwidget)
        self.enableTrackingBox.setGeometry(QRect(160, 280, 87, 20))

        self.pvModeLabel = QLabel(self.centralwidget)
        self.pvModeLabel.setGeometry(QRect(10, 300, 160, 16))

        self.pvModeBox = QCheckBox(self.centralwidget)
        self.pvModeBox.setGeometry(QRect(160, 300, 87, 20))

        self.gridLayoutWidget_2 = QWidget(self.centralwidget)
        self.gridLayoutWidget_2.setGeometry(QRect(10, 320, 330, 181))
        self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2)
        self.gridLayout_2.setHorizontalSpacing(10)

        self.numPointsLabel = QLabel(self.gridLayoutWidget_2)
        self.gridLayout_2.addWidget(self.numPointsLabel, 0, 0, 1, 1)
        self.numPointsText = QSpinBox(self)
        self.gridLayout_2.addWidget(self.numPointsText, 0, 1, 1, 1)

        self.intervalLabel = QLabel(self.gridLayoutWidget_2)
        self.gridLayout_2.addWidget(self.intervalLabel, 1, 0, 1, 1)
        self.IntervalText = QLineEdit(self)
        self.gridLayout_2.addWidget(self.IntervalText, 1, 1, 1, 1)

        self.totTimePerDeviceLabel = QLabel(self.gridLayoutWidget_2)
        self.gridLayout_2.addWidget(self.totTimePerDeviceLabel, 2, 0, 1, 1)

        MainWindow.setCentralWidget(self.centralwidget)

        self.menuBar = QMenuBar(MainWindow)
        self.menuBar.setGeometry(QRect(0, 0, 772, 22))
        self.menuBar.setObjectName("menubar")

        self.parent().viewWindowMenus(self.menuBar, self.parent())

        MainWindow.setMenuBar(self.menuBar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.statusBar().showMessage("Acquisition: Ready", 5000)

        MainWindow.setWindowTitle("Acquisition Window")
        self.steadyStatLabel.setText("<qt><b>Steady State</b></qt>")
        self.minVLabel.setText("Min Voltage [V]")
        self.maxVLabel.setText("Max Voltage [V]")
        self.startVLabel.setText("Start Voltage [V]")
        self.stepVLabel.setText("Step Voltage [V]")
        self.gateVLabel.setText("Gate Voltage - SMU3 [V]")
        self.holdTLabel.setText("Hold time [s]")
        self.numAverScansLabel.setText("Number of averaged scans ")
        self.delayBeforeMeasLabel.setText("Delays before measurements [sec]")
        self.trackingLabel.setText("<qt><b>Track Voc, Jsc, MPP: </b></qt>")
        self.pvModeLabel.setText("<qt><b>PV mode: </b></qt>")
        self.numPointsLabel.setText("Number of points")
        self.intervalLabel.setText("Interval")
        self.totTimePerDeviceLabel.setText("Total time per device")

        self.saveButton = QPushButton(self.centralwidget)
        self.saveButton.setGeometry(QRect(250, 390, 80, 60))
        self.saveButton.setText("Save")
        self.saveButton.clicked.connect(self.saveParameters)

        self.defaultButton = QPushButton(self.centralwidget)
        self.defaultButton.setGeometry(QRect(160, 390, 80, 60))
        self.defaultButton.setText("Default")
        self.defaultButton.clicked.connect(self.defaultParameters)

        self.initParameters()

        self.minVText.editingFinished.connect(self.timePerDevice)
        self.maxVText.editingFinished.connect(self.timePerDevice)
        self.stepVText.editingFinished.connect(self.timePerDevice)
        self.numAverScansText.editingFinished.connect(self.timePerDevice)
        self.delayBeforeMeasText.editingFinished.connect(self.timePerDevice)
        self.holdTText.editingFinished.connect(self.timePerDevice)

    # Save acquisition parameters in configuration ini
    def saveParameters(self):
        self.parent().config.conf['Acquisition']['acqMinVoltage'] = str(
            self.minVText.text())
        self.parent().config.conf['Acquisition']['acqMaxVoltage'] = str(
            self.maxVText.text())
        self.parent().config.conf['Acquisition']['acqStartVoltage'] = str(
            self.startVText.text())
        self.parent().config.conf['Acquisition']['acqStepVoltage'] = str(
            self.stepVText.text())
        self.parent().config.conf['Acquisition']['acqGateVoltage'] = str(
            self.gateVText.text())
        self.parent().config.conf['Acquisition']['acqHoldTime'] = str(
            self.holdTText.text())
        self.parent().config.conf['Acquisition']['acqNumAvScans'] = str(
            self.numAverScansText.text())
        self.parent().config.conf['Acquisition']['acqDelBeforeMeas'] = str(
            self.delayBeforeMeasText.text())
        self.parent().config.conf['Acquisition']['acqTrackNumPoints'] = str(
            self.numPointsText.value())
        self.parent().config.conf['Acquisition']['acqTrackInterval'] = str(
            self.IntervalText.text())
        self.parent().config.conf['Acquisition']['acqPVmode'] = str(
            self.pvModeBox.isChecked())

        self.parent().config.saveConfig(self.parent().config.configFile)
        self.parent().config.readConfig(self.parent().config.configFile)
        print("Acquisition parameters saved as default")
        logger.info("Acquisition parameters saved as default")
        self.timePerDevice()

    # Set default acquisition parameters from configuration ini
    def defaultParameters(self):
        self.parent().config.createConfig()
        self.parent().config.readConfig(self.parent().config.configFile)
        self.initParameters()
        print("Default acquisition parameters restored")
        logger.info("Default acquisition parameters restored")
        self.timePerDevice()

    # Populate acquisition panel with values from config
    def initParameters(self):
        self.minVText.setText(str(self.parent().config.acqMinVoltage))
        self.maxVText.setText(str(self.parent().config.acqMaxVoltage))
        self.startVText.setText(str(self.parent().config.acqStartVoltage))
        self.stepVText.setText(str(self.parent().config.acqStepVoltage))
        self.gateVText.setText(str(self.parent().config.acqGateVoltage))
        self.holdTText.setText(str(self.parent().config.acqHoldTime))
        self.numAverScansText.setText(str(self.parent().config.acqNumAvScans))
        self.delayBeforeMeasText.setText(
            str(self.parent().config.acqDelBeforeMeas))
        self.numPointsText.setValue(int(
            self.parent().config.acqTrackNumPoints))
        self.IntervalText.setText(str(self.parent().config.acqTrackInterval))
        self.pvModeBox.setChecked(
            eval(self.parent().config.conf['Acquisition']['acqPVmode']))
        self.timePerDevice()

    # Field validator for VStart
    def validateVoltages(self):
        maxV = 100
        minV = -100
        try:
            validateStartVoltage = QDoubleValidator(
                float(self.minVText.text()), float(self.maxVText.text()), 6,
                self.startVText)
            validateMaxVoltage = QDoubleValidator(float(self.minVText.text()),
                                                  maxV, 6, self.maxVText)
            validateMinVoltage = QDoubleValidator(minV,
                                                  float(self.maxVText.text()),
                                                  6, self.minVText)
        except:
            pass

        if validateStartVoltage.validate(self.startVText.text(),1)[0] != 2 or \
            validateMaxVoltage.validate(self.maxVText.text(),1)[0] != 2 or \
            validateMinVoltage.validate(self.minVText.text(),1)[0] != 2:
            msg = "Sweep voltages (including Start) need to be \n between Vmin and Vmax"+\
                "\n\nPlease change Voltages in the Acquisition panel"
            reply = QMessageBox.question(self, 'Critical', msg, QMessageBox.Ok)
            self.show()

    # Calculate the measurement time per device
    def timePerDevice(self):
        try:
            timePerDevice = (len(np.arange(float(self.minVText.text())-1e-9,
                                      float(self.maxVText.text())+1e-9,
                                      float(self.stepVText.text()))) * \
                                      float(self.holdTText.text()) + \
                                      float(self.delayBeforeMeasText.text())) * \
                                      float(self.numAverScansText.text())
        except:
            timePerDevice = 0
        self.totTimePerDeviceLabel.setText(\
                "Total time per device: <qt><b>{0:0.1f}s</b></qt>".format(timePerDevice))

    # Enable and disable fields (flag is either True or False) during acquisition.
    def enableAcqPanel(self, flag):
        self.minVText.setEnabled(flag)
        self.maxVText.setEnabled(flag)
        self.startVText.setEnabled(flag)
        self.stepVText.setEnabled(flag)
        self.gateVText.setEnabled(flag)
        self.holdTText.setEnabled(flag)
        self.numAverScansText.setEnabled(flag)
        self.delayBeforeMeasText.setEnabled(flag)
        self.numPointsText.setEnabled(flag)
        self.IntervalText.setEnabled(flag)
        self.saveButton.setEnabled(flag)
        self.defaultButton.setEnabled(flag)
        self.enableTrackingBox.setEnabled(flag)
Ejemplo n.º 11
0
class MainWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.minimize_to_tray = True
        self.alarm = AlarmDaemon(self)

        # Window definitions
        self.setMinimumSize(QSize(480, 320))
        self.setWindowTitle("AthanPy")
        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")

        # Layout definitions
        self.gridLayout_2 = QGridLayout(self.centralwidget)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QGridLayout()
        self.gridLayout.setObjectName("gridLayout")

        # Widget definitions
        #self.txt_times = QLabel(self.centralwidget)
        #sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
        #sizePolicy.setHorizontalStretch(0)
        #sizePolicy.setVerticalStretch(0)
        #sizePolicy.setHeightForWidth(self.txt_times.sizePolicy().hasHeightForWidth())
        #self.txt_times.setSizePolicy(sizePolicy)
        #self.txt_times.setAlignment(Qt.AlignCenter)
        #self.txt_times.setObjectName("txt_times")
        #self.txt_times.setText(self.get_prayertime_text())
        #self.gridLayout.addWidget(self.txt_times, 1, 0, 1, 1)
        self.lbl_prayername = {}
        self.lbl_prayertime = {}
        i = 1
        for n in [
                'Fajr', 'Sunrise', 'Dhuhr', 'Asr', 'Maghrib', 'Isha',
                'Midnight'
        ]:
            self.lbl_prayername[n] = QLabel(self.centralwidget)
            self.lbl_prayername[n].setAlignment(Qt.AlignLeft)
            self.lbl_prayername[n].setText(n)
            self.gridLayout.addWidget(self.lbl_prayername[n], i, 0, 1, 1)

            self.lbl_prayertime[n] = QLabel(self.centralwidget)
            self.lbl_prayertime[n].setAlignment(Qt.AlignCenter)
            self.gridLayout.addWidget(self.lbl_prayertime[n], i, 1, 1, 1)
            i += 1
        self.set_prayertime()

        self.txt_date = QLabel(self.centralwidget)
        self.txt_date.setObjectName("txt_date")
        self.gridLayout.addWidget(self.txt_date, 0, 0, 1, 2)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)

        # Menu bar
        self.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 480, 20))
        self.menubar.setObjectName("menubar")
        self.menuFile = QMenu(self.menubar)
        self.menuFile.setObjectName("menuFile")
        self.setMenuBar(self.menubar)

        # Status bar
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.actionSettings = QAction(self)
        self.actionSettings.setObjectName("actionSettings")
        self.actionSettings.setText("Settings")
        self.actionSettings.triggered.connect(self.show_settings)

        self.actionQuit = QAction(self)
        self.actionQuit.setObjectName("actionQuit")
        self.actionQuit.setText("Quit")
        self.actionQuit.triggered.connect(qApp.quit)

        self.menuFile.addAction(self.actionSettings)
        self.menuFile.addAction(self.actionQuit)
        self.menuFile.setTitle("File")

        self.menubar.addAction(self.menuFile.menuAction())

        # QSystemTrayIcon
        self.tray_icon = QSystemTrayIcon(self)
        self.tray_icon.setIcon(self.style().standardIcon(
            QStyle.SP_ComputerIcon))

        show_action = QAction("Show", self)
        hide_action = QAction("Hide", self)
        mute_action = QAction("Mute sound", self)
        stopsound_action = QAction("Stop sound", self)
        quit_action = QAction("Quit", self)

        show_action.triggered.connect(self.show)
        hide_action.triggered.connect(self.hide)
        mute_action.setCheckable(True)
        mute_action.changed.connect(
            lambda: self.alarm.set_mute(mute_action.isChecked()))
        stopsound_action.triggered.connect(self.alarm.stop_sound)
        quit_action.triggered.connect(QCoreApplication.quit)

        tray_menu = QMenu()
        tray_menu.addAction(show_action)
        tray_menu.addAction(hide_action)
        tray_menu.addSeparator()
        tray_menu.addAction(stopsound_action)
        tray_menu.addAction(mute_action)
        tray_menu.addSeparator()
        tray_menu.addAction(quit_action)
        self.tray_icon.setContextMenu(tray_menu)
        self.tray_icon.show()

        # Settings window
        self.settingswindow = SettingsWindow(self)

    def closeEvent(self, event):
        if self.minimize_to_tray:
            print('triggered 1')
            event.ignore()
            self.hide()
            self.tray_icon.showMessage("Tray Program",
                                       "Application was minimized to tray",
                                       QSystemTrayIcon.Information, 2000)

    def set_prayertime(self):
        SettingsManager.refreshVariables(self.show_settings)
        SettingsManager.calcTimes()

        times = SettingsManager.times
        # For testing purposes, comment/delete when not in use
        #times['dhuhr'] = '08:02'
        #times['asr'] = '08:03'
        #        times['isha'] = '16:20'
        for n in [
                'Fajr', 'Sunrise', 'Dhuhr', 'Asr', 'Maghrib', 'Isha',
                'Midnight'
        ]:
            self.lbl_prayertime[n].setText(times[n.lower()])

        self.alarm.stop_alarm()
        self.alarm.schedule_alarm(times)
        self.alarm.start()
        #return output

    def show_settings(self):
        self.settingswindow.show()
Ejemplo n.º 12
0
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__(flags=QtCore.Qt.Window)
        self.setWindowIcon(QIcon(QPixmap(":/icon/codeblock_icon.svg")))
        scale_x = QDesktopWidget().screenGeometry().width()/1920
        scale_y = QDesktopWidget().screenGeometry().height()/1080
        self.resize(1280*scale_x, 720*scale_y)
        self.centralwidget = QWidget()
        self.centralwidget.setObjectName("centralwidget")

        self.horizontalLayout = QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.splitter = QSplitter(self.centralwidget)

        self.tabWidget = QTabWidget(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(4)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())

        self.tabWidget.setSizePolicy(sizePolicy)
        self.tabWidget.setTabShape(QTabWidget.Rounded)
        self.tabWidget.setMovable(True)
        self.tabWidget.setObjectName("tabWidget")

        self.tab = QWidget()
        self.tab.setObjectName("tab")

        self.verticalLayout2 = QVBoxLayout(self.tab)
        self.classView = QTreeWidget(self.tab)
        self.classView.header().setVisible(False)
        self.verticalLayout2.addWidget(self.classView)

        self.tabWidget.addTab(self.tab, "")

        self.splitter.addWidget(self.tabWidget)

        self.tabWidget_2 = QTabWidget(self.centralwidget)
        self.tab_3 = QWidget()
        self.tab_3.setObjectName("tab_3")
        self.tabWidget_2.addTab(self.tab_3, "")

        self.scrollAreaWidgetContents = QWidget()
        self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 184, 148))
        self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")

        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(7)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tabWidget_2.sizePolicy().hasHeightForWidth())

        self.tabWidget_2.setSizePolicy(sizePolicy)
        self.tabWidget_2.setTabsClosable(False)
        self.tabWidget_2.setMovable(True)
        self.tabWidget_2.setObjectName("tabWidget_2")

        self.splitter.addWidget(self.tabWidget_2)

        self.horizontalLayout.addWidget(self.splitter)
        self.setCentralWidget(self.centralwidget)

        self.menubar = QMenuBar()
        self.menubar.setGeometry(QtCore.QRect(0, 0, 1280, 23))
        self.menubar.setObjectName("menubar")
        self.menuFile = QMenu(self.menubar)
        self.menuHelp = QMenu(self.menubar)

        self.actionOpen = QAction(self)
        self.actionOpen.setText("Open")

        self.menuFile.addAction(self.actionOpen)
        self.menuFile.setTitle("File")
        self.menubar.addAction(self.actionOpen)

        self.actionAbout = QAction(self)
        self.actionAbout.setText("About Codeblock Visual Studio")

        self.actionTutorial = QAction(self)
        self.actionTutorial.setText("Rerun Tutorial")

        self.menuHelp.addAction(self.actionAbout)
        self.menuHelp.addAction(self.actionTutorial)
        self.menuHelp.setTitle("Help")
        self.menubar.addAction(self.menuHelp.menuAction())

        self.setMenuBar(self.menubar)

        self.statusbar = QStatusBar()
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.frameLayout = QHBoxLayout(self.tab_3)
        self.scroll = QScrollArea()
        self.scrollContents = QWidget()
        self.scrollContents.setGeometry(QtCore.QRect(0, 0, 5000, 50000))
        self.scrollLayout = QHBoxLayout(self.scrollContents)

        self.codeArea = QFrame(self.scrollContents)
        self.codeArea.setMinimumSize(QtCore.QSize(200, 2000))
        self.scrollLayout.addWidget(self.codeArea)
        self.frameLayout.addWidget(self.scroll)
        self.scroll.setWidget(self.scrollContents)

        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), "Class View")
        self.tabWidget_2.setTabText(self.tabWidget_2.indexOf(self.tab_3), "Code Area")
Ejemplo n.º 13
0
class UI_MainWindow(object):
    def __init__(self, MainWindow):
        self.load_ui(MainWindow)

    def load_ui(self, MainWindow):
        # Set Main window and main widget
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(531, 693)
        MainWindow.setWindowTitle("Scope settings")
        self.MainWidget = QWidget(MainWindow)
        self.MainWidget.setObjectName("MainWidget")
        MainWindow.setCentralWidget(self.MainWidget)

        # Y-Scale of the signal
        self.comboBox_signal_y_scale = QComboBox(self.MainWidget)
        self.comboBox_signal_y_scale.setGeometry(QRect(10, 20, 85, 27))
        self.comboBox_signal_y_scale.setObjectName("comboBox_signal_y_scale")

        self.label_signal_y_scale = QLabel(self.MainWidget)
        self.label_signal_y_scale.setGeometry(QRect(10, 60, 67, 17))
        self.label_signal_y_scale.setObjectName("label_signal_y_scale")
        self.label_signal_y_scale.setText("Time (s)")

        # X-Scale of the signal
        self.spinBox_signal_x_scale = QSpinBox(self.MainWidget) # Integers
        self.spinBox_signal_x_scale.setGeometry(QRect(10, 80, 85, 27))
        self.spinBox_signal_x_scale.setMinimum(1)
        self.spinBox_signal_x_scale.setMaximum(int(_BUFFER_DURATION))
        self.spinBox_signal_x_scale.setProperty("value", 10) # Default 10s
        self.spinBox_signal_x_scale.setObjectName("spinBox_signal_x_scale")

        self.label_signal_x_scale = QLabel(self.MainWidget)
        self.label_signal_x_scale.setGeometry(QRect(10, 0, 67, 17))
        self.label_signal_x_scale.setObjectName("label_signal_x_scale")
        self.label_signal_x_scale.setText("Scale")

        # CAR
        self.checkBox_car = QCheckBox(self.MainWidget)
        self.checkBox_car.setGeometry(QRect(120, 0, 97, 22))
        self.checkBox_car.setObjectName("checkBox_car")
        self.checkBox_car.setText("CAR Filter")

        # BP Filter
        self.checkBox_bandpass = QCheckBox(self.MainWidget)
        self.checkBox_bandpass.setGeometry(QRect(120, 20, 141, 22))
        self.checkBox_bandpass.setObjectName("checkBox_bandpass")
        self.checkBox_bandpass.setText("Bandpass Filter")

        # Set bandpass 'LOW'
        self.doubleSpinBox_bandpass_low = QDoubleSpinBox(self.MainWidget) # Floats
        self.doubleSpinBox_bandpass_low.setGeometry(QRect(250, 17, 69, 27))
        self.doubleSpinBox_bandpass_low.setMinimum(0.1)
        self.doubleSpinBox_bandpass_low.setMaximum(1000.0)
        self.doubleSpinBox_bandpass_low.setSingleStep(1.0)
        self.doubleSpinBox_bandpass_low.setProperty("value", 1.0) # Default 1Hz
        self.doubleSpinBox_bandpass_low.setObjectName("doubleSpinBox_bandpass_low")

        # Set bandpass 'HIGH'
        self.doubleSpinBox_bandpass_high = QDoubleSpinBox(self.MainWidget)
        self.doubleSpinBox_bandpass_high.setGeometry(QRect(330, 17, 69, 27))
        self.doubleSpinBox_bandpass_high.setMinimum(1.0)
        self.doubleSpinBox_bandpass_high.setMaximum(1000.0)
        self.doubleSpinBox_bandpass_high.setSingleStep(1.0)
        self.doubleSpinBox_bandpass_high.setProperty("value", 40.0) # Default 40Hz
        self.doubleSpinBox_bandpass_high.setObjectName("doubleSpinBox_bandpass_high")

        # Show LPT events
        self.checkBox_show_LPT_events = QCheckBox(self.MainWidget)
        self.checkBox_show_LPT_events.setGeometry(QRect(120, 80, 151, 22))
        self.checkBox_show_LPT_events.setObjectName("checkBox_show_LPT_events")
        self.checkBox_show_LPT_events.setText("Show LPT events")

        # Lines
        self.line1 = QFrame(self.MainWidget)
        self.line1.setGeometry(QRect(100, -1, 21, 133))
        self.line1.setFrameShape(QFrame.VLine)
        self.line1.setFrameShadow(QFrame.Sunken)
        self.line1.setObjectName("line1")

        self.line2 = QFrame(self.MainWidget)
        self.line2.setGeometry(QRect(110, 45, 421, 21))
        self.line2.setFrameShape(QFrame.HLine)
        self.line2.setFrameShadow(QFrame.Sunken)
        self.line2.setObjectName("line2")

        self.line3 = QFrame(self.MainWidget)
        self.line3.setGeometry(QRect(290, 57, 21, 75))
        self.line3.setFrameShape(QFrame.VLine)
        self.line3.setFrameShadow(QFrame.Sunken)
        self.line3.setObjectName("line3")

        # Start recording
        self.pushButton_start_recording = QPushButton(self.MainWidget)
        self.pushButton_start_recording.setGeometry(QRect(390, 60, 61, 31))
        self.pushButton_start_recording.setObjectName("pushButton_start_recording")
        self.pushButton_start_recording.setText("REC")
        self.pushButton_start_recording.setEnabled(False)

        # Stop recording
        self.pushButton_stop_recording = QPushButton(self.MainWidget)
        self.pushButton_stop_recording.setGeometry(QRect(460, 60, 61, 31))
        self.pushButton_stop_recording.setObjectName("pushButton_stop_recording")
        self.pushButton_stop_recording.setText("Stop REC")
        self.pushButton_stop_recording.setEnabled(False)

        # Set recording directory
        self.pushButton_set_recording_dir = QPushButton(self.MainWidget)
        self.pushButton_set_recording_dir.setGeometry(QRect(310, 60, 71, 31))
        self.pushButton_set_recording_dir.setObjectName("pushButton_set_recording_dir")
        self.pushButton_set_recording_dir.setText("REC Dir")

        # Edit Line for the recording directory
        self.lineEdit_recording_dir = QLineEdit(self.MainWidget)
        self.lineEdit_recording_dir.setGeometry(QRect(310, 100, 211, 27))
        self.lineEdit_recording_dir.setObjectName("lineEdit_recording_dir")

        # Table of channels
        self.table_channels = QTableWidget(self.MainWidget)
        self.table_channels.setGeometry(QRect(4, 131, 525, 503))
        self.table_channels.setMaximumSize(QSize(529, 16777215))
        self.table_channels.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)
        self.table_channels.setTextElideMode(QtCore.Qt.ElideMiddle)
        self.table_channels.setShowGrid(False)
        self.table_channels.setObjectName("table_channels")
        self.table_channels.setColumnCount(0)
        self.table_channels.setRowCount(0)
        self.table_channels.horizontalHeader().setVisible(False)
        self.table_channels.horizontalHeader().setHighlightSections(False)
        self.table_channels.verticalHeader().setVisible(False)
        self.table_channels.verticalHeader().setHighlightSections(False)

        # Bottom status Bar
        self.statusBar = QStatusBar(MainWindow)
        self.statusBar.setObjectName("statusBar")
        MainWindow.setStatusBar(self.statusBar)
Ejemplo n.º 14
0
class TfrmBase(QMainWindow, TScreenStates):

    recordCount = 0

    def __init__(self, parent=None):
        super(TfrmBase, self).__init__()

        self.FOnStateChange = self.onStateChange
        self.activeState = self.ssInactive
        self._defaultSettings()
        self._createWidgets()
        self._setEvents()

    def _defaultSettings(self):
        self.setObjectName("frmBase")
        self.resize(640, 480)
        self.setMinimumSize(QSize(640, 480))

    def _createWidgets(self):
        self._createLayout()
        self._createMenus()
        self._createToolBar()
        self._createStatusBar()
        self._createPages()
        self._setLayouts()

    def _createLayout(self):
        self.clientArea = QWidget()
        self.clientArea.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.clientArea.setMinimumSize(QSize(640, 400))
        self.clientArea.setBaseSize(QSize(640, 400))
        self.clientArea.setLayoutDirection(Qt.LeftToRight)
        self.clientArea.setObjectName("clientArea")
        self.gridLayout = QGridLayout(self.clientArea)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setSpacing(0)
        self.gridLayout.setObjectName("gridLayout")

    def _createMenus(self):
        # Create a Menu Bar
        self.mnMenu = self.menuBar()
        self.mnMenu.setObjectName("mnMenu")
        # Create all Top Menus
        self.mnApp = QMenu('&Aplicação')
        self.mnApp.setObjectName('mnApp')
        self.mnOpe = QMenu('&Operação')
        self.mnOpe.setObjectName("mnOperations")
        self.mnNav = QMenu('&Navegação')
        self.mnNav.setObjectName("mnNav")
        # Set Menus to MenuBar
        self.mnMenu.addMenu(self.mnNav)
        self.mnMenu.addMenu(self.mnOpe)
        self.mnMenu.addMenu(self.mnApp)
        # Crealte all Actions to Application Menu
        self._createAppActions()
        self._createOpeActions()
        self._setMenuActions()
        self.mnMenu.addAction(self.mnApp.menuAction())
        self.mnMenu.addAction(self.mnOpe.menuAction())
        self.mnMenu.addAction(self.mnNav.menuAction())
        self._settingActionsEvents()

    def _createAppActions(self):
        # Exit Program Action
        self.acExit = QAction(
            self.getIcon("./resources/exit.ico", QSize(32, 32)), '&Sair')
        self.acExit.setObjectName("acExit")
        self.acExit.setShortcut('Ctrl+Q')
        self.acExit.setStatusTip('Finalizar o Programa')
        self.acExit.triggered.connect(self.closeApp)

    def _createOpeActions(self):
        # Search Action
        self.acSearch = QAction(
            self.getIcon("./resources/Search.ico", QSize(32, 32)),
            '&Pesquisar')
        self.acSearch.setObjectName("acSearch")
        self.acSearch.setShortcut('F5,Ctrl+P')
        self.acSearch.setStatusTip(
            'Preenche o Filtro para Selecionar Registros')
        # List Action
        self.acList = QAction(
            self.getIcon("./resources/list.ico", QSize(32, 32)), '&Listar')
        self.acList.setShortcut('Ctrl+L')
        self.acList.setStatusTip('Listar todos os Registros')
        self.acList.setObjectName("acList")
        # Insert Action
        self.acInsert = QAction(
            self.getIcon("./resources/db_add.ico", QSize(32, 32)), '&Inserir')
        self.acInsert.setShortcut('F2,Ins')
        self.acInsert.setStatusTip('Incluir Novo Registros')
        self.acInsert.setObjectName("acInsert")
        # Update Action
        self.acUpdate = QAction(
            self.getIcon("./resources/db_update.ico", QSize(32, 32)),
            '&Editar')
        self.acUpdate.setShortcut('Ctrl+U')
        self.acUpdate.setStatusTip('Editar o Registro Atual')
        self.acUpdate.setObjectName("acUpdate")
        # Delete Action
        self.acDelete = QAction(
            self.getIcon("./resources/db_remove.ico", QSize(32, 32)),
            '&Excluir')
        self.acDelete.setShortcut('Ctrl+Del')
        self.acDelete.setStatusTip('Exclui o Registro Atual')
        self.acDelete.setObjectName("acDelete")
        # Save Action
        self.acSave = QAction(
            self.getIcon("./resources/db_commit.ico", QSize(32, 32)),
            '&Salvar')
        self.acSave.setShortcut('F10,Ctrl+S')
        self.acSave.setStatusTip('Salva as Alterações do Registro')
        self.acSave.setObjectName("acSave")
        # Cancel Action
        self.acCancel = QAction(
            self.getIcon("./resources/cancel.ico", QSize(32, 32)), '&Cancelar')
        self.acCancel.setShortcut('Esc')
        self.acCancel.setStatusTip('Cancela as Alterações do Registro')
        self.acCancel.setObjectName("acCancel")
        # First Action
        self.acFirst = QAction(
            self.getIcon("./resources/start.ico", QSize(32, 32)), '&Início')
        self.acFirst.setShortcut('Ctrl+Left')
        self.acFirst.setStatusTip('Vai para o Primeiro Registro')
        self.acFirst.setObjectName("acFirst")
        # Prior Action
        self.acPrior = QAction(
            self.getIcon("./resources/left.ico", QSize(32, 32)), '&Anterior')
        self.acPrior.setShortcut('Left')
        self.acPrior.setStatusTip('Vai para o Registro Anterior')
        self.acPrior.setObjectName("acPrior")
        # Next Action
        self.acNext = QAction(
            self.getIcon("./resources/right.ico", QSize(32, 32)), '&Próximo')
        self.acNext.setShortcut('Right')
        self.acNext.setStatusTip('Vai para o Próximo Registro')
        self.acNext.setObjectName("acNext")
        # Last Action
        self.acLast = QAction(
            self.getIcon("./resources/end.ico", QSize(32, 32)), '&Último')
        self.acLast.setShortcut('Ctrl+Right')
        self.acLast.setStatusTip('Vai para o Último Registro')
        self.acLast.setObjectName("acLast")
        # Form Title Action
        self.dcTitle = QAction()
        font = QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setWeight(75)
        self.dcTitle.setFont(font)
        self.dcTitle.setObjectName("dcTitle")

    def getIcon(self, res: str, size: QSize) -> QIcon:
        icon = QIcon()
        icon.addPixmap(
            QPixmap(res).scaled(size.width(), size.height(),
                                Qt.KeepAspectRatio), QIcon.Active, QIcon.On)
        return icon

    def _setMenuActions(self):
        # Set Menu Application Actions
        self.mnApp.addAction(self.acExit)
        # Set Menu Operations Actions
        self.mnOpe.addAction(self.acSearch)
        self.mnOpe.addAction(self.acList)
        self.mnOpe.addSeparator()
        self.mnOpe.addAction(self.acInsert)
        self.mnOpe.addAction(self.acUpdate)
        self.mnOpe.addAction(self.acDelete)
        self.mnOpe.addSeparator()
        self.mnOpe.addAction(self.acSave)
        self.mnOpe.addAction(self.acCancel)
        # Set Menu Navigation Actions
        self.mnNav.addAction(self.acFirst)
        self.mnNav.addAction(self.acPrior)
        self.mnNav.addAction(self.acNext)
        self.mnNav.addAction(self.acLast)

    def _settingActionsEvents(self):
        # Set Menu Operations Trigger onClick
        self.acSearch.triggered.connect(
            lambda: self.setFormStatus(self.ssSearch))
        self.acList.triggered.connect(
            lambda: self.setFormStatus(self.ssSearchAll))
        self.acInsert.triggered.connect(
            lambda: self.setFormStatus(self.ssInsert))
        self.acUpdate.triggered.connect(
            lambda: self.setFormStatus(self.ssUpdate))
        self.acDelete.triggered.connect(
            lambda: self.setFormStatus(self.ssDelete))
        self.acSave.triggered.connect(lambda: self.setFormStatus(self.ssPost))
        self.acCancel.triggered.connect(
            lambda: self.setFormStatus(self.ssCancel))
        # Set Menu Navigation Trigger onClick
        self.acFirst.triggered.connect(
            lambda: self.setFormStatus(self.ssFirst))
        self.acPrior.triggered.connect(
            lambda: self.setFormStatus(self.ssPrior))
        self.acNext.triggered.connect(lambda: self.setFormStatus(self.ssNext))
        self.acLast.triggered.connect(lambda: self.setFormStatus(self.ssLast))

    def _createToolBar(self):
        # Create a tbActions ToolBar
        self.tbActions = QToolBar()
        self.tbActions.setMinimumSize(QSize(300, 34))
        self.tbActions.setMaximumSize(QSize(16777215, 34))
        self.tbActions.setBaseSize(QSize(300, 34))
        self.tbActions.setAcceptDrops(False)
        self.tbActions.setToolTipDuration(3)
        self.tbActions.setAllowedAreas(Qt.TopToolBarArea)
        self.tbActions.setObjectName("tbActions")
        self.addToolBar(Qt.TopToolBarArea, self.tbActions)
        # Create a tbTitle ToolBar
        self.tbTitle = QToolBar()
        self.tbTitle.setMinimumSize(QSize(340, 34))
        self.tbTitle.setMaximumSize(QSize(16777215, 34))
        self.tbTitle.setBaseSize(QSize(341, 34))
        self.tbTitle.setAllowedAreas(Qt.TopToolBarArea)
        self.tbTitle.setToolButtonStyle(Qt.ToolButtonTextOnly)
        self.tbTitle.setFloatable(False)
        self.tbTitle.setObjectName("tbTitle")
        # self.tbTitle.setLabelAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.addToolBar(Qt.TopToolBarArea, self.tbTitle)
        # Call Add Actions to ToolBar
        self._setToolBarActions()

    def _setToolBarActions(self):
        # Set ToolBar Actions
        self.tbActions.addAction(self.acSearch)
        self.tbActions.addAction(self.acInsert)
        self.tbActions.addAction(self.acUpdate)
        self.tbActions.addAction(self.acDelete)
        self.tbActions.addSeparator()
        self.tbActions.addAction(self.acSave)
        self.tbActions.addAction(self.acExit)
        self.tbTitle.addAction(self.dcTitle)

    def _createStatusBar(self):
        self.sbStatus = QStatusBar()
        self.sbStatus.setMaximumHeight(24)
        self.sbStatus.setObjectName("sbStatus")
        self.sbStatus.setStyleSheet("""
            .QLabel {
                background-color: #FFFFFF;
                color: #000000;
            }
        """)
        self.lbStatus = QLabel(self.sbStatus)
        self.lbStatus.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
        self.lbStatus.setText('Inactive')
        self.lbStatus.setMinimumSize(QSize(130, 15))
        self.lbStatus.setFrameShape(QFrame.Panel)
        self.lbStatus.setFrameShadow(QFrame.Sunken)
        self.sbStatus.addPermanentWidget(self.lbStatus)
        self.setStatusBar(self.sbStatus)

    def _createPages(self):
        self.tabMain = QTabWidget(self.clientArea)
        self.tabMain.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.tabMain.setTabPosition(QTabWidget.South)
        self.tabMain.setObjectName("tabMain")
        self.pgList = QWidget(self.tabMain)
        self.pgList.setObjectName("pgList")
        self.pgDetail = QWidget(self.tabMain)
        self.pgDetail.setObjectName("pgDetail")
        self.tabMain.addTab(self.pgList, "")
        self.tabMain.addTab(self.pgDetail, "")
        self._createPageListContent()

    def _createPageListContent(self):
        self.treeWidget = QTreeWidget(self.pgList)
        self.treeWidget.setSizePolicy(
            QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding))
        self.treeWidget.setFrameShape(QFrame.NoFrame)
        self.treeWidget.setFrameShadow(QFrame.Plain)
        self.treeWidget.setColumnCount(3)
        self.treeWidget.setObjectName("treeWidget")
        self.treeWidget.headerItem().setText(0, "Campo")
        self.treeWidget.headerItem().setText(1, "Campo")
        self.treeWidget.headerItem().setText(2, "Campo")
        self.treeWidget.setGeometry(QRect(0, 0, 640, 370))
        self.treeWidget.setMinimumSize(QSize(640, 370))
        self.tabMain.setCurrentIndex(0)

    def _setLayouts(self):
        self.gridLayout.addWidget(self.tabMain, 0,
                                  Qt.AlignBottom | Qt.AlignRight, 1, 1)
        self.setCentralWidget(self.clientArea)

    def translateForm(self):
        self._translate = QCoreApplication.translate
        self.setWindowTitle(
            self._translate("TfrmBase", "Tela de Básica de Cadastros"))
        self.mnApp.setTitle(self._translate("TfrmBase", "Aplicação"))
        self.mnOpe.setTitle(self._translate("TfrmBase", "Operações"))
        self.mnNav.setTitle(self._translate("TfrmBase", "Navegação"))
        self.sbStatus.setToolTip(self._translate("TfrmBase",
                                                 "Barra de Status"))
        self.tbActions.setWindowTitle(
            self._translate("TfrmBase", "Ferramentas"))
        self.tbActions.setToolTip(
            self._translate("TfrmBase", "Barra de Ferramentas"))
        self.tbTitle.setWindowTitle(self._translate("TfrmBase", "Descrição"))
        self.acExit.setText(self._translate("TfrmBase", "&Sair"))
        self.acExit.setToolTip(self._translate("TfrmBase", "Sair do Programa"))
        self.acSearch.setText(self._translate("TfrmBase", "&Pesquisar"))
        self.acSearch.setStatusTip(
            self._translate("TfrmBase", "Procurar Por um Registro"))
        self.acList.setText(self._translate("TfrmBase", "&Listar Todos"))
        self.acList.setStatusTip(
            self._translate("TfrmBase", "Lista todos os Registros"))
        self.acInsert.setText(self._translate("TfrmBase", "&Inserir"))
        self.acInsert.setStatusTip(
            self._translate("TfrmBase", "Adicionar Registro"))
        self.acUpdate.setText(self._translate("TfrmBase", "&Editar"))
        self.acUpdate.setStatusTip(
            self._translate("TfrmBase", "Editar Registro"))
        self.acDelete.setText(self._translate("TfrmBase", "E&xcluir"))
        self.acDelete.setStatusTip(
            self._translate("TfrmBase", "Excluir Registro"))
        self.acSave.setText(self._translate("TfrmBase", "&Salvar"))
        self.acSave.setToolTip(self._translate("TfrmBase", "Salvar Registro"))
        self.acCancel.setText(self._translate("TfrmBase", "&Cancelar"))
        self.acCancel.setToolTip(
            self._translate("TfrmBase", "Cencelar Alterações"))
        self.dcTitle.setText(
            self._translate("TfrmBase", "Título da Tela de Cadastros"))
        self.dcTitle.setToolTip(
            self._translate("TfrmBase", "Título da Tela de Cadastros"))
        self.tabMain.setTabText(
            self.tabMain.indexOf(self.pgList),
            self._translate("TfrmBase", "Lista dos Registros"))
        self.tabMain.setTabToolTip(
            self.tabMain.indexOf(self.pgList),
            self._translate("TfrmBase", "Listagem das Ferramentas"))
        self.tabMain.setTabText(
            self.tabMain.indexOf(self.pgDetail),
            self._translate("TfrmBase", "Detalhes do Registro Selecionando"))

    @property
    def activeState(self):
        return self._activeValue

    @property
    def activeStateColor(self):
        return self.activeValue['FG']

    @property
    def activeStateBackgroud(self):
        return self.activeValue['BG']

    @activeState.setter  # Seta a Propriedade _activeState
    def activeState(self, value: int):
        self.workValue = value
        self._activeState = value

    def setScreenState(self, stt: int):
        self.acExit.setEnabled(self.inBrowse(stt))
        # Set Menu Operations Actions
        self.acSearch.setEnabled((self.inBrowse(stt)
                                  or (self.recordCount == 0)))
        self.acList.setEnabled((self.inBrowse(stt) or (self.recordCount == 0)))
        self.acInsert.setEnabled(self.inBrowse(stt))
        self.acUpdate.setEnabled((self.inBrowse(stt)
                                  and (self.recordCount > 0)))
        self.acDelete.setEnabled((self.inBrowse(stt)
                                  and (self.recordCount > 0)))
        self.acSave.setEnabled(self.inUpdate(stt))
        self.acCancel.setEnabled(self.inUpdate(stt))
        # Set Menu Navigation Actions
        self.acFirst.setEnabled((self.inBrowse(stt)
                                 and (self.recordCount > 0)))
        self.acPrior.setEnabled((self.inBrowse(stt)
                                 and (self.recordCount > 0)))
        self.acNext.setEnabled((self.inBrowse(stt) and (self.recordCount > 0)))
        self.acLast.setEnabled((self.inBrowse(stt) and (self.recordCount > 0)))
        # Set tab Main if state in Browse enabled
        self.tabMain.setEnabled(self.inBrowse(stt))

    def _layoutWidgets(self):
        return (self.frmLayout.itemAt(i)
                for i in range(self.frmLayout.count()))

    def _getAllFields(self):
        arrFields = []
        for w in self._layoutWidgets():
            if (not (isinstance(w, QLabel))):
                arrFields.append(w)
        return arrFields

    def setEnableFields(self, enable: bool = True):
        # Enable All Fields
        for controls in self._layoutWidgets():
            QWidget(controls).setEnabled(enable)

    def clearFields(self):
        # cliar content of all fileds
        for controls in self._getAllFields():
            QWidget(controls).setText('')

    def setColorFields(self):
        # cliar content of all fileds
        style = ".QWidget { backgroud-color: " + self.activeStateBackgroud + "; }"
        for controls in self._getAllFields():
            QWidget(controls).setStyle(style)

    def showDataDetails(self):
        # move data of selected record to fileds
        if (self.tabMain.currentIndex() == 0):
            self.tabMain.setCurrentIndex(1)

    def filterRecord(self):
        raise NotImplementedError(500)

    def getFirstRecord(self):
        raise NotImplementedError(500)

    def getPriorRecord(self):
        raise NotImplementedError(500)

    def getNextRecord(self):
        raise NotImplementedError(500)

    def getLastRecord(self):
        raise NotImplementedError(500)

    def insertRecord(self):
        raise NotImplementedError(500)

    def deleteRecord(self):
        raise NotImplementedError(500)

    def updateRecord(self):
        raise NotImplementedError(500)

    def postRecord(self):
        raise NotImplementedError(500)

    def execOpertations(self, state: int):
        if ((state == self.ssFilter) or (state == self.ssSearchAll)):
            self.filterRecord()
        elif (state == self.ssFirst):
            self.getFirstRecord()
        elif (state == self.ssPrior):
            self.getPriorRecord()
        elif (state == self.ssNext):
            self.getNextRecord()
        elif (state == self.ssLast):
            self.getLastRecord()
        elif (state == self.ssInsert):
            self.insertRecord()
        elif (state == self.ssDelete):
            self.deleteRecord()
        elif (state == self.ssUpdate):
            self.updateRecord()
        elif (state == self.ssPost):
            self.postRecord()
        else:
            raise NotImplementedError(401, 'Operação não suportada')

    @pyqtSlot(int)
    def setFormStatus(self, state: int):
        if ((state == self.ssSearch) and (self.activeState != state)):
            self.clearFields()
            self.setColorFields()
            self.showDataDetails()

        if (self.activeState != state):
            self.activeState = state
            if (state == self.ssCancel):
                self.activeState = self.ssBrowse

    @pyqtSlot(int, int, dict, str)
    def onStateChange(self,
                      NewState: int,
                      OldState: int,
                      Result: dict = {},
                      Err: str = ''):
        try:
            # show screen state on status bar
            state = self.getStateProperties(NewState)
            style = '.QLabel { background-color: ' + state[
                'BG'] + '; color: ' + state['FG'] + '; }'
            self.sbStatus.setStyleSheet(style)
            self.lbStatus.setText(state['Descr'])

            # call operation into child screen
            self.execOpertations(NewState)
            # change buttons states
            self.setScreenState(NewState)
            # set result status code and result satatus Message
            self.setResultStatusCode = 200
            self.setResultStatusMessage = ''
        except Exception as e:
            self.ResultStatusCode = 200
            self.ResultStatusMessage = str(e)
            QMessageBox.critical(self, self.windowTitle(),
                                 self.ResultStatusMessage)
        return self.result

    @pyqtSlot()
    def tabMainChanged(self):
        self.sbStatus.showMessage('TabMain change tabIndex to (' +
                                  str(self.tabMain.currentIndex()) + ')!')
        if (self.tabMain.currentIndex() == 1):
            self.showDataDetails()

    @pyqtSlot()
    def InsertData(self):
        # self.sbStatus.showMessage('Prepare to insert data....')
        pass

    def _setEvents(self):
        self.tabMain.blockSignals(
            True)  # just for not showing the initial message
        self.tabMain.currentChanged.connect(self.tabMainChanged)  # changed!
        self.tabMain.blockSignals(False)  # wait signals now

    @pyqtSlot()
    def closeApp(self):
        self.close()
Ejemplo n.º 15
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()

        self.lastyear = int(time.strftime('%Y', time.localtime(time.time()))) - 1
        self.in_parameters = {u'datetime': str(self.lastyear) + u'年',
                              u'target_area': u'绍兴市',
                              u'density_cell': u'10',
                              u'density_class': 10,
                              u'day_cell': u'15',
                              u'day_class': 10,
                              u'out_type': u'tiff'}
        self.setupUi()

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.setFixedSize(1040, 915)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.sizePolicy().hasHeightForWidth())
        self.setSizePolicy(sizePolicy)
        icon = QIcon()
        icon.addPixmap(QPixmap('./resource/weather-thunder.png'),QIcon.Normal, QIcon.Off)
        self.setWindowIcon(icon)
        self.centralwidget = QWidget(self)
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth())
        self.centralwidget.setSizePolicy(sizePolicy)
        self.centralwidget.setObjectName("centralwidget")
        self.layoutWidget = QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QRect(32, 10, 979, 851))
        self.layoutWidget.setObjectName("layoutWidget")
        self.verticalLayout_5 =QVBoxLayout(self.layoutWidget)
        self.verticalLayout_5.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem = QSpacerItem(300, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.datetime_label = QLabel(self.layoutWidget)
        self.datetime_label.setObjectName("datetime_label")
        self.horizontalLayout.addWidget(self.datetime_label)
        self.datetime = QDateEdit(self.layoutWidget)
        self.datetime.setDateTime(QDateTime(QDate(self.lastyear, 1, 1), QTime(0, 0, 0)))
        self.datetime.setObjectName("datetime")
        self.horizontalLayout.addWidget(self.datetime)
        spacerItem1 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.target_area_label = QLabel(self.layoutWidget)
        self.target_area_label.setObjectName("target_area_label")
        self.horizontalLayout.addWidget(self.target_area_label)
        self.target_area = QComboBox(self.layoutWidget)
        self.target_area.setObjectName("target_area")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.target_area.addItem("")
        self.horizontalLayout.addWidget(self.target_area)
        spacerItem2 = QSpacerItem(300, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem2)
        self.verticalLayout_5.addLayout(self.horizontalLayout)
        self.tabWidget = QTabWidget(self.layoutWidget)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tabWidget.sizePolicy().hasHeightForWidth())
        self.tabWidget.setSizePolicy(sizePolicy)
        self.tabWidget.setObjectName("tabWidget")
        self.density_tab = QWidget()
        self.density_tab.setObjectName("density_tab")
        self.verticalLayout_3 =QVBoxLayout(self.density_tab)
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.verticalLayout_2 =QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_2 = QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.density_cell_label = QLabel(self.density_tab)
        self.density_cell_label.setObjectName("density_cell_label")
        self.horizontalLayout_2.addWidget(self.density_cell_label)
        self.density_cell = QSpinBox(self.density_tab)
        self.density_cell.setProperty("value", 10)
        self.density_cell.setObjectName("density_cell")
        self.horizontalLayout_2.addWidget(self.density_cell)
        spacerItem3 = QSpacerItem(40, 0, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem3)
        self.density_class_label = QLabel(self.density_tab)
        self.density_class_label.setObjectName("density_class_label")
        self.horizontalLayout_2.addWidget(self.density_class_label)
        self.density_class = QSpinBox(self.density_tab)
        self.density_class.setProperty("value", 10)
        self.density_class.setObjectName("density_class")
        self.horizontalLayout_2.addWidget(self.density_class)
        spacerItem4 = QSpacerItem(478, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_2.addItem(spacerItem4)
        self.density_mxd = QPushButton(self.density_tab)
        self.density_mxd.setObjectName("density_mxd")
        self.horizontalLayout_2.addWidget(self.density_mxd)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        self.density_view = QGraphicsView(self.density_tab)
        self.density_view.setObjectName("density_view")
        self.verticalLayout_2.addWidget(self.density_view)
        self.verticalLayout_3.addLayout(self.verticalLayout_2)
        self.tabWidget.addTab(self.density_tab, "")
        self.day_tab = QWidget()
        self.day_tab.setObjectName("day_tab")
        self.verticalLayout_4 =QVBoxLayout(self.day_tab)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.verticalLayout =QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout_3 =QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.day_cell_label = QLabel(self.day_tab)
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.day_cell_label.sizePolicy().hasHeightForWidth())
        self.day_cell_label.setSizePolicy(sizePolicy)
        self.day_cell_label.setObjectName("day_cell_label")
        self.horizontalLayout_3.addWidget(self.day_cell_label)
        self.day_cell = QSpinBox(self.day_tab)
        self.day_cell.setProperty("value", 15)
        self.day_cell.setObjectName("day_cell")
        self.horizontalLayout_3.addWidget(self.day_cell)
        spacerItem5 = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem5)
        self.day_class_label = QLabel(self.day_tab)
        self.day_class_label.setObjectName("day_class_label")
        self.horizontalLayout_3.addWidget(self.day_class_label)
        self.day_class = QSpinBox(self.day_tab)
        self.day_class.setProperty("value", 10)
        self.day_class.setObjectName("day_class")
        self.horizontalLayout_3.addWidget(self.day_class)
        spacerItem6 = QSpacerItem(478, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem6)
        self.day_mxd = QPushButton(self.day_tab)
        self.day_mxd.setObjectName("day_mxd")
        self.horizontalLayout_3.addWidget(self.day_mxd)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.day_view = QGraphicsView(self.day_tab)
        self.day_view.setObjectName("day_view")
        self.verticalLayout.addWidget(self.day_view)
        self.verticalLayout_4.addLayout(self.verticalLayout)
        self.tabWidget.addTab(self.day_tab, "")
        self.verticalLayout_5.addWidget(self.tabWidget)
        self.horizontalLayout_4 =QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.progressBar = QProgressBar(self.layoutWidget)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.progressBar.sizePolicy().hasHeightForWidth())
        self.progressBar.setSizePolicy(sizePolicy)
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.horizontalLayout_4.addWidget(self.progressBar)
        self.execute_button = QPushButton(self.layoutWidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.execute_button.sizePolicy().hasHeightForWidth())
        self.execute_button.setSizePolicy(sizePolicy)
        self.execute_button.setObjectName("execute_button")
        self.horizontalLayout_4.addWidget(self.execute_button)
        self.verticalLayout_5.addLayout(self.horizontalLayout_4)
        self.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 1040, 26))
        self.menubar.setObjectName("menubar")
        self.file_menu = QMenu(self.menubar)
        self.file_menu.setObjectName("file_menu")
        self.help_menu = QMenu(self.menubar)
        self.help_menu.setObjectName("help_menu")
        self.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)
        self.action_add_data = QAction(self)
        self.action_add_data.setObjectName("action_add_data")
        self.action_help = QAction(self)
        self.action_help.setObjectName("action_help")
        self.action_about = QAction(self)
        self.action_about.setObjectName("action_about")
        self.action_save_pic = QAction(self)
        self.action_save_pic.setObjectName("action_save_pic")
        self.file_menu.addAction(self.action_add_data)
        self.file_menu.addAction(self.action_save_pic)
        self.help_menu.addAction(self.action_help)
        self.help_menu.addAction(self.action_about)
        self.menubar.addAction(self.file_menu.menuAction())
        self.menubar.addAction(self.help_menu.menuAction())

        self.retranslateUi()
        self.tabWidget.setCurrentIndex(0)
        QMetaObject.connectSlotsByName(self)
        self.center()
        self.show()

        self.target_area.activated[str].connect(self.updateTargetArea)
        self.datetime.dateChanged.connect(self.updateDatetime)
        self.density_cell.valueChanged.connect(self.updateDensityCell)
        self.density_class.valueChanged.connect(self.updateDensityClass)
        self.day_cell.valueChanged.connect(self.updateDayCell)
        self.day_class.valueChanged.connect(self.updateDayClass)

        self.action_add_data.triggered.connect(self.addData)
        self.action_save_pic.triggered.connect(self.savePic)
        self.action_about.triggered.connect(self.showAbout)
        self.action_help.triggered.connect(self.showHelp)
        self.execute_button.clicked.connect(self.execute)
        self.density_mxd.clicked.connect(self.openMxdDensity)
        self.day_mxd.clicked.connect(self.openMxdDay)


        self.density_mxd.setDisabled(True)
        self.day_mxd.setDisabled(True)
        self.action_save_pic.setDisabled(True)

    def execute(self):
        dir = u"E:/Documents/工作/雷电公报/闪电定位原始文本数据/" + self.in_parameters[u'datetime']

        if os.path.exists(dir):
            datafiles = os.listdir(dir)
            datafiles = map(lambda x:os.path.join(dir,x),datafiles)
            self.in_parameters[u'origin_data_path'] = datafiles

        if not self.in_parameters.has_key(u'origin_data_path'):
            message = u"请加载%s的数据" % self.in_parameters[u'datetime']
            msgBox = QMessageBox()
            msgBox.setText(message)
            msgBox.setIcon(QMessageBox.Information)
            icon = QIcon()
            icon.addPixmap(QPixmap('./resource/weather-thunder.png'), QIcon.Normal, QIcon.Off)
            msgBox.setWindowIcon(icon)
            msgBox.setWindowTitle(" ")
            msgBox.exec_()
            return

        self.execute_button.setDisabled(True)
        self.execute_button.setText(u'正在制图中……')
        self.progressBar.setMaximum(0)
        self.progressBar.setMinimum(0)

        self.action_add_data.setDisabled(True)
        self.target_area.setDisabled(True)
        self.datetime.setDisabled(True)
        self.density_cell.setDisabled(True)
        self.density_class.setDisabled(True)
        self.day_cell.setDisabled(True)
        self.day_class.setDisabled(True)

        # for outfile in self.in_parameters[u'origin_data_path']:
        #     infile =
        #     try:
        #         with open(infile, 'w+') as in_f:
        #             for line in in_f:
        #                 line = line.replace(u":",":")
        #                 in_f.write(line)
        #     except Exception,inst:
        #         print infile

        self.process_thread = WorkThread()
        self.process_thread.trigger.connect(self.finished)
        self.process_thread.beginRun(self.in_parameters)

    def finished(self):

        #绘制闪电密度图
        ##清除上一次的QGraphicsView对象,防止其记录上一次图片结果,影响显示效果
        self.density_view.setAttribute(Qt.WA_DeleteOnClose)
        self.verticalLayout_2.removeWidget(self.density_view)
        size = self.density_view.size()
        self.density_view.close()

        self.density_view = QGraphicsView(self.density_tab)
        self.density_view.setObjectName("density_view")
        self.density_view.resize(size)
        self.verticalLayout_2.addWidget(self.density_view)

        densityPic = ''.join([cwd,u'/bulletinTemp/',
            self.in_parameters[u'datetime'],u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'闪电密度空间分布.tif'])

        scene = QGraphicsScene()
        pixmap_density = QPixmap(densityPic)
        scene.addPixmap(pixmap_density)
        self.density_view.setScene(scene)
        scale = float(self.density_view.width()) / pixmap_density.width()
        self.density_view.scale(scale, scale)

        #绘制雷暴日图
        self.day_view.setAttribute(Qt.WA_DeleteOnClose)
        self.verticalLayout.removeWidget(self.day_view)
        size = self.day_view.size()
        self.day_view.close()

        self.day_view = QGraphicsView(self.day_tab)
        self.day_view.setObjectName("day_view")
        self.day_view.resize(size)
        self.verticalLayout.addWidget(self.day_view)

        dayPic = ''.join([cwd,u'/bulletinTemp/',
            self.in_parameters[u'datetime'],u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'地闪雷暴日空间分布.tif'])

        pixmap_day = QPixmap(dayPic)
        scene = QGraphicsScene()
        scene.addPixmap(pixmap_day)
        self.day_view.resize(self.density_view.width(),self.density_view.height())
        self.day_view.setScene(scene)
        scale = float(self.day_view.width()) / pixmap_day.width()
        self.day_view.scale(scale, scale)

        #处理进度条和执行按钮状态
        self.progressBar.setMinimum(0)
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(100)
        self.progressBar.setFormat(u'完成!')
        self.execute_button.setDisabled(False)
        self.execute_button.setText(u'执行')
        #改变一些控件的状态
        self.action_add_data.setDisabled(False)
        self.target_area.setDisabled(False)
        self.datetime.setDisabled(False)
        self.density_cell.setDisabled(False)
        self.density_class.setDisabled(False)
        self.day_cell.setDisabled(False)
        self.day_class.setDisabled(False)
        self.density_mxd.setDisabled(False)
        self.day_mxd.setDisabled(False)
        self.action_save_pic.setDisabled(False)

    def addData(self):
        fnames = QFileDialog.getOpenFileNames(self, u'请选择原始的电闪数据',
                                              u'E:/Documents/工作/雷电公报/闪电定位原始文本数据',
                                              'Text files (*.txt);;All(*.*)')

        self.in_parameters[u'origin_data_path'] = fnames[0]

    def savePic(self):
        densityPic = ''.join([cwd,u'/bulletinTemp/',self.in_parameters[u'datetime'],u'/',
            self.in_parameters[u'target_area'],'.gdb',u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'闪电密度空间分布.tif'])

        dayPic = ''.join([cwd,u'/bulletinTemp/',self.in_parameters[u'datetime'],u'/',
            self.in_parameters[u'target_area'],'.gdb',u'/',self.in_parameters[u'datetime'],
            self.in_parameters[u'target_area'],u'地闪雷暴日空间分布.tif'])

        directory = QFileDialog.getExistingDirectory(self,u'请选择图片保存位置',
                                                     u'E:/Documents/工作/雷电公报',
                                    QFileDialog.ShowDirsOnly|QFileDialog.DontResolveSymlinks)

        dest_density = os.path.join(directory,os.path.basename(densityPic))
        dest_day = os.path.join(directory,os.path.basename(dayPic))

        if os.path.isfile(dest_day) or os.path.isfile(dest_density):
            message = u"文件已经存在!"
            msgBox = QMessageBox()
            msgBox.setText(message)
            msgBox.setIcon(QMessageBox.Information)
            icon = QIcon()
            icon.addPixmap(QPixmap("./resource/weather-thunder.png"), QIcon.Normal, QIcon.Off)
            msgBox.setWindowIcon(icon)
            msgBox.setWindowTitle(" ")
            msgBox.exec_()
            return

        move(dayPic,directory)
        move(densityPic,directory)

    def openMxdDay(self):
        program  = u'C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe'
        src_dir = ''.join([cwd,u'/data/LightningBulletin.gdb'])
        dest_dir = ''.join([cwd,u"/bulletinTemp/",self.in_parameters[u'datetime'], u"/" , self.in_parameters[u'target_area']])
        src_file = ''.join([self.in_parameters[u'target_area'] , u"地闪雷暴日空间分布模板.mxd"])

        copy(os.path.join(src_dir,src_file),dest_dir)

        arguments = [os.path.join(dest_dir,src_file)]
        self.process = QProcess(self)
        self.process.start(program,arguments)

    def openMxdDensity(self):
        program  = u'C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe'
        src_dir = ''.join([cwd,u'/data/LightningBulletin.gdb'])
        dest_dir = ''.join([cwd,u"/bulletinTemp/",self.in_parameters[u'datetime'], u"/" , self.in_parameters[u'target_area']])
        src_file = ''.join([self.in_parameters[u'target_area'] ,u"闪电密度空间分布模板.mxd"])


        copy(os.path.join(src_dir,src_file),dest_dir)

        arguments = [os.path.join(dest_dir,src_file)]
        self.process = QProcess(self)
        self.process.start(program,arguments)

    def showAbout(self):
        self.about = About_Dialog()

    def showHelp(self):
        program  = u'C:/Windows/hh.exe'
        arguments = [''.join([cwd,'/help/help.CHM'])]
        self.process = QProcess(self)
        self.process.start(program,arguments)

    def updateTargetArea(self, area):
        self.in_parameters[u'target_area'] = area

    def updateDatetime(self, date):
        self.in_parameters[u'datetime'] = str(date.year()) + u'年'
        if self.in_parameters.has_key(u'origin_data_path'):
            self.in_parameters.__delitem__(u'origin_data_path')

    def updateDensityCell(self, cell):
        self.in_parameters[u'density_cell'] = str(cell)

    def updateDensityClass(self, nclass):
        self.in_parameters[u'density_class'] = nclass

    def updateDayCell(self, cell):
        self.in_parameters[u'day_cell'] = str(cell)


    def updateDayClass(self, nclass):
        self.in_parameters[u'day_class'] = nclass

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def retranslateUi(self):
        _translate = QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "绍兴防雷中心 雷电公报制图"))
        self.datetime_label.setText(_translate("MainWindow", "年份"))
        self.datetime.setDisplayFormat(_translate("MainWindow", "yyyy"))
        self.target_area_label.setText(_translate("MainWindow", "地区"))
        self.target_area.setItemText(0, _translate("MainWindow", "绍兴市"))
        self.target_area.setItemText(1, _translate("MainWindow", "柯桥区"))
        self.target_area.setItemText(2, _translate("MainWindow", "上虞区"))
        self.target_area.setItemText(3, _translate("MainWindow", "诸暨市"))
        self.target_area.setItemText(4, _translate("MainWindow", "嵊州市"))
        self.target_area.setItemText(5, _translate("MainWindow", "新昌县"))
        self.density_cell_label.setText(_translate("MainWindow", "插值网格大小"))
        self.density_class_label.setText(_translate("MainWindow", "制图分类数目"))
        self.density_mxd.setText(_translate("MainWindow", "ArcGIS文档"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.density_tab), _translate("MainWindow", "电闪密度"))
        self.day_cell_label.setText(_translate("MainWindow", "插值网格大小"))
        self.day_class_label.setText(_translate("MainWindow", "制图分类数目"))
        self.day_mxd.setText(_translate("MainWindow", "ArcGIS文档"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.day_tab), _translate("MainWindow", "雷暴日"))
        self.execute_button.setText(_translate("MainWindow", "执行"))
        self.file_menu.setTitle(_translate("MainWindow", "文件"))
        self.help_menu.setTitle(_translate("MainWindow", "帮助"))
        self.action_add_data.setText(_translate("MainWindow", "加载数据"))
        self.action_help.setText(_translate("MainWindow", "使用说明"))
        self.action_about.setText(_translate("MainWindow", "关于"))
        self.action_save_pic.setText(_translate("MainWindow", "图片另存为"))
Ejemplo n.º 16
0
class MyWidget(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.btn_1.clicked.connect(self.one)
        self.btn_2.clicked.connect(self.two)
        self.btn_3.clicked.connect(self.three)
        self.btn_4.clicked.connect(self.four)
        self.btn_5.clicked.connect(self.five)
        self.btn_6.clicked.connect(self.six)
        self.btn_7.clicked.connect(self.seven)
        self.btn_8.clicked.connect(self.eight)
        self.btn_9.clicked.connect(self.nine)
        self.btn_0.clicked.connect(self.zero)
        self.btn_00.clicked.connect(self.zerozero)
        self.btn_floating.clicked.connect(self.floating)
        
        self.btn_m_plus.clicked.connect(self.m_plus)
        self.btn_m_minus.clicked.connect(self.m_minus)
        self.btn_mr.clicked.connect(self.mr)
        self.btn_mc.clicked.connect(self.mc)
        
        self.btn_sin.clicked.connect(self.sin)
        self.btn_cos.clicked.connect(self.cos)
        self.btn_tg.clicked.connect(self.tg)
        self.btn_ctg.clicked.connect(self.ctg)
        
        self.btn_plus.clicked.connect(self.plus)
        self.btn_minus.clicked.connect(self.minus)
        self.btn_ymn.clicked.connect(self.ymn)
        self.btn_step.clicked.connect(self.step)
        self.btn_delen.clicked.connect(self.delen)
        self.btn_pr.clicked.connect(self.pr)
        
        
        self.btn_delet.clicked.connect(self.delet)
        self.btn_ac.clicked.connect(self.ac)
        self.btn_result.clicked.connect(self.result)
        
        
    def one(self):
        global operator, operation
        if operation:
            operator.append('1')
            operation = False
        else:
            operator[-1] += '1'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def two(self):
        global operator, operation
        if operation:
            operator.append('2')
            operation = False
        else:
            operator[-1] += '2'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def three(self):
        global operator, operation
        if operation:
            operator.append('3')
            operation = False
        else:
            operator[-1] += '3'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def four(self):
        global operator, operation
        if operation:
            operator.append('4')
            operation = False
        else:
            operator[-1] += '4'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def five(self):
        global operator, operation
        if operation:
            operator.append('5')
            operation = False
        else:
            operator[-1] += '5'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def six(self):
        global operator, operation
        if operation:
            operator.append('6')
            operation = False
        else:
            operator[-1] += '6'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def seven(self):
        global operator, operation
        if operation:
            operator.append('7')
            operation = False
        else:
            operator[-1] += '7'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def eight(self):
        global operator, operation
        if operation:
            operator.append('8')
            operation = False
        else:
            operator[-1] += '8'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def nine(self):
        global operator, operation
        if operation:
            operator.append('9')
            operation = False
        else:
            operator[-1] += '9'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def zero(self):
        global operator, operation
        if operation:
            operator.append('0')
            operation = False
        else:
            operator[-1] += '0'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def zerozero(self):
        global operator, operation
        if operation:
            operator.append('00')
            operation = False
        else:
            operator[-1] += '00'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    def floating(self):
        global operator, operation
        if operation:
            operator.append('.')
            operation = False
        else:
            operator[-1] += '.'
        self.window.display(operator[-1])
        self.sprav.setText(''.join(operator))
    
    def m_plus(self):
        global memory, operator
        if operator[-1].isdigit():
            memory = float(memory) + float(operator[-1])
            self.m.setText("M+")
    def m_minus(self):
        global memory, operator
        if operator[-1].isdigit():
            memory = float(memory) - float(operator[-1])
            self.m.setText("M-")
    def mr(self):
        global operator, memory
        if memory != 0:
            operator.append('mr')
            self.window.display(memory)
            self.sprav.setText(''.join(operator))
    def mc(self):
        global memory
        memory = 0
        self.m.setText("")
        
    def sin(self):
        global operator, operation
        operation = True
        operator.append('sin')
        self.sprav.setText(''.join(operator))
    def cos(self):
        global operator, operation
        operation = True
        operator.append('cos')
        self.sprav.setText(''.join(operator))
    def tg(self):
        global operator, operation
        operation = True
        operator.append('tg')
        self.sprav.setText(''.join(operator))
    def ctg(self):
        global operator, operation
        operation = True
        operator.append('ctg')
        self.sprav.setText(''.join(operator))
        
    def plus(self):
        global operator, operation
        operation = True
        operator.append('+')
        self.sprav.setText(''.join(operator))
    def minus(self):
        global operator, operation
        operation = True
        operator.append('-')
        self.sprav.setText(''.join(operator))
    def ymn(self):
        global operator, operation
        operation = True
        operator.append('*')
        self.sprav.setText(''.join(operator))
    def step(self):
        global operator, operation
        operation = True
        operator.append('^')
        self.sprav.setText(''.join(operator))
    def delen(self):
        global operator, operation
        operation = True
        operator.append('/')
        self.sprav.setText(''.join(operator))
    def pr(self):
        global operator, operation
        operation = True
        operator.append('%')
        self.sprav.setText(''.join(operator))
            
    def delet(self):
        global operator, operation
        if len(operator) != 0:
            last = operator[-1]
            if last == 'sin' or last == 'cos' or last == 'tg' or last == 'ctg' or last == 'mr':
                del operator[-1]
            else:
                operator[-1] = operator[-1][:-1:]
            if operator[-1] == '':
                del operator[-1]
            if len(operator) != 0:
                self.window.display(operator[-1])
            else:
                operator = ['']
                self.window.display(0)
            self.sprav.setText(''.join(operator))
    def ac(self):
        global operator, operation, k
        k += 1
        if k == 7:
            self.resize(912, 689)
        operator = []
        operation = True
        self.window.display(0)
        self.sprav.setText(''.join(operator))
    
    def result(self):
        global operator, memory, operation
        try:
            while 'mr' in operator:
                index = operator.index('mr')
                operator[index] = memory
            while 'sin' in operator:
                index = operator.index('sin')
                rad = math.radians(float(operator[index + 1]))
                sin = math.sin(rad)
                del operator[index + 1]
                operator[index] = str(sin)
            while 'cos' in operator:
                index = operator.index('cos')
                rad = math.radians(float(operator[index + 1]))
                cos = math.cos(rad)
                del operator[index + 1]
                operator[index] = str(cos)
            while 'tg' in operator:
                index = operator.index('tg')
                rad = math.radians(float(operator[index + 1]))
                tg = math.tan(rad)
                del operator[index + 1]
                operator[index] = str(tg)
            while 'ctg' in operator:
                index = operator.index('ctg')
                rad = math.radians(float(operator[index + 1]))
                ctg = 1 / math.tan(rad)
                del operator[index + 1]
                operator[index] = str(ctg)
            while '^' in operator:
                index = operator.index('^')
                count = float(operator[index - 1]) ** float(operator[index + 1])
                del operator[index + 1]
                operator[index] = str(float(round(count, 15)))
                del operator[index - 1]
            while ('*' in operator) or ("/" in operator) or ("%" in operator):
                if '*' in operator:
                    index_1 = operator.index('*')
                else:
                    index_1 = 1000
                if '/' in operator:
                    index_2 = operator.index('/')
                else:
                    index_2 = 1000
                if '%' in operator:
                    index_3 = operator.index('%')
                else:
                    index_3 = 1000
                spisok = [index_1, index_2, index_3]
                if min(spisok) == index_2:
                    count = float(operator[index_2 - 1]) / float(operator[index_2 + 1])
                    del operator[index_2 + 1]
                    operator[index_2] = str(count)
                    del operator[index_2 - 1]
                elif min(spisok) == index_1:
                    count = float(operator[index_1 - 1]) * float(operator[index_1 + 1])
                    del operator[index_1 + 1]
                    operator[index_1] = str(float(round(count, 15)))
                    del operator[index_1 - 1]
                elif min(spisok) == index_3:
                    count = float(operator[index_3 - 1]) % float(operator[index_3 + 1])
                    del operator[index_3 + 1]
                    operator[index_3] = str(float(round(count, 15)))
                    del operator[index_3 - 1]
            while ('+' in operator) or ("-" in operator):
                if '+' in operator:
                    index_1 = operator.index('+')
                else:
                    index_1 = 1000
                if '-' in operator:
                    index_2 = operator.index('-')
                else:
                    index_2 = 1000
                if (index_1 > index_2) and (index_2 != -1):
                    count = float(operator[index_2 - 1]) - float(operator[index_2 + 1])
                    del operator[index_2 + 1]
                    operator[index_2] = str(count)
                    del operator[index_2 - 1]
                elif (index_1 < index_2) and (index_1 != -1):
                    count = float(operator[index_1 - 1]) + float(operator[index_1 + 1])
                    del operator[index_1 + 1]
                    operator[index_1] = str(count)
                    del operator[index_1 - 1]
            self.sprav.setText(''.join(operator))
            self.window.display(operator[0])
        except Exception:
            self.window.display('Error')
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        #MainWindow.resize(912, 689)
        MainWindow.resize(490, 440)
        font = QFont()
        font.setFamily("MS Gothic")
        MainWindow.setFont(font)
        MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);")
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.window = QLCDNumber(self.centralwidget)
        self.window.setGeometry(QRect(10, 10, 461, 60))
        self.window.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:2, fx:0.5, fy:0.5, stop:1 rgba(249, 187, 0, 255));")
        self.window.setDigitCount(20)
        self.window.setObjectName("window")
        self.btn_ac = QPushButton(self.centralwidget)
        self.btn_ac.setGeometry(QRect(410, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_ac.setFont(font)
        self.btn_ac.setStyleSheet("font: 75 20pt \"Segoe Script\";color: rgb(255, 0, 0);\n"
"background-color: rgb(29, 29, 29);")
        self.btn_ac.setIconSize(QSize(16, 16))
        self.btn_ac.setObjectName("btn_ac")
        self.btn_mr = QPushButton(self.centralwidget)
        self.btn_mr.setGeometry(QRect(170, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_mr.setFont(font)
        self.btn_mr.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_mr.setIconSize(QSize(16, 16))
        self.btn_mr.setObjectName("btn_mr")
        self.btn_mc = QPushButton(self.centralwidget)
        self.btn_mc.setGeometry(QRect(250, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_mc.setFont(font)
        self.btn_mc.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_mc.setIconSize(QSize(16, 16))
        self.btn_mc.setObjectName("btn_mc")
        self.btn_m_plus = QPushButton(self.centralwidget)
        self.btn_m_plus.setEnabled(True)
        self.btn_m_plus.setGeometry(QRect(10, 80, 61, 50))
        self.btn_m_plus.setMaximumSize(QSize(61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_m_plus.setFont(font)
        self.btn_m_plus.setCursor(QCursor(Qt.ArrowCursor))
        self.btn_m_plus.setMouseTracking(True)
        self.btn_m_plus.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_m_plus.setIconSize(QSize(16, 16))
        self.btn_m_plus.setCheckable(False)
        self.btn_m_plus.setChecked(False)
        self.btn_m_plus.setObjectName("btn_m_plus")
        self.btn_m_minus = QPushButton(self.centralwidget)
        self.btn_m_minus.setGeometry(QRect(90, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_m_minus.setFont(font)
        self.btn_m_minus.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 239, 239);font: 75 15pt \"Segoe Script\";")
        self.btn_m_minus.setIconSize(QSize(16, 16))
        self.btn_m_minus.setObjectName("btn_m_minus")
        self.btn_cos = QPushButton(self.centralwidget)
        self.btn_cos.setGeometry(QRect(410, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_cos.setFont(font)
        self.btn_cos.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_cos.setIconSize(QSize(16, 16))
        self.btn_cos.setObjectName("btn_cos")
        self.btn_sin = QPushButton(self.centralwidget)
        self.btn_sin.setGeometry(QRect(330, 80, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_sin.setFont(font)
        self.btn_sin.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_sin.setIconSize(QSize(16, 16))
        self.btn_sin.setObjectName("btn_sin")
        self.btn_tg = QPushButton(self.centralwidget)
        self.btn_tg.setGeometry(QRect(330, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_tg.setFont(font)
        self.btn_tg.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_tg.setIconSize(QSize(16, 16))
        self.btn_tg.setObjectName("btn_tg")
        self.btn_minus = QPushButton(self.centralwidget)
        self.btn_minus.setGeometry(QRect(250, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_minus.setFont(font)
        self.btn_minus.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_minus.setIconSize(QSize(16, 16))
        self.btn_minus.setObjectName("btn_minus")
        self.btn_plus = QPushButton(self.centralwidget)
        self.btn_plus.setGeometry(QRect(250, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_plus.setFont(font)
        self.btn_plus.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_plus.setIconSize(QSize(16, 16))
        self.btn_plus.setObjectName("btn_plus")
        self.btn_ymn = QPushButton(self.centralwidget)
        self.btn_ymn.setGeometry(QRect(250, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_ymn.setFont(font)
        self.btn_ymn.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_ymn.setIconSize(QSize(16, 16))
        self.btn_ymn.setObjectName("btn_ymn")
        self.btn_result = QPushButton(self.centralwidget)
        self.btn_result.setGeometry(QRect(330, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(40)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_result.setFont(font)
        self.btn_result.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 40pt \"Segoe Script\";color: rgb(255, 140, 0);")
        self.btn_result.setIconSize(QSize(16, 16))
        self.btn_result.setObjectName("btn_result")
        self.btn_step = QPushButton(self.centralwidget)
        self.btn_step.setGeometry(QRect(330, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_step.setFont(font)
        self.btn_step.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_step.setIconSize(QSize(16, 16))
        self.btn_step.setObjectName("btn_step")
        self.btn_1 = QPushButton(self.centralwidget)
        self.btn_1.setGeometry(QRect(10, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_1.setFont(font)
        self.btn_1.setMouseTracking(False)
        self.btn_1.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_1.setIconSize(QSize(16, 16))
        self.btn_1.setCheckable(False)
        self.btn_1.setChecked(False)
        self.btn_1.setObjectName("btn_1")
        self.btn_2 = QPushButton(self.centralwidget)
        self.btn_2.setGeometry(QRect(90, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_2.setFont(font)
        self.btn_2.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_2.setIconSize(QSize(16, 16))
        self.btn_2.setObjectName("btn_2")
        self.btn_3 = QPushButton(self.centralwidget)
        self.btn_3.setGeometry(QRect(170, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_3.setFont(font)
        self.btn_3.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_3.setIconSize(QSize(16, 16))
        self.btn_3.setObjectName("btn_3")
        self.btn_4 = QPushButton(self.centralwidget)
        self.btn_4.setGeometry(QRect(10, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_4.setFont(font)
        self.btn_4.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_4.setIconSize(QSize(16, 16))
        self.btn_4.setObjectName("btn_4")
        self.btn_5 = QPushButton(self.centralwidget)
        self.btn_5.setGeometry(QRect(90, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_5.setFont(font)
        self.btn_5.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_5.setIconSize(QSize(16, 16))
        self.btn_5.setObjectName("btn_5")
        self.btn_6 = QPushButton(self.centralwidget)
        self.btn_6.setGeometry(QRect(170, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_6.setFont(font)
        self.btn_6.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_6.setIconSize(QSize(16, 16))
        self.btn_6.setObjectName("btn_6")
        self.btn_7 = QPushButton(self.centralwidget)
        self.btn_7.setGeometry(QRect(10, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_7.setFont(font)
        self.btn_7.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_7.setIconSize(QSize(16, 16))
        self.btn_7.setObjectName("btn_7")
        self.btn_8 = QPushButton(self.centralwidget)
        self.btn_8.setGeometry(QRect(90, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_8.setFont(font)
        self.btn_8.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_8.setIconSize(QSize(16, 16))
        self.btn_8.setObjectName("btn_8")
        self.btn_9 = QPushButton(self.centralwidget)
        self.btn_9.setGeometry(QRect(170, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_9.setFont(font)
        self.btn_9.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_9.setIconSize(QSize(16, 16))
        self.btn_9.setObjectName("btn_9")
        self.btn_0 = QPushButton(self.centralwidget)
        self.btn_0.setGeometry(QRect(10, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_0.setFont(font)
        self.btn_0.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(0, 85, 255);")
        self.btn_0.setIconSize(QSize(16, 16))
        self.btn_0.setObjectName("btn_0")
        self.btn_ctg = QPushButton(self.centralwidget)
        self.btn_ctg.setGeometry(QRect(410, 140, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_ctg.setFont(font)
        self.btn_ctg.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 169, 254);font: 75 20pt \"Segoe Script\";")
        self.btn_ctg.setIconSize(QSize(16, 16))
        self.btn_ctg.setObjectName("btn_ctg")
        self.btn_delen = QPushButton(self.centralwidget)
        self.btn_delen.setGeometry(QRect(330, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_delen.setFont(font)
        self.btn_delen.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 30pt \"Segoe Script\";color: rgb(27, 147, 0);")
        self.btn_delen.setIconSize(QSize(16, 16))
        self.btn_delen.setObjectName("btn_delen")
        self.Sprav = QLabel(self.centralwidget)
        self.Sprav.setGeometry(QRect(500, 10, 401, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        self.Sprav.setFont(font)
        self.Sprav.setStyleSheet("color: rgb(255, 255, 255);\n"
"color: rgb(255, 255, 0);")
        self.Sprav.setObjectName("Sprav")
        self.Text_sprav = QTextBrowser(self.centralwidget)
        self.Text_sprav.setGeometry(QRect(490, 69, 411, 351))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(12)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.Text_sprav.setFont(font)
        self.Text_sprav.setStyleSheet("color: rgb(255, 255, 0);\n"
"font: 12pt \"Segoe Script\";")
        self.Text_sprav.setObjectName("Text_sprav")
        self.textEdit = QTextEdit(self.centralwidget)
        self.textEdit.setGeometry(QRect(10, 480, 391, 160))
        font = QFont()
        font.setPointSize(14)
        self.textEdit.setFont(font)
        self.textEdit.setStyleSheet("color: rgb(255, 170, 0);")
        self.textEdit.setObjectName("textEdit")
        self.Sprav_2 = QLabel(self.centralwidget)
        self.Sprav_2.setGeometry(QRect(10, 430, 391, 41))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        self.Sprav_2.setFont(font)
        self.Sprav_2.setStyleSheet("color: rgb(255, 255, 255);\n"
"color: rgb(255, 255, 0);")
        self.Sprav_2.setObjectName("Sprav_2")
        self.Text_sprav_2 = QTextBrowser(self.centralwidget)
        self.Text_sprav_2.setGeometry(QRect(410, 480, 491, 161))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(12)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(50)
        self.Text_sprav_2.setFont(font)
        self.Text_sprav_2.setStyleSheet("color: rgb(255, 255, 0);\n"
"font: 12pt \"Segoe Script\";")
        self.Text_sprav_2.setObjectName("Text_sprav_2")
        self.m = QLabel(self.centralwidget)
        self.m.setGeometry(QRect(13, 13, 20, 10))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(9)
        self.m.setFont(font)
        self.m.setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:2, fx:0.5, fy:0.5, stop:1 rgba(249, 187, 0, 255));")
        self.m.setText("")
        self.m.setObjectName("m")
        self.btn_floating = QPushButton(self.centralwidget)
        self.btn_floating.setGeometry(QRect(250, 320, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(40)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_floating.setFont(font)
        self.btn_floating.setStyleSheet("background-color: rgb(29, 29, 29);font: 75 40pt \"Segoe Script\";\n"
"color: rgb(20, 24, 255);")
        self.btn_floating.setIconSize(QSize(16, 16))
        self.btn_floating.setObjectName("btn_floating")
        self.btn_00 = QPushButton(self.centralwidget)
        self.btn_00.setGeometry(QRect(90, 320, 141, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_00.setFont(font)
        self.btn_00.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(0, 85, 255);font: 75 30pt \"Segoe Script\";")
        self.btn_00.setIconSize(QSize(16, 16))
        self.btn_00.setObjectName("btn_00")
        self.btn_delet = QPushButton(self.centralwidget)
        self.btn_delet.setGeometry(QRect(410, 260, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_delet.setFont(font)
        self.btn_delet.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(255, 0, 0);font: 75 20pt \"Segoe Script\";")
        self.btn_delet.setIconSize(QSize(16, 16))
        self.btn_delet.setObjectName("btn_delet")
        self.btn_pr = QPushButton(self.centralwidget)
        self.btn_pr.setGeometry(QRect(410, 200, 61, 50))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(30)
        font.setBold(False)
        font.setItalic(False)
        font.setWeight(9)
        self.btn_pr.setFont(font)
        self.btn_pr.setStyleSheet("background-color: rgb(29, 29, 29);color: rgb(27, 147, 0);font: 75 30pt \"Segoe Script\";")
        self.btn_pr.setIconSize(QSize(16, 16))
        self.btn_pr.setObjectName("btn_pr")
        self.sprav = QLabel(self.centralwidget)
        self.sprav.setGeometry(QRect(40, 380, 441, 41))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(15)
        self.sprav.setFont(font)
        self.sprav.setStyleSheet("color: rgb(255, 255, 255);")
        self.sprav.setText("")
        self.sprav.setObjectName("sprav")
        self.Sprav_4 = QLabel(self.centralwidget)
        self.Sprav_4.setGeometry(QRect(410, 430, 491, 41))
        font = QFont()
        font.setFamily("Segoe Script")
        font.setPointSize(20)
        self.Sprav_4.setFont(font)
        self.Sprav_4.setStyleSheet("color: rgb(255, 255, 255);\n"
"color: rgb(255, 255, 0);")
        self.Sprav_4.setObjectName("Sprav_4")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QRect(0, 0, 912, 21))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.btn_ac.setText(_translate("MainWindow", "AC"))
        self.btn_mr.setText(_translate("MainWindow", "MR"))
        self.btn_mc.setText(_translate("MainWindow", "MC"))
        self.btn_m_plus.setText(_translate("MainWindow", "M+"))
        self.btn_m_minus.setText(_translate("MainWindow", "M-"))
        self.btn_cos.setText(_translate("MainWindow", "cos"))
        self.btn_sin.setText(_translate("MainWindow", "sin"))
        self.btn_tg.setText(_translate("MainWindow", "tg"))
        self.btn_minus.setText(_translate("MainWindow", "-"))
        self.btn_plus.setText(_translate("MainWindow", "+"))
        self.btn_ymn.setText(_translate("MainWindow", "x"))
        self.btn_result.setText(_translate("MainWindow", "="))
        self.btn_step.setText(_translate("MainWindow", "^"))
        self.btn_1.setText(_translate("MainWindow", "1"))
        self.btn_2.setText(_translate("MainWindow", "2"))
        self.btn_3.setText(_translate("MainWindow", "3"))
        self.btn_4.setText(_translate("MainWindow", "4"))
        self.btn_5.setText(_translate("MainWindow", "5"))
        self.btn_6.setText(_translate("MainWindow", "6"))
        self.btn_7.setText(_translate("MainWindow", "7"))
        self.btn_8.setText(_translate("MainWindow", "8"))
        self.btn_9.setText(_translate("MainWindow", "9"))
        self.btn_0.setText(_translate("MainWindow", "0"))
        self.btn_ctg.setText(_translate("MainWindow", "ctg"))
        self.btn_delen.setText(_translate("MainWindow", "/"))
        self.Sprav.setText(_translate("MainWindow", "         Справочник"))
        self.Text_sprav.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Segoe Script\'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[M+] – прибавление числа в память</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[M-] – вычитание числа из памяти</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[^] – возведение в выбранную степень</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[+][-][x][</span><span style=\" font-family:\'Symbol\'; color:#0febff;\">¸</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">] – арифметические операции</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[MR] – вывести содержимое памяти на дисплей</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[MC] – очистить содержимое памяти</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[AC] – общий сброс</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\">[sin][cos][tg][ctg] – формулы произведения тригонометрических функций, при работе с этими функциями сначала записывается sin, cos, tg, ctg потом число(Например sin 45)</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[Del]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – удаляет последнюю введенную цифру или знак действия</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:36px; margin-right:36px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[%]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – вычисляет остаток от деления</span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:8pt; color:#0febff;\"><br /></span><span style=\" font-family:\'MS Shell Dlg 2\'; color:#0febff;\">[.]</span><span style=\" font-family:\'Lato-Regular,Arial,sans-serif\'; color:#0febff;\"> – используется для записи дробной части</span></p></body></html>"))
        self.Sprav_2.setText(_translate("MainWindow", "        Для заметок"))
        self.Text_sprav_2.setHtml(_translate("MainWindow", "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
"<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">\n"
"p, li { white-space: pre-wrap; }\n"
"</style></head><body style=\" font-family:\'Segoe Script\'; font-size:12pt; font-weight:400; font-style:normal;\">\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#00ff7f;\">    </span><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">  - Если указанный порядок действий невозможно вычислить</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">      - Если мы накасячили</span></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n"
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\"><br /></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">                   По всем вопросам обращайтесь  https://vk.com/vasily.shishkin</span></p>\n"
"<p style=\" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><span style=\" font-family:\'MS Shell Dlg 2\'; font-size:10pt; color:#11ff00;\">                                                                    https://vk.com/andrey.krivosheev</span></p></body></html>"))
        self.btn_floating.setText(_translate("MainWindow", "."))
        self.btn_00.setText(_translate("MainWindow", "00"))
        self.btn_delet.setText(_translate("MainWindow", "Del"))
        self.btn_pr.setText(_translate("MainWindow", "%"))
        self.Sprav_4.setText(_translate("MainWindow", "  Почему появляется ошибка?"))       
Ejemplo n.º 17
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow, version):
        self.version = version
        self.ScRate = GetSystemMetrics(0) / 1920
        self.font = QFont("Georgia", 8.8 * self.ScRate, weight=-2)

        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1126 * self.ScRate, 700)
        MainWindow.setMinimumSize(QSize(1126 * self.ScRate, 500 * self.ScRate))
        MainWindow.setMaximumSize(QSize(GetSystemMetrics(0),
                                        900 * self.ScRate))
        MainWindow.setWindowIcon(QIcon(Icons["Standart"]))

        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")

        self.horizontalLayout_8 = QHBoxLayout(self.centralwidget)
        self.horizontalLayout_8.setObjectName("horizontalLayout_8")

        self.horizontalLayout = QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.verticalLayout_4 = QVBoxLayout()
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.tableView = QTableView(self.centralwidget)
        self.tableView.setMinimumSize(QSize(550 * self.ScRate, 0))
        self.tableView.setObjectName("tableView")
        self.verticalLayout_4.addWidget(self.tableView)
        self.tableView.setAcceptDrops(True)
        self.tableView.setHorizontalScrollMode(
            QAbstractItemView.ScrollPerPixel)
        self.tableView.setVerticalScrollMode(QAbstractItemView.ScrollPerPixel)
        self.horizontalLayout_9 = QHBoxLayout()
        self.horizontalLayout_9.setObjectName("horizontalLayout_9")
        self.label_6 = QLabel(self.centralwidget)
        self.label_6.setObjectName("label_6")
        self.horizontalLayout_9.addWidget(self.label_6)
        spacerItem = QSpacerItem(40, 20, QSizePolicy.Expanding,
                                 QSizePolicy.Minimum)
        self.horizontalLayout_9.addItem(spacerItem)
        self.pushButton_8 = QPushButton(self.centralwidget)
        self.pushButton_8.setObjectName("pushButton_8")
        self.horizontalLayout_9.addWidget(self.pushButton_8)
        self.pushButton_9 = QPushButton(self.centralwidget)
        self.pushButton_9.setObjectName("pushButton_9")
        self.horizontalLayout_9.addWidget(self.pushButton_9)
        self.verticalLayout_4.addLayout(self.horizontalLayout_9)
        self.horizontalLayout.addLayout(self.verticalLayout_4)
        self.verticalLayout_3 = QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.horizontalLayout.addLayout(self.verticalLayout_3)
        self.line = QFrame(self.centralwidget)
        self.line.setFrameShape(QFrame.VLine)
        self.line.setFrameShadow(QFrame.Sunken)
        self.line.setObjectName("line")
        self.horizontalLayout.addWidget(self.line)

        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")

        self.pushButton = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,
                                 QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton.sizePolicy().hasHeightForWidth())
        self.pushButton.setSizePolicy(sizePolicy)
        self.pushButton.setMinimumSize(
            QSize(507 * self.ScRate, 28 * self.ScRate))
        self.pushButton.setMaximumSize(
            QSize(507 * self.ScRate, 28 * self.ScRate))
        self.pushButton.setObjectName("pushButton")
        self.verticalLayout.addWidget(self.pushButton)

        self.pushButton_4 = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,
                                 QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton_4.sizePolicy().hasHeightForWidth())
        self.pushButton_4.setSizePolicy(sizePolicy)
        self.pushButton_4.setMinimumSize(
            QSize(507 * self.ScRate, 28 * self.ScRate))
        self.pushButton_4.setMaximumSize(
            QSize(507 * self.ScRate, 28 * self.ScRate))
        self.pushButton_4.setObjectName("pushButton_4")
        self.verticalLayout.addWidget(self.pushButton_4)

        self.line_2 = QFrame(self.centralwidget)
        self.line_2.setFrameShape(QFrame.HLine)
        self.line_2.setFrameShadow(QFrame.Sunken)
        self.line_2.setObjectName("line_2")
        self.verticalLayout.addWidget(self.line_2)

        self.horizontalLayout_3 = QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")

        self.label = QLabel(self.centralwidget)
        self.label.setObjectName("label")
        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,
                                 QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        self.label.setMinimumSize(QSize(100 * self.ScRate, 25 * self.ScRate))
        self.label.setMaximumSize(QSize(100 * self.ScRate, 25 * self.ScRate))
        self.label.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
        self.horizontalLayout_3.addWidget(self.label)

        self.bar = QProgressBar(self.centralwidget)
        self.bar.setObjectName("bar")
        sizePolicy = QSizePolicy(QSizePolicy.MinimumExpanding,
                                 QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.bar.sizePolicy().hasHeightForWidth())
        self.bar.setSizePolicy(sizePolicy)
        self.bar.setMinimumSize(QSize(430 * self.ScRate, 25 * self.ScRate))
        self.bar.setMaximumSize(QSize(430 * self.ScRate, 25 * self.ScRate))
        #self.bar.setValue(50)
        self.bar.setTextVisible(False)
        self.bar.setStyleSheet("QProgressBar {margin-right: 60px;}")
        self.bar.setAlignment(Qt.AlignLeft | Qt.AlignHCenter)
        self.horizontalLayout_3.addWidget(self.bar)

        #self.horizontalLayout_3.addStretch()
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        """
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        
        self.label = QtWidgets.QLabel(self.centralwidget)
        self.label.setMinimumSize(QtCore.QSize(249, 31))
        self.label.setMaximumSize(QtCore.QSize(249, 31))
        self.label.setObjectName("label")
        self.horizontalLayout_3.addWidget(self.label)


        self.spinBox = QtWidgets.QSpinBox(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.spinBox.sizePolicy().hasHeightForWidth())
        self.spinBox.setSizePolicy(sizePolicy)
        self.spinBox.setMinimumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate))
        self.spinBox.setMaximumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate))                              
        self.spinBox.setReadOnly(True)
        self.spinBox.setMaximum(999999)
        self.spinBox.setObjectName("spinBox")
        self.horizontalLayout_3.addWidget(self.spinBox)
        

        self.verticalLayout.addLayout(self.horizontalLayout_3)
        

        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")

        self.label_2 = QtWidgets.QLabel(self.centralwidget)
        self.label_2.setMinimumSize(QtCore.QSize(249*self.ScRate, 32*self.ScRate))
        self.label_2.setMaximumSize(QtCore.QSize(249*self.ScRate, 32*self.ScRate))
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_4.addWidget(self.label_2)
        
        self.spinBox_2 = QtWidgets.QSpinBox(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)        
        sizePolicy.setHeightForWidth(self.spinBox_2.sizePolicy().hasHeightForWidth())
        self.spinBox_2.setSizePolicy(sizePolicy)
        self.spinBox_2.setMinimumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate))
        self.spinBox_2.setMaximumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate))                                
        self.spinBox_2.setReadOnly(True)
        self.spinBox_2.setMaximum(999999)
        self.spinBox_2.setObjectName("spinBox_2")
        self.horizontalLayout_4.addWidget(self.spinBox_2)

        self.verticalLayout.addLayout(self.horizontalLayout_4)

        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")

        self.label_3 = QtWidgets.QLabel(self.centralwidget)
        self.label_3.setMinimumSize(QtCore.QSize(249*self.ScRate, 31*self.ScRate))
        self.label_3.setMaximumSize(QtCore.QSize(249*self.ScRate, 31*self.ScRate))                                     
        self.label_3.setObjectName("label_3")
        self.label_3.setFont(self.font)
        self.horizontalLayout_5.addWidget(self.label_3)

        self.spinBox_3 = QtWidgets.QSpinBox(self.centralwidget)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)                                        
        sizePolicy.setHeightForWidth(self.spinBox_3.sizePolicy().hasHeightForWidth())
        self.spinBox_3.setSizePolicy(sizePolicy)
        self.spinBox_3.setMinimumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate))
        self.spinBox_3.setMaximumSize(QtCore.QSize(249*self.ScRate, 22*self.ScRate))                                
        self.spinBox_3.setReadOnly(True)
        self.spinBox_3.setMaximum(999999)
        self.spinBox_3.setObjectName("spinBox_3")
        self.horizontalLayout_5.addWidget(self.spinBox_3)

        self.verticalLayout.addLayout(self.horizontalLayout_5)
        """

        self.horizontalLayout_6 = QHBoxLayout()
        self.horizontalLayout_6.setObjectName("horizontalLayout_6")

        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setMinimumSize(QSize(249 * self.ScRate, 31 * self.ScRate))
        self.label_4.setMaximumSize(QSize(249 * self.ScRate, 31 * self.ScRate))
        self.label_4.setObjectName("label_4")
        self.label_4.setFont(self.font)
        self.horizontalLayout_6.addWidget(self.label_4)

        self.spinBox_4 = QSpinBox(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.spinBox_4.sizePolicy().hasHeightForWidth())
        self.spinBox_4.setSizePolicy(sizePolicy)
        self.spinBox_4.setMinimumSize(
            QSize(249 * self.ScRate, 22 * self.ScRate))
        self.spinBox_4.setMaximumSize(
            QSize(249 * self.ScRate, 22 * self.ScRate))
        self.spinBox_4.setReadOnly(True)
        self.spinBox_4.setMaximum(999999)
        self.spinBox_4.setObjectName("spinBox_4")
        self.horizontalLayout_6.addWidget(self.spinBox_4)

        self.verticalLayout.addLayout(self.horizontalLayout_6)

        self.horizontalLayout_7 = QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")

        self.line_3 = QFrame(self.centralwidget)
        self.line_3.setFrameShape(QFrame.HLine)
        self.line_3.setFrameShadow(QFrame.Sunken)
        self.line_3.setObjectName("line_3")
        self.verticalLayout.addWidget(self.line_3)

        self.verticalLayout_7 = QVBoxLayout()
        self.verticalLayout_7.setObjectName("verticalLayout_7")

        self.horizontalLayout_2 = QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")

        self.pushButton_2 = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton_2.sizePolicy().hasHeightForWidth())
        self.pushButton_2.setSizePolicy(sizePolicy)
        self.pushButton_2.setMinimumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_2.setMaximumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_2.addWidget(self.pushButton_2)

        self.pushButton_3 = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton_3.sizePolicy().hasHeightForWidth())
        self.pushButton_3.setSizePolicy(sizePolicy)
        self.pushButton_3.setMinimumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_3.setMaximumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout_2.addWidget(self.pushButton_3)

        self.pushButton_7 = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton_7.sizePolicy().hasHeightForWidth())
        self.pushButton_7.setSizePolicy(sizePolicy)
        self.pushButton_7.setMinimumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_7.setMaximumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_7.setObjectName("pushButton_7")
        self.horizontalLayout_2.addWidget(self.pushButton_7)

        space = QSpacerItem(25, 0, QSizePolicy.Fixed, QSizePolicy.Maximum)
        self.horizontalLayout_2.addItem(space)

        self.pushButton_5 = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton_5.sizePolicy().hasHeightForWidth())
        self.pushButton_5.setSizePolicy(sizePolicy)
        self.pushButton_5.setMinimumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_5.setMaximumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout_2.addWidget(self.pushButton_5)

        self.pushButton_6 = QPushButton(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.pushButton_6.sizePolicy().hasHeightForWidth())
        self.pushButton_6.setSizePolicy(sizePolicy)
        self.pushButton_6.setMinimumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_6.setMaximumSize(
            QSize(30 * self.ScRate, 30 * self.ScRate))
        self.pushButton_6.setObjectName("pushButton_6")
        self.horizontalLayout_2.addWidget(self.pushButton_6)

        #self.horizontalLayout_2.addStretch()

        self.horizontalLayout_2.setAlignment(Qt.AlignLeft)

        self.verticalLayout_7.addLayout(self.horizontalLayout_2)

        self.tab = QTabWidget()
        self.plain_1 = QPlainTextEdit(self.centralwidget)
        self.plain_1.setPlaceholderText("Mesajınız...")
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.tab.sizePolicy().hasHeightForWidth())
        self.tab.setSizePolicy(sizePolicy)
        self.tab.setMinimumSize(QSize(240 * self.ScRate, 380 * self.ScRate))
        self.tab.setMaximumSize(QSize(240 * self.ScRate, 380 * self.ScRate))
        self.tab.setObjectName("tab")
        self.tab.addTab(self.plain_1, "Mesaj 1")

        self.verticalLayout_7.addWidget(self.tab)

        self.horizontalLayout_7.addLayout(self.verticalLayout_7)

        self.verticalLayout_2 = QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")

        self.label_5 = QLabel(self.centralwidget)
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.label_5.sizePolicy().hasHeightForWidth())
        self.label_5.setSizePolicy(sizePolicy)
        self.label_5.setMinimumSize(QSize(256 * self.ScRate,
                                          130 * self.ScRate))
        self.label_5.setMaximumSize(QSize(256 * self.ScRate,
                                          130 * self.ScRate))
        self.label_5.setObjectName("label_5")
        self.label_5.setFont(self.font)
        self.verticalLayout_2.addWidget(self.label_5)

        self.tableWidget = QTableWidget(self.centralwidget)
        #self.tableWidget = TableWidgetDragRows(self.centralwidget)
        #self.tableWidget.dropSignal.connect(self.updateTableDrag)
        self.tableWidget.setSelectionBehavior(QAbstractItemView.SelectRows)
        self.tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.tableWidget.setColumnCount(2)
        sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.tableWidget.sizePolicy().hasHeightForWidth())
        self.tableWidget.setSizePolicy(sizePolicy)

        self.tableWidget.setHorizontalHeaderItem(0,
                                                 QTableWidgetItem("Dosya Adı"))
        self.tableWidget.setHorizontalHeaderItem(
            1, QTableWidgetItem("Mesaj Sırası"))
        self.tableWidget.resizeColumnsToContents()
        self.tableWidget.setHorizontalScrollMode(
            QAbstractItemView.ScrollPerPixel)
        self.tableWidget.setVerticalScrollMode(
            QAbstractItemView.ScrollPerPixel)
        self.tableWidget.setContextMenuPolicy(Qt.CustomContextMenu)
        self.tableWidget.customContextMenuRequested.connect(
            self.on_context_menu)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            self.tableWidget.sizePolicy().hasHeightForWidth())
        self.tableWidget.setSizePolicy(sizePolicy)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setMinimumSize(
            QSize(220 * self.ScRate, 280 * self.ScRate))
        self.tableWidget.setMaximumSize(
            QSize(220 * self.ScRate, 280 * self.ScRate))
        self.verticalLayout_2.addWidget(self.tableWidget)
        self.create_popup_menu()

        self.horizontalLayout_7.addLayout(self.verticalLayout_2)
        self.verticalLayout.addLayout(self.horizontalLayout_7)
        self.horizontalLayout.addLayout(self.verticalLayout)
        self.horizontalLayout_8.addLayout(self.horizontalLayout)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(
            QRect(0, 0, 1100 * self.ScRate, 26 * self.ScRate))
        self.menubar.setObjectName("menubar")
        self.menuDosya = QMenu(self.menubar)
        self.menuDosya.setObjectName("menuDosya")
        self.menuAbout = QMenu(self.menubar)
        self.menuAbout.setObjectName("menuAbout")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionDosya_A = QAction(MainWindow)
        self.actionDosya_A.setObjectName("actionDosya_A")
        self.actionKapat = QAction(MainWindow)
        self.actionKapat.setObjectName("actionKapat")
        self.actionAyarla = QAction(MainWindow)
        self.actionAyarla.setObjectName("actionAyarla")
        self.actionUpdate = QAction(MainWindow)
        self.actionUpdate.setObjectName("actionUpdate")
        self.actionFeedBack = QAction(MainWindow)
        self.actionFeedBack.setObjectName("actionFeedBack")
        self.actionAbout = QAction(MainWindow)
        self.actionAbout.setObjectName("actionAbout")
        self.menuDosya.addAction(self.actionDosya_A)
        self.menuDosya.addAction(self.actionAyarla)
        self.menuDosya.addAction(self.actionKapat)
        self.menuAbout.addAction(self.actionUpdate)
        self.menuAbout.addAction(self.actionAbout)
        self.menuAbout.addAction(self.actionFeedBack)
        self.menubar.addAction(self.menuDosya.menuAction())
        self.menubar.addAction(self.menuAbout.menuAction())

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)
        self.i = 1
        self.list_of_files = [["Mesaj", "1"]]
        self.updateTable()

    def create_popup_menu(self, parent=None):
        self.popup_menu = QMenu()
        self.popup_menu.addAction("Yeni Dosya veya Fotoğraf ekle",
                                  self.new_cluster)
        self.popup_menu.addAction("Sil", self.delete_cluster)
        self.popup_menu.addSeparator()
        self.popup_menu.addAction("Yukarı Taşı", self.up_cluster)
        self.popup_menu.addAction("Aşağı Taşı", self.down_cluster)

    def on_context_menu(self, pos):
        node = self.tableWidget.mapToGlobal(pos)
        self.popup_menu.exec_(self.tableWidget.mapToGlobal(pos))

    def new_cluster(self):
        fileName, _ = QFileDialog.getOpenFileNames(
            self.window, "Yeni Dosya veya Fotoğraf Ekle",
            os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop'),
            "Tüm Dosyalar (*.*)")
        if (fileName):
            for x in fileName:
                self.i += 1
                self.list_of_files.append([x, self.i])
                lall = list(itertools.chain.from_iterable(self.list_of_files))
                for i in lall:
                    if (lall.count(i) > 1):
                        warnMessage("Aynı Dosya", QMessageBox.Warning,
                                    "Aynı dosyayı iki kere seçemezsiniz.")
                        self.list_of_files.pop()
                        self.i -= 1
                        return
            self.updateTable()

    def delete_cluster(self):
        for item in self.tableWidget.selectedIndexes():
            for i in self.list_of_files:
                if (self.tableWidget.item(item.row(), 0).text() == "Mesaj"):
                    warnMessage("Uyarı!", QMessageBox.Warning,
                                "'Mesaj' satırını silemezsiniz.")
                elif (self.tableWidget.item(item.row(),
                                            0).text() == i[0].split("/")[-1]):
                    self.list_of_files.remove(i)
        self.updateTable()

    def up_cluster(self):
        for item in self.tableWidget.selectedIndexes():
            for i in self.list_of_files:
                if (self.tableWidget.item(item.row(),
                                          0).text() == i[0].split("/")[-1]):
                    index = self.list_of_files.index(i)
        try:
            self.list_of_files[index], self.list_of_files[
                index - 1] = self.list_of_files[index -
                                                1], self.list_of_files[index]
            self.updateTable()
        except:
            pass

    def down_cluster(self):
        for item in self.tableWidget.selectedIndexes():
            for i in self.list_of_files:
                if (self.tableWidget.item(item.row(),
                                          0).text() == i[0].split("/")[-1]):
                    index = self.list_of_files.index(i)
        try:
            self.list_of_files[index], self.list_of_files[
                index + 1] = self.list_of_files[index +
                                                1], self.list_of_files[index]
            self.updateTable()
        except:
            pass

    def updateTable(self):
        self.tableWidget.setRowCount(len(self.list_of_files))
        for j in range(len(self.list_of_files)):
            self.list_of_files[j][1] = j + 1
        for i in range(len(self.list_of_files)):
            code = "self.tableWidget.setItem("+str(i)+",0,QTableWidgetItem('"+ self.list_of_files[i][0].split("/")[-1] +"'));" + \
                "self.tableWidget.setItem("+str(i)+",1,QTableWidgetItem('"+ str(self.list_of_files[i][1]) +"'))"
            exec(code)

    def updateTableDrag(self, x):
        if x[0] == "s":
            self.itemSource = [x[1], x[2]]
        #elif x[0] == "i":

        elif x[0] == "d":
            c = self.list_of_files[self.itemSource[0]]
            self.list_of_files.pop(self.itemSource[0])
            self.list_of_files.insert(x[1], c)
        self.updateTable()
        print(self.list_of_files)
        self.updateTable()
        """self.dragFiles = []
        for i in range(self.tableWidget.rowCount()):
            item = self.tableWidget.item(i,0).text()
            self.dragFiles.append(item)
        print(self.dragFiles)
        for j in range(len(self.dragFiles)-1):
            for x in range(len(self.dragFiles)-1):
                if(self.dragFiles[j] == self.list_of_files[x][0].split("/")[-1]):
                    if(self.list_of_files[x] != self.list_of_files[j]):
                        c = self.list_of_files[x]
                        self.list_of_files.pop(x)
                        self.list_of_files.insert(j, c)
        print(self.dragFiles)
        print(self.list_of_files)"""

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        # Window Title
        MainWindow.setWindowTitle(
            _translate("MainWindow", "Whats Message Sender v" + self.version))

        self.pushButton.setText(_translate("MainWindow", "Başlat"))
        self.pushButton_4.setText(_translate("MainWindow", "Durdur"))
        self.pushButton_4.setVisible(False)

        self.pushButton_2.setIcon(QIcon(Icons["Preview"]))
        self.pushButton_2.setToolTip(
            _translate(
                "MainWindow",
                "    Mesajınızın önizlemesine bu <br>butondan bakabilirsiniz.")
        )
        self.pushButton_2.setIconSize(QSize(30 * self.ScRate,
                                            30 * self.ScRate))
        self.pushButton_2.setStyleSheet('QPushButton{border: 0px solid;}')

        self.pushButton_3.setIcon(QIcon(Icons["Report"]))
        self.pushButton_3.setToolTip(
            _translate(
                "MainWindow",
                "    Atılan mesajların raporunu excel formatında kaydetmek için bu butonu kullanabilirsiniz."
            ))
        self.pushButton_3.setIconSize(QSize(30 * self.ScRate,
                                            30 * self.ScRate))
        self.pushButton_3.setStyleSheet('QPushButton{border: 0px solid;}')

        self.pushButton_7.setIcon(QIcon(Icons["Emoji"]))
        self.pushButton_7.setToolTip(
            _translate(
                "MainWindow",
                "    Mesajınıza emoji eklemek için bu butonu kullanabilirsiniz, emojiler burada farklı görünsede mesaj atıldığı zaman düzelecektir."
            ))
        self.pushButton_7.setIconSize(QSize(30 * self.ScRate,
                                            30 * self.ScRate))
        self.pushButton_7.setStyleSheet('QPushButton{border: 0px solid;}')

        self.pushButton_5.setIcon(QIcon(Icons["Plus"]))
        self.pushButton_5.setToolTip(
            _translate(
                "MainWindow",
                "    Mesaj kutusu oluşturmak için bu butonu kullanabilirsiniz."
            ))
        self.pushButton_5.setIconSize(QSize(30 * self.ScRate,
                                            30 * self.ScRate))
        self.pushButton_5.setStyleSheet('QPushButton{border: 0px solid;}')

        self.pushButton_6.setIcon(QIcon(Icons["Minus"]))
        self.pushButton_6.setToolTip(
            _translate(
                "MainWindow",
                "    Son mesaj kutusunu silmek için bu butonu kullanabilirsiniz."
            ))
        self.pushButton_6.setIconSize(QSize(30 * self.ScRate,
                                            30 * self.ScRate))
        self.pushButton_6.setStyleSheet('QPushButton{border: 0px solid;}')

        self.pushButton_8.setText(_translate("MainWindow", "Tabloyu Temizle"))

        self.label.setText(_translate("MainWindow", "0/0 - 0%"))
        self.bar.setValue(0)
        self.label_4.setText(_translate("MainWindow",
                                        "Kalan Mesaj Hakkınız :"))
        self.label_5.setText(
            _translate(
                "MainWindow", "  MESAJINIZI YAZARKEN\n"
                "  BUNA DİKKAT EDİNİZ.\n"
                "\n"
                "Eğer mesajın attığınız kişiye özel\n"
                " olması için isim kullanmak\n"
                " istiyorsanız, mesajınızda isim\n"
                " olmasını istediğiniz yere {}\n"
                " işaretlerini koyunuz."))
        """
                self.label_5.setText(_translate("MainWindow", "  MESAJINIZI YAZARKEN\n"
        "  BUNA DİKKAT EDİNİZ.\n"
        "\n"
        "Eğer mesajın attığınız kişiye özel\n"
        " olması için kolon değeri kullanmak\n"
        " istiyorsanız, mesajınızda \n"
        "kullanmak istediğiniz değerleri içeren kolonu;\n"
        " {kolon sıra numarası} Örn. {1}, {2}, {3}\n"
        " şeklinde koyabilirsiniz."))
        """
        self.label_6.setText(
            _translate(
                "MainWindow", "Yukarıdaki alana dosyanızı sürükleyip\n"
                "bırakarak da dosyanızı açabilirsiniz."))
        self.menuDosya.setTitle(_translate("MainWindow", "Dosya"))
        self.menuAbout.setTitle(_translate("MainWindow", "Hakkında"))
        self.actionDosya_A.setText(_translate("MainWindow", "Dosya Aç..."))
        self.actionDosya_A.setShortcut(_translate("MainWindow", "Ctrl+O"))
        self.actionKapat.setText(_translate("MainWindow", "Kapat"))
        self.actionKapat.setShortcut(_translate("MainWindow", "Ctrl+Q"))
        self.actionAyarla.setText(_translate("MainWindow", "Ayarlar"))
        self.actionAyarla.setShortcut(_translate("MainWindow", "Ctrl+Shift+A"))
        self.actionUpdate.setText(_translate("MainWindow", "Güncelle..."))
        self.actionAbout.setText(
            _translate("MainWindow", "Versiyon\t" + self.version))
        self.actionFeedBack.setText(
            _translate("MainWindow", "Geri Bildirim..."))
Ejemplo n.º 18
0
class listExpiredUI(QMainWindow):
    def __init__(self, parent=None):
        super(listExpiredUI, self).__init__(parent)
        self.resize(900, 700)
        self.setupUi()

    def setupUi(self):
        self.setObjectName("MainWindow")
        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")

        self.tableWidget = QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(30, 50, 810, 520))
        self.tableWidget.setRowCount(50)
        self.tableWidget.setColumnCount(4)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setHorizontalHeaderLabels(
            ["Id STNK", "Nomor Registrasi", "Nama Pemilik", "Masa Berlaku"])
        self.tableWidget.setEditTriggers(QTreeView.NoEditTriggers)
        self.tableWidget.setStyleSheet("background-color:#ECEBE4")
        data_df = self.load_data()
        for data in data_df:
            self.tableWidget.setItem(data[0], data[1], data[2])

        #self.btnHapus = QPushButton(self.centralwidget)
        #self.btnHapus.setGeometry(QtCore.QRect(28, 600, 90, 30))
        #self.btnHapus.setObjectName("btnHapus")
        #self.setCentralWidget(self.centralwidget)
        #self.btnHapus.clicked.connect()

        self.btnKembali = QPushButton(self.centralwidget)
        self.btnKembali.setGeometry(QtCore.QRect(750, 600, 90, 30))
        self.btnKembali.setStyleSheet("background-color:#3498DB")
        self.btnKembali.setObjectName("btnKembali")
        self.setCentralWidget(self.centralwidget)
        self.btnKembali.clicked.connect(self.kembali)

        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.retranslateUi()
        QMetaObject.connectSlotsByName(self)

    def retranslateUi(self):
        _translate = QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "List Expired"))
        self.btnKembali.setText(_translate("MainWindow", "Kembali"))
        #self.btnHapus.setText(_translate("MainWindow", "Hapus"))

    def load_data(self):
        model = mUser()
        datenya = datetime.datetime.today() + datetime.timedelta(30)
        data = model.getData("stnk", "where masa_berlaku < '%s'" % datenya)
        key_data = list(data.keys())
        len_data = len(data[key_data[0]])
        data_return = []
        for row in range(len_data):
            for col in range(len(key_data)):
                value = QTableWidgetItem(str(data[key_data[col]][row]))
                data_return.append((row, col, value))

        return data_return

    """       
    def _removerow(self):
        row = self.tableWidget.currentRow()
        '''query = 
        "DELETE FROM  WHERE  = ?"
        cur.execute(query, (item,customerId,date,qty))
        con.commit()
        '''
        self.tableWidget.removeRow(row)
        print("Berhasil Hapus!")
    """

    def kembali(self):
        dash = cListExpired.cListExpired()
        dash.gotodash(self)
Ejemplo n.º 19
0
class ErrorStatusBar(QWidget):
    """
    A pop-up status bar for displaying messages about application errors to the user. Messages will
    be displayed for a given duration or until the message is cleared or updated with a new message.
    """

    CSS = '''
    #error_vertical_bar {
        background-color: #f22b5d;
    }
    #error_icon {
        background-color: qlineargradient(
            x1: 0,
            y1: 0,
            x2: 0,
            y2: 1,
            stop: 0 #fff,
            stop: 0.2 #fff,
            stop: 1 #fff
        );
    }
    #error_status_bar {
        background-color: qlineargradient(
            x1: 0,
            y1: 0,
            x2: 0,
            y2: 1,
            stop: 0 #fff,
            stop: 0.2 #fff,
            stop: 1 #fff
        );
        font-weight: bold;
        color: #f22b5d;
    }
    '''

    def __init__(self):
        super().__init__()

        # Set styles
        self.setStyleSheet(self.CSS)

        # Set layout
        layout = QHBoxLayout(self)
        self.setLayout(layout)

        # Remove margins and spacing
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(0)

        # Error vertical bar
        self.vertical_bar = QWidget()
        self.vertical_bar.setObjectName('error_vertical_bar')  # Set css id
        self.vertical_bar.setFixedWidth(10)

        # Error icon
        self.label = SvgLabel('error_icon.svg', svg_size=QSize(32, 32))
        self.label.setObjectName('error_icon')  # Set css id
        self.label.setFixedWidth(42)

        # Error status bar
        self.status_bar = QStatusBar()
        self.status_bar.setObjectName('error_status_bar')  # Set css id
        self.status_bar.setSizeGripEnabled(False)

        # Add widgets to layout
        layout.addWidget(self.vertical_bar)
        layout.addWidget(self.label)
        layout.addWidget(self.status_bar)

        # Hide until a message needs to be displayed
        self.vertical_bar.hide()
        self.label.hide()
        self.status_bar.hide()

        # Only show errors for a set duration
        self.status_timer = QTimer()
        self.status_timer.timeout.connect(self._on_status_timeout)

    def _hide(self):
        self.vertical_bar.hide()
        self.label.hide()
        self.status_bar.hide()

    def _show(self):
        self.vertical_bar.show()
        self.label.show()
        self.status_bar.show()

    def _on_status_timeout(self):
        self._hide()

    def update_message(self, message: str, duration: int):
        """
        Display a status message to the user for a given duration.
        """
        self.status_bar.showMessage(message, duration)
        self.status_timer.start(duration)
        self._show()

    def clear_message(self):
        """
        Clear any message currently in the status bar.
        """
        self.status_bar.clearMessage()
        self._hide()
Ejemplo n.º 20
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        if not MainWindow.objectName():
            MainWindow.setObjectName(u"MainWindow")
        MainWindow.setWindowModality(Qt.NonModal)
        MainWindow.resize(423, 347)
        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(
            MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName(u"centralwidget")
        self.gridLayoutWidget = QWidget(self.centralwidget)
        self.gridLayoutWidget.setObjectName(u"gridLayoutWidget")
        self.gridLayoutWidget.setGeometry(QRect(10, 40, 123, 68))
        self.gridLayout = QGridLayout(self.gridLayoutWidget)
        self.gridLayout.setObjectName(u"gridLayout")
        self.gridLayout.setSizeConstraint(QLayout.SetMaximumSize)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2 = QVBoxLayout()
        self.verticalLayout_2.setObjectName(u"verticalLayout_2")
        self.chkScreenRest = QCheckBox(self.gridLayoutWidget)
        self.chkScreenRest.setObjectName(u"chkScreenRest")
        sizePolicy1 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed)
        sizePolicy1.setHorizontalStretch(0)
        sizePolicy1.setVerticalStretch(0)
        sizePolicy1.setHeightForWidth(
            self.chkScreenRest.sizePolicy().hasHeightForWidth())
        self.chkScreenRest.setSizePolicy(sizePolicy1)
        font = QFont()
        font.setFamily(u"Roboto")
        font.setPointSize(14)
        font.setBold(False)
        font.setItalic(True)
        font.setWeight(50)
        self.chkScreenRest.setFont(font)
        self.chkScreenRest.setChecked(False)

        self.verticalLayout_2.addWidget(self.chkScreenRest)

        self.chkEyeBlink = QCheckBox(self.gridLayoutWidget)
        self.chkEyeBlink.setObjectName(u"chkEyeBlink")
        font1 = QFont()
        font1.setFamily(u"Roboto")
        font1.setPointSize(14)
        font1.setItalic(True)
        self.chkEyeBlink.setFont(font1)

        self.verticalLayout_2.addWidget(self.chkEyeBlink)

        self.gridLayout.addLayout(self.verticalLayout_2, 1, 0, 1, 1)

        self.lblMonitor = QLabel(self.centralwidget)
        self.lblMonitor.setObjectName(u"lblMonitor")
        self.lblMonitor.setGeometry(QRect(20, 10, 141, 21))
        sizePolicy2 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
        sizePolicy2.setHorizontalStretch(0)
        sizePolicy2.setVerticalStretch(0)
        sizePolicy2.setHeightForWidth(
            self.lblMonitor.sizePolicy().hasHeightForWidth())
        self.lblMonitor.setSizePolicy(sizePolicy2)
        font2 = QFont()
        font2.setFamily(u"Open Sans")
        font2.setPointSize(16)
        font2.setBold(True)
        font2.setWeight(75)
        self.lblMonitor.setFont(font2)
        self.lblNotification = QLabel(self.centralwidget)
        self.lblNotification.setObjectName(u"lblNotification")
        self.lblNotification.setGeometry(QRect(190, 10, 141, 21))
        sizePolicy2.setHeightForWidth(
            self.lblNotification.sizePolicy().hasHeightForWidth())
        self.lblNotification.setSizePolicy(sizePolicy2)
        self.lblNotification.setFont(font2)
        self.gridLayoutWidget_2 = QWidget(self.centralwidget)
        self.gridLayoutWidget_2.setObjectName(u"gridLayoutWidget_2")
        self.gridLayoutWidget_2.setGeometry(QRect(180, 40, 233, 68))
        self.gridLayout_2 = QGridLayout(self.gridLayoutWidget_2)
        self.gridLayout_2.setObjectName(u"gridLayout_2")
        self.gridLayout_2.setSizeConstraint(QLayout.SetMaximumSize)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout = QVBoxLayout()
        self.verticalLayout.setObjectName(u"verticalLayout")
        self.chkNotificationBanner = QCheckBox(self.gridLayoutWidget_2)
        self.chkNotificationBanner.setObjectName(u"chkNotificationBanner")
        self.chkNotificationBanner.setFont(font1)

        self.verticalLayout.addWidget(self.chkNotificationBanner)

        self.chkConnectSmartphone = QCheckBox(self.gridLayoutWidget_2)
        self.chkConnectSmartphone.setObjectName(u"chkConnectSmartphone")
        sizePolicy1.setHeightForWidth(
            self.chkConnectSmartphone.sizePolicy().hasHeightForWidth())
        self.chkConnectSmartphone.setSizePolicy(sizePolicy1)
        self.chkConnectSmartphone.setFont(font)
        self.chkConnectSmartphone.setChecked(False)

        self.verticalLayout.addWidget(self.chkConnectSmartphone)

        self.gridLayout_2.addLayout(self.verticalLayout, 1, 0, 1, 1)

        self.lblSetting = QLabel(self.centralwidget)
        self.lblSetting.setObjectName(u"lblSetting")
        self.lblSetting.setGeometry(QRect(20, 120, 141, 31))
        sizePolicy2.setHeightForWidth(
            self.lblSetting.sizePolicy().hasHeightForWidth())
        self.lblSetting.setSizePolicy(sizePolicy2)
        self.lblSetting.setFont(font2)
        self.btnStart = QPushButton(self.centralwidget)
        self.btnStart.setObjectName(u"btnStart")
        self.btnStart.setGeometry(QRect(50, 270, 161, 31))
        font3 = QFont()
        font3.setFamily(u"Malgun Gothic")
        font3.setPointSize(14)
        self.btnStart.setFont(font3)
        self.btnStop = QPushButton(self.centralwidget)
        self.btnStop.setObjectName(u"btnStop")
        self.btnStop.setGeometry(QRect(260, 270, 91, 31))
        self.btnStop.setFont(font3)
        self.widget = QWidget(self.centralwidget)
        self.widget.setObjectName(u"widget")
        self.widget.setGeometry(QRect(10, 160, 409, 99))
        self.horizontalLayout = QHBoxLayout(self.widget)
        self.horizontalLayout.setObjectName(u"horizontalLayout")
        self.horizontalLayout.setSizeConstraint(QLayout.SetMinimumSize)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.lblBlinkTime = QLabel(self.widget)
        self.lblBlinkTime.setObjectName(u"lblBlinkTime")

        self.horizontalLayout.addWidget(self.lblBlinkTime)

        self.txtBlinkTime = QLineEdit(self.widget)
        self.txtBlinkTime.setObjectName(u"txtBlinkTime")
        font4 = QFont()
        font4.setPointSize(10)
        self.txtBlinkTime.setFont(font4)

        self.horizontalLayout.addWidget(self.txtBlinkTime)

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setObjectName(u"menubar")
        self.menubar.setGeometry(QRect(0, 0, 423, 21))
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName(u"statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.retranslateUi(MainWindow)

        # settingsRestoration
        self.chkScreenRest.setChecked(bool(Util.get_screen_rest_monitoring()))
        self.chkEyeBlink.setChecked(bool(Util.get_blink_monitoring()))
        self.chkNotificationBanner.setChecked(
            bool(Util.get_notification_enabled()))
        self.chkConnectSmartphone.setChecked(
            bool(Util.get_smart_notification_enabled()))
        self.txtBlinkTime.setText(Util.get_timeout())
        # events
        self.btnStart.clicked.connect(
            lambda: start_blink_detection())  # Set Start button
        self.chkScreenRest.stateChanged.connect(
            lambda: Util.set_screen_rest_monitoring(self.chkScreenRest.
                                                    isChecked()))
        self.chkEyeBlink.stateChanged.connect(
            lambda: Util.set_blink_monitoring(self.chkEyeBlink.isChecked()))
        self.chkConnectSmartphone.stateChanged.connect(
            lambda: Util.set_smart_notification_enabled(
                self.chkConnectSmartphone.isChecked()))
        self.chkNotificationBanner.stateChanged.connect(
            lambda: Util.set_notification_enabled(self.chkNotificationBanner.
                                                  isChecked()))
        self.txtBlinkTime.editingFinished.connect(
            lambda: Util.set_timeout(self.txtBlinkTime.text()))
        self.btnStop.clicked.connect(sys.exit)
        QMetaObject.connectSlotsByName(MainWindow)

    # setupUi

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(
            QCoreApplication.translate("MainWindow", u"AI - Svasthya", None))
        self.chkScreenRest.setText(
            QCoreApplication.translate("MainWindow", u"Screen Rest", None))
        self.chkEyeBlink.setText(
            QCoreApplication.translate("MainWindow", u"Eye Blinks", None))
        self.lblMonitor.setText(
            QCoreApplication.translate("MainWindow", u"Monitor", None))
        self.lblNotification.setText(
            QCoreApplication.translate("MainWindow", u"Notification", None))
        self.chkNotificationBanner.setText(
            QCoreApplication.translate("MainWindow",
                                       u"Show Notification Banner", None))
        self.chkConnectSmartphone.setText(
            QCoreApplication.translate("MainWindow", u"Connect to Smartphone",
                                       None))
        self.lblSetting.setText(
            QCoreApplication.translate("MainWindow", u"Settings", None))
        self.btnStart.setText(
            QCoreApplication.translate("MainWindow", u"Start monitoring",
                                       None))
        self.btnStop.setText(
            QCoreApplication.translate("MainWindow", u"Stop ", None))
        self.lblBlinkTime.setText(
            QCoreApplication.translate(
                "MainWindow", u"Blink warning after not blinked for(per "
                u"minute)-", None))
        self.txtBlinkTime.setText(
            QCoreApplication.translate("MainWindow", u"15", None))
Ejemplo n.º 21
0
class AuthWindowUI(object):
    def __init__(self, MainWin):
        # Main Window
        MainWin.setObjectName("AuthWindow")
        MainWin.setWindowIcon(MainWin.window_icon)
        MainWin.setWindowTitle(MainWin.tr(MainWin.window_title))
        MainWin.resize(1024, 860)
        self.config = MainWin.config
        self.centralWidget = QWidget(MainWin)
        self.centralWidget.setObjectName("centralWidget")
        MainWin.setCentralWidget(self.centralWidget)
        self.verticalLayout = QVBoxLayout(self.centralWidget)
        self.verticalLayout.setContentsMargins(11, 11, 11, 11)
        self.verticalLayout.setSpacing(6)
        self.verticalLayout.setObjectName("verticalLayout")

        self.tabWidget = QTabWidget(MainWin)
        self.tabWidget.currentChanged.connect(MainWin.onTabChanged)
        self.tabWidget.tabCloseRequested.connect(MainWin.onTabClosed)
        self.tabWidget.setTabsClosable(True)
        # workaround for https://bugreports.qt.io/browse/QTBUG-58267
        if "darwin" in sys.platform:
            self.tabWidget.setDocumentMode(True)

        # Splitter for log
        self.splitter = QSplitter(Qt.Vertical)
        self.splitter.addWidget(self.tabWidget)

        # Log Widget
        self.logTextBrowser = QPlainTextEditLogger(self.centralWidget)
        self.logTextBrowser.widget.setObjectName("logTextBrowser")
        self.logTextBrowser.widget.setStyleSheet("""
            QPlainTextEdit {
                    border: 2px solid grey;
                    border-radius: 5px;
                    background-color: lightgray;
            }
            """)
        self.splitter.addWidget(self.logTextBrowser.widget)

        # add splitter
        self.splitter.setSizes([800, 100])
        self.verticalLayout.addWidget(self.splitter)

        # Tool Bar
        self.mainToolBar = QToolBar(MainWin)
        self.mainToolBar.setObjectName("mainToolBar")
        self.mainToolBar.setToolButtonStyle(Qt.ToolButtonTextUnderIcon)
        self.mainToolBar.setContextMenuPolicy(Qt.PreventContextMenu)
        MainWin.addToolBar(Qt.TopToolBarArea, self.mainToolBar)

        # Servers
        self.serverWidget = QWidget(MainWin)
        self.serverLayout = QHBoxLayout()
        self.serverLabel = QLabel("Server:")
        self.serverLayout.addWidget(self.serverLabel)
        self.serverComboBox = QComboBox()
        self.serverComboBox.setEditable(True)
        self.serverComboBox.setDuplicatesEnabled(False)
        self.serverComboBox.setMinimumContentsLength(50)
        self.serverComboBox.currentIndexChanged.connect(
            MainWin.onServerListChanged)
        lineEdit = self.serverComboBox.lineEdit()
        lineEdit.returnPressed.connect(MainWin.on_actionAdd_triggered)
        self.serverLayout.addWidget(self.serverComboBox)
        self.serverWidget.setLayout(self.serverLayout)
        self.mainToolBar.addWidget(self.serverWidget)

        # Add
        self.actionAdd = QAction(MainWin)
        self.actionAdd.setObjectName("actionAdd")
        self.actionAdd.setText(MainWin.tr("Add"))
        self.actionAdd.setToolTip(MainWin.tr("Add to server list"))
        self.actionAdd.setShortcut(MainWin.tr("Ctrl+A"))

        # Remove
        self.actionRemove = QAction(MainWin)
        self.actionRemove.setObjectName("actionRemove")
        self.actionRemove.setText(MainWin.tr("Remove"))
        self.actionRemove.setToolTip(MainWin.tr("Remove from server list"))
        self.actionRemove.setShortcut(MainWin.tr("Ctrl+X"))

        # Show Token
        self.actionShowToken = QAction(MainWin)
        self.actionShowToken.setEnabled(False)
        self.actionShowToken.setObjectName("actionShowToken")
        self.actionShowToken.setText(MainWin.tr("Show Token"))
        self.actionShowToken.setToolTip(
            MainWin.tr("Display the current authentication token"))
        self.actionShowToken.setShortcut(MainWin.tr("Ctrl+S"))

        # Login
        self.actionLogin = QAction(MainWin)
        self.actionLogin.setObjectName("actionLogin")
        self.actionLogin.setText(MainWin.tr("Login"))
        self.actionLogin.setToolTip(
            MainWin.tr("Login to the currently selected server"))
        self.actionLogin.setShortcut(MainWin.tr("Ctrl+L"))

        # Logout
        self.actionLogout = QAction(MainWin)
        self.actionLogout.setObjectName("actionLogout")
        self.actionLogout.setText(MainWin.tr("Logout"))
        self.actionLogout.setToolTip(
            MainWin.tr("Logout of the currently selected server"))
        self.actionLogout.setShortcut(MainWin.tr("Ctrl+O"))

        # Add
        self.mainToolBar.addAction(self.actionAdd)
        self.actionAdd.setIcon(qApp.style().standardIcon(
            QStyle.SP_FileDialogNewFolder))

        # Remove
        self.mainToolBar.addAction(self.actionRemove)
        self.actionRemove.setIcon(qApp.style().standardIcon(
            QStyle.SP_DialogDiscardButton))

        # Show Token
        self.mainToolBar.addAction(self.actionShowToken)
        self.actionShowToken.setIcon(qApp.style().standardIcon(
            QStyle.SP_FileDialogInfoView))
        self.mainToolBar.addSeparator()

        # this spacer right justifies everything that comes after it
        spacer = QWidget()
        spacer.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.mainToolBar.addWidget(spacer)

        # Login
        self.mainToolBar.addSeparator()
        self.mainToolBar.addAction(self.actionLogin)
        self.actionLogin.setIcon(qApp.style().standardIcon(
            QStyle.SP_DialogApplyButton))

        # Logout
        self.mainToolBar.addSeparator()
        self.mainToolBar.addAction(self.actionLogout)
        self.actionLogout.setIcon(qApp.style().standardIcon(
            QStyle.SP_DialogOkButton))

        # Status Bar
        self.statusBar = QStatusBar(MainWin)
        self.statusBar.setToolTip("")
        self.statusBar.setStatusTip("")
        self.statusBar.setObjectName("statusBar")
        MainWin.setStatusBar(self.statusBar)

        # configure logging
        self.logTextBrowser.widget.log_update_signal.connect(MainWin.updateLog)
        self.logTextBrowser.setFormatter(
            logging.Formatter("%(asctime)s - %(levelname)s - %(message)s"))
        logging.getLogger().addHandler(self.logTextBrowser)
        logging.getLogger().setLevel(logging.INFO)

        # finalize UI setup
        QMetaObject.connectSlotsByName(MainWin)
Ejemplo n.º 22
0
class UiInstagram(PageWindow):  # UI for Instagram ,Downloads Instagram Video
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle(" INSTAGRAM - ELITELOADER")

    def initUI(self):
        self.setupUi(self)

    def is_connected(self,
                     test_url: str = "https://instagram.com",
                     timeout: int = 2) -> bool:
        """ Checks Internet Connection
            returns-Bool value
        """
        try:
            test_connection = requests.get(test_url, timeout=timeout)
            test_connection.raise_for_status()
            return True
        except requests.HTTPError as error:
            print("http error")
            QMessageBox.question(self, "Error", 'http error', QMessageBox.Ok)
        except requests.exceptions.ConnectionError:
            print(
                "An error happened when trying to establish a connection to Instagram."
            )
            QMessageBox.question(self, "Error", 'http error', QMessageBox.Ok)
        return False

    def is_instagram_domain(self, post_url: str = None) -> bool:
        """ Check if its a insta domain
            returns-Bool value
        """
        is_match = match(r"^(https:)[/][/]www.([^/]+[.])*instagram.com",
                         post_url)
        if is_match:
            return True
        else:
            return False

    def determine_media_type(self, media_content: str = None) -> str:
        """ Determines the media type
            returns-media type (image or video)
        """
        content_type_header: str = search(
            r'<meta name="medium" content=[\'"]?([^\'" >]+)',
            media_content).group()
        content_type = sub(r'<meta name="medium" content="', "",
                           content_type_header)
        return content_type

    def extract_video_direct_link(self, media_content: str = None) -> str:
        """ Gets direct url of the video """
        image_link_header: str = search(
            r'meta property="og:video" content=[\'"]?([^\'" >]+)',
            media_content).group()
        video_link: str = sub(r'meta property="og:video" content="', "",
                              image_link_header)
        return video_link

    def download_video(self, post_content: str = None) -> None:
        """ Downloads the video and displays progressbar"""
        try:
            video_direct_url: str = self.extract_video_direct_link(
                post_content)
            video_content = requests.get(video_direct_url, stream=True)
            video_size = int(video_content.headers["Content-Length"])
            video_file_path = data.get('loc')
            self.label_for_Size.setText("SIZE: " +
                                        str(round(video_size *
                                                  (0.000001), 3)) + ' MB')
            downloaded = 0
            with open(video_file_path, "wb") as video_file:
                for data_block in video_content.iter_content(BLOCK_SIZE):
                    downloaded += len(data_block)
                    video_file.write(data_block)
                    pct = (downloaded / video_size) * 100
                    self.progressBar.setValue(int(pct))
        except:
            QMessageBox.question(self, "Error", "Download Failed!!",
                                 QMessageBox.Ok)
            exit(0)

    def main(self, url):
        """ Checks URL and connetion """
        if not self.is_connected():
            QMessageBox.question(self, "Error", "Download Failed!!",
                                 QMessageBox.Ok)
            exit()
        if not self.is_instagram_domain(url):
            QMessageBox.question(self, "Error", "Download Failed!!",
                                 QMessageBox.Ok)
            exit()
        media_content = requests.get(url).content.decode("utf-8")
        media_type = self.determine_media_type(media_content)
        if media_type == "image":
            print("image link found")
            exit(0)
        elif media_type == "video":
            self.download_video(media_content)
        else:
            QMessageBox.question(self, "Error", "Download Failed!!",
                                 QMessageBox.Ok)
            exit()

    def Initiate_Download(self, url):
        self.main(url)
        exit(0)

    def download(self):
        """ Changes UI"""
        self.progressBar.setVisible(True)
        self.pushButton.setVisible(False)
        self.label_for_Size.setVisible(True)
        self.label_info.setVisible(False)
        self.Title_label.setText("Starting Download..\nPlease wait...")
        url = data.get('url')
        self.t = Thread(target=self.Initiate_Download(url))
        self.t.start()
        process.join()

    def setupUi(self, general_vidloader):
        """ Sets up UI"""
        general_vidloader.setObjectName("general_vidloader")
        self.centralwidget = QWidget(general_vidloader)
        self.centralwidget.setObjectName("centralwidget")
        self.progressBar = QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QRect(110, 150, 381, 25))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.progressBar.setVisible(False)
        self.progressBar.setValue(0)
        self.Title_label = QLabel(self.centralwidget)
        self.Title_label.setGeometry(QRect(170, 10, 261, 51))
        self.label_for_Size = QLabel(self.centralwidget)
        self.label_for_Size.setGeometry(QRect(220, 200, 180, 41))
        self.label_for_Size.setObjectName("label_for_SizeDisplay")
        self.label_for_Size.setVisible(False)
        self.Title_label = QLabel(self.centralwidget)
        self.Title_label.setGeometry(QRect(230, 20, 230, 41))
        font = QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Title_label.setFont(font)
        self.Title_label.setObjectName("Title_label")
        self.label_info = QLabel(self.centralwidget)
        self.label_info.setGeometry(QRect(30, 300, 271, 17))
        self.label_info.setObjectName("label_info")
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QRect(430, 220, 88, 33))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(lambda: self.download())
        general_vidloader.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(general_vidloader)
        self.menubar.setGeometry(QRect(0, 0, 586, 25))
        self.menubar.setObjectName("menubar")
        general_vidloader.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(general_vidloader)
        self.statusbar.setObjectName("statusbar")
        general_vidloader.setStatusBar(self.statusbar)

        self.retranslateUi(general_vidloader)
        QMetaObject.connectSlotsByName(general_vidloader)

    def retranslateUi(self, general_vidloader):
        _translate = QCoreApplication.translate
        general_vidloader.setWindowTitle(
            _translate("general_vidloader",
                       "Insta video downloader - ELITELOADER"))
        self.Title_label.setText(
            _translate("general_vidloader", "Continue.. ?"))
        self.label_info.setText(
            _translate("general_vidloader",
                       "*save file with reqd. name and extension"))
        self.pushButton.setText(_translate("general_vidloader", "Download"))
        self.label_for_Size.setText(_translate("ELITE", "SIZE:"))
Ejemplo n.º 23
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(1871, 1200)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.transformsGroupBox = QGroupBox(self.centralwidget)
        self.transformsGroupBox.setGeometry(QRect(1500, 170, 240, 500))
        self.transformsGroupBox.setMaximumSize(QSize(240, 600))
        font = QFont()
        font.setFamily("MS Shell Dlg 2")
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.transformsGroupBox.setFont(font)
        self.transformsGroupBox.setToolTip("")
        self.transformsGroupBox.setWhatsThis("")
        self.transformsGroupBox.setObjectName("transformsGroupBox")
        self.edgesButton = QPushButton(self.transformsGroupBox)
        self.edgesButton.setGeometry(QRect(110, 180, 120, 30))
        self.edgesButton.setObjectName("edgesButton")
        self.brightnessButton = QPushButton(self.transformsGroupBox)
        self.brightnessButton.setGeometry(QRect(110, 20, 120, 30))
        font = QFont()
        font.setPointSize(8)
        self.brightnessButton.setFont(font)
        self.brightnessButton.setObjectName("brightnessButton")
        self.getSizeButton = QPushButton(self.transformsGroupBox)
        self.getSizeButton.setGeometry(QRect(0, 470, 75, 23))
        self.getSizeButton.setObjectName("getSizeButton")
        self.paramsGroupBox = QGroupBox(self.transformsGroupBox)
        self.paramsGroupBox.setGeometry(QRect(10, 29, 91, 321))
        font = QFont()
        font.setPointSize(8)
        self.paramsGroupBox.setFont(font)
        self.paramsGroupBox.setObjectName("paramsGroupBox")
        self.leftSlider = QSlider(self.paramsGroupBox)
        self.leftSlider.setGeometry(QRect(10, 50, 20, 240))
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.leftSlider.sizePolicy().hasHeightForWidth())
        self.leftSlider.setSizePolicy(sizePolicy)
        self.leftSlider.setOrientation(Qt.Vertical)
        self.leftSlider.setTickPosition(QSlider.TicksAbove)
        self.leftSlider.setObjectName("leftSlider")
        self.rightSlider = QSlider(self.paramsGroupBox)
        self.rightSlider.setGeometry(QRect(50, 50, 20, 240))
        sizePolicy = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.rightSlider.sizePolicy().hasHeightForWidth())
        self.rightSlider.setSizePolicy(sizePolicy)
        self.rightSlider.setOrientation(Qt.Vertical)
        self.rightSlider.setTickPosition(QSlider.TicksAbove)
        self.rightSlider.setObjectName("rightSlider")
        self.leftLabel = QLabel(self.paramsGroupBox)
        self.leftLabel.setGeometry(QRect(10, 20, 20, 15))
        self.leftLabel.setTextFormat(Qt.PlainText)
        self.leftLabel.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
        self.leftLabel.setObjectName("leftLabel")
        self.rightLabel = QLabel(self.paramsGroupBox)
        self.rightLabel.setGeometry(QRect(50, 20, 20, 15))
        self.rightLabel.setTextFormat(Qt.PlainText)
        self.rightLabel.setAlignment(Qt.AlignRight|Qt.AlignTrailing|Qt.AlignVCenter)
        self.rightLabel.setObjectName("rightLabel")
        self.adaptiveThresholdButton = QPushButton(self.transformsGroupBox)
        self.adaptiveThresholdButton.setGeometry(QRect(110, 140, 120, 30))
        font = QFont()
        font.setPointSize(8)
        self.adaptiveThresholdButton.setFont(font)
        self.adaptiveThresholdButton.setObjectName("adaptiveThresholdButton")
        self.gray2colSelButton = QPushButton(self.transformsGroupBox)
        self.gray2colSelButton.setGeometry(QRect(110, 100, 120, 30))
        font = QFont()
        font.setPointSize(8)
        self.gray2colSelButton.setFont(font)
        self.gray2colSelButton.setObjectName("gray2colSelButton")
        self.gray2colAllButton = QPushButton(self.transformsGroupBox)
        self.gray2colAllButton.setGeometry(QRect(110, 60, 120, 30))
        font = QFont()
        font.setPointSize(8)
        self.gray2colAllButton.setFont(font)
        self.gray2colAllButton.setObjectName("gray2colAllButton")
        self.fftButton = QPushButton(self.transformsGroupBox)
        self.fftButton.setGeometry(QRect(110, 220, 120, 30))
        self.fftButton.setObjectName("fftButton")
        self.dftButton = QPushButton(self.transformsGroupBox)
        self.dftButton.setGeometry(QRect(110, 260, 120, 30))
        self.dftButton.setObjectName("dftButton")
        self.gaborButton = QPushButton(self.transformsGroupBox)
        self.gaborButton.setGeometry(QRect(110, 300, 120, 30))
        self.gaborButton.setObjectName("gaborButton")
        self.differenceButton = QPushButton(self.transformsGroupBox)
        self.differenceButton.setGeometry(QRect(110, 340, 120, 30))
        self.differenceButton.setObjectName("differenceButton")
        self.RGB2GrayButton = QPushButton(self.transformsGroupBox)
        self.RGB2GrayButton.setGeometry(QRect(110, 380, 120, 30))
        self.RGB2GrayButton.setObjectName("RGB2GrayButton")
        self.invertedCheckBox = QCheckBox(self.transformsGroupBox)
        self.invertedCheckBox.setGeometry(QRect(110, 430, 121, 17))
        self.invertedCheckBox.setObjectName("invertedCheckBox")
        self.angleDial = QDial(self.transformsGroupBox)
        self.angleDial.setGeometry(QRect(20, 360, 81, 64))
        self.angleDial.setMinimum(1)
        self.angleDial.setMaximum(4)
        self.angleDial.setPageStep(1)
        self.angleDial.setSliderPosition(1)
        self.angleDial.setWrapping(False)
        self.angleDial.setNotchesVisible(True)
        self.angleDial.setObjectName("angleDial")
        self.groupButtonsBox = QGroupBox(self.centralwidget)
        self.groupButtonsBox.setGeometry(QRect(1500, 730, 241, 141))
        self.groupButtonsBox.setMaximumSize(QSize(250, 600))
        font = QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.groupButtonsBox.setFont(font)
        self.groupButtonsBox.setObjectName("groupButtonsBox")
        self.addImgButton = QPushButton(self.groupButtonsBox)
        self.addImgButton.setGeometry(QRect(50, 20, 150, 30))
        palette = QPalette()
        brush = QBrush(QColor(180, 146, 66))
        brush.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Active, QPalette.Button, brush)
        brush = QBrush(QColor(180, 146, 66))
        brush.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Inactive, QPalette.Button, brush)
        brush = QBrush(QColor(180, 146, 66))
        brush.setStyle(Qt.SolidPattern)
        palette.setBrush(QPalette.Disabled, QPalette.Button, brush)
        self.addImgButton.setPalette(palette)
        font = QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.addImgButton.setFont(font)
        self.addImgButton.setObjectName("addImgButton")
        self.saveSceneImgButton = QPushButton(self.groupButtonsBox)
        self.saveSceneImgButton.setGeometry(QRect(50, 60, 150, 30))
        font = QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.saveSceneImgButton.setFont(font)
        self.saveSceneImgButton.setObjectName("saveSceneImgButton")
        self.saveImgButton = QPushButton(self.groupButtonsBox)
        self.saveImgButton.setGeometry(QRect(50, 100, 150, 30))
        font = QFont()
        font.setPointSize(9)
        font.setBold(True)
        font.setWeight(75)
        self.saveImgButton.setFont(font)
        self.saveImgButton.setObjectName("saveImgButton")
        self.graphicsView = QGraphicsView(self.centralwidget)
        self.graphicsView.setGeometry(QRect(10, 15, 1471, 900))
        self.graphicsView.setMaximumSize(QSize(4000, 3000))
        self.graphicsView.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.graphicsView.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        self.graphicsView.setSizeAdjustPolicy(QAbstractScrollArea.AdjustToContents)
        self.graphicsView.setObjectName("graphicsView")
        self.scene = TransformScene()
        self.graphicsView.setScene(self.scene)
        self.scaleEditLabel = QLabel(self.centralwidget)
        self.scaleEditLabel.setGeometry(QRect(1500, 100, 47, 13))
        font = QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.scaleEditLabel.setFont(font)
        self.scaleEditLabel.setObjectName("scaleEditLabel")
        self.scaleBox = QDoubleSpinBox(self.centralwidget)
        self.scaleBox.setGeometry(QRect(1550, 100, 62, 22))
        font = QFont()
        font.setBold(True)
        font.setWeight(75)
        self.scaleBox.setFont(font)
        self.scaleBox.setMinimum(0.1)
        self.scaleBox.setMaximum(10.0)
        self.scaleBox.setSingleStep(0.1)
        self.scaleBox.setProperty("value", 0.5)
        self.scaleBox.setObjectName("scaleBox")
        self.infoLabel = QLabel(self.centralwidget)
        self.infoLabel.setGeometry(QRect(1499, 130, 230, 20))
        self.infoLabel.setFrameShape(QFrame.WinPanel)
        self.infoLabel.setText("")
        self.infoLabel.setAlignment(Qt.AlignCenter)
        self.infoLabel.setObjectName("infoLabel")
        self.infoLabel_2 = QLabel(self.centralwidget)
        self.infoLabel_2.setGeometry(QRect(1500, 20, 230, 20))
        font = QFont()
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.infoLabel_2.setFont(font)
        self.infoLabel_2.setFrameShape(QFrame.WinPanel)
        self.infoLabel_2.setText("")
        self.infoLabel_2.setAlignment(Qt.AlignCenter)
        self.infoLabel_2.setObjectName("infoLabel_2")
        self.infoLabel_3 = QLabel(self.centralwidget)
        self.infoLabel_3.setGeometry(QRect(1500, 60, 230, 20))
        font = QFont()
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.infoLabel_3.setFont(font)
        self.infoLabel_3.setFrameShape(QFrame.Box)
        self.infoLabel_3.setText("")
        self.infoLabel_3.setAlignment(Qt.AlignCenter)
        self.infoLabel_3.setObjectName("infoLabel_3")
        self.clearImgButton = QPushButton(self.centralwidget)
        self.clearImgButton.setGeometry(QRect(1550, 690, 150, 30))
        font = QFont()
        font.setPointSize(10)
        font.setBold(True)
        font.setWeight(75)
        self.clearImgButton.setFont(font)
        self.clearImgButton.setObjectName("clearImgButton")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QRect(0, 0, 1871, 21))
        self.menubar.setObjectName("menubar")
        self.menuHelp = QMenu(self.menubar)
        self.menuHelp.setObjectName("menuHelp")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.actionExit = QAction(MainWindow)
        self.actionExit.setObjectName("actionExit")
        self.actionHelp = QAction(MainWindow)
        self.actionHelp.setObjectName("actionHelp")
        self.actionAbout = QAction(MainWindow)
        self.actionAbout.setObjectName("actionAbout")
        self.actionDefault_Values = QAction(MainWindow)
        self.actionDefault_Values.setObjectName("actionDefault_Values")
        self.menuHelp.addAction(self.actionHelp)
        self.menuHelp.addAction(self.actionAbout)
        self.menuHelp.addSeparator()
        self.menuHelp.addAction(self.actionDefault_Values)
        self.menubar.addAction(self.menuHelp.menuAction())

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)
        self.scene.file_signal.connect(on_file_signal)
        self.scene.info_signal.connect(on_info_signal)
        self.scene.sliders_reset_signal.connect(on_sliders_reset_signal)
        

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Green Monkey"))
        self.transformsGroupBox.setTitle(_translate("MainWindow", "Transformations"))
        self.edgesButton.setText(_translate("MainWindow", "Edges, Sobel"))
        self.brightnessButton.setToolTip(_translate("MainWindow", "You can change brightness with left slider and blur with rigt one."))
        self.brightnessButton.setWhatsThis(_translate("MainWindow", "You can change brightness with left slider and blur with rigt one."))
        self.brightnessButton.setText(_translate("MainWindow", "Brightness and Blur"))
        self.getSizeButton.setText(_translate("MainWindow", "get Size"))
        self.paramsGroupBox.setTitle(_translate("MainWindow", "Parameters"))
        self.leftSlider.setToolTip(_translate("MainWindow", "Adaptive Threshold\n"
"blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on."))
        self.leftSlider.setWhatsThis(_translate("MainWindow", "Adaptive Threshold\n"
"blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on."))
        self.rightSlider.setToolTip(_translate("MainWindow", "Adaptive Threshold\n"
"C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well."))
        self.rightSlider.setWhatsThis(_translate("MainWindow", "Adaptive Threshold\n"
"C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well."))
        self.leftLabel.setText(_translate("MainWindow", "0"))
        self.rightLabel.setText(_translate("MainWindow", "0"))
        self.adaptiveThresholdButton.setText(_translate("MainWindow", "Adaptive Threshold"))
        self.gray2colSelButton.setToolTip(_translate("MainWindow", "Gray scale 0..255 to color with selected method only.\n"
"Image is converted to gray and finally to color."))
        self.gray2colSelButton.setWhatsThis(_translate("MainWindow", "Gray scale 0..255 to color with selected method only.\n"
"Image is converted to gray and  and finally to color."))
        self.gray2colSelButton.setText(_translate("MainWindow", "Gray2Color Sel."))
        self.gray2colAllButton.setToolTip(_translate("MainWindow", "Gray scale 0..255 to color for all available methods.\n"
"Image resized as per scale window and then  is converted to gray and finally to color."))
        self.gray2colAllButton.setWhatsThis(_translate("MainWindow", "Gray scale 0..255 to color for all available methods.\n"
"Image resized as per scale window and then  is converted to gray and finally to color."))
        self.gray2colAllButton.setText(_translate("MainWindow", "Gray2Color All"))
        self.fftButton.setText(_translate("MainWindow", "FFT"))
        self.dftButton.setText(_translate("MainWindow", "DFT"))
        self.gaborButton.setToolTip(_translate("MainWindow", "Applies Gabor Filter"))
        self.gaborButton.setWhatsThis(_translate("MainWindow", "Applies Gabor Filter"))
        self.gaborButton.setText(_translate("MainWindow", "Gabor Filter"))
        self.differenceButton.setText(_translate("MainWindow", "Difference"))
        self.RGB2GrayButton.setText(_translate("MainWindow", "RGB to Gray"))
        self.invertedCheckBox.setText(_translate("MainWindow", "Inverted Image"))
        self.angleDial.setToolTip(_translate("MainWindow", "GABOR Filter - angle 1..4 ~ 1*np.pi/angle"))
        self.angleDial.setWhatsThis(_translate("MainWindow", "GABOR Filter - angle 1..4 ~ 1*np.pi/angle"))
        self.groupButtonsBox.setTitle(_translate("MainWindow", "Images"))
        self.addImgButton.setText(_translate("MainWindow", "Add Image(s)"))
        self.addImgButton.setShortcut(_translate("MainWindow", "Ctrl+A"))
        self.saveSceneImgButton.setText(_translate("MainWindow", "Save Scene as Image"))
        self.saveImgButton.setText(_translate("MainWindow", "Save Selected as Image"))
        self.scaleEditLabel.setText(_translate("MainWindow", "Scale:"))
        self.clearImgButton.setText(_translate("MainWindow", "Clear Image(s)"))
        self.menuHelp.setTitle(_translate("MainWindow", "Help"))
        self.actionExit.setText(_translate("MainWindow", "Exit"))
        self.actionHelp.setText(_translate("MainWindow", "Help"))
        self.actionAbout.setText(_translate("MainWindow", "About"))
        self.actionDefault_Values.setText(_translate("MainWindow", "Default Values"))

        self.actionHelp.setShortcut('F1')
        self.actionHelp.setStatusTip('Help')  
        self.actionHelp.triggered.connect(self.showHelp)
        self.actionAbout.setStatusTip('About')  
        self.actionAbout.triggered.connect(self.showAbout)
        self.actionDefault_Values.setStatusTip('Default folders and other values')
        self.actionDefault_Values.triggered.connect(self.updateINI)
   
        self.addImgButton.clicked.connect(partial(self.scene.addImg))
        self.clearImgButton.clicked.connect(self.scene.dialogClearScene)
        self.saveSceneImgButton.clicked.connect(partial(self.scene.saveScene))
        self.saveImgButton.clicked.connect(partial(self.scene.saveImg))
        self.scaleBox.valueChanged.connect(self.onScaleBoxValueChanged)
        self.getSizeButton.clicked.connect(self.showSceneSize)
        self.brightnessButton.clicked.connect(self.startBrightnessAndBlur)
        self.gray2colAllButton.clicked.connect(self.startGray2colAllButton)
        self.gray2colSelButton.clicked.connect(self.startGray2colSelButton)
        self.adaptiveThresholdButton.clicked.connect(self.startAdaptiveThreshold)
        self.edgesButton.clicked.connect(self.startSobelXY)
        self.fftButton.clicked.connect(self.startFFT)
        self.dftButton.clicked.connect(self.startDFT)
        self.gaborButton.clicked.connect(self.startGabor)
        self.differenceButton.clicked.connect(self.startDifference)
        self.RGB2GrayButton.clicked.connect(self.starRGB2Gray)

        
 
        self.leftSlider.valueChanged['int'].connect(self. leftSliderChanged)
        self.rightSlider.valueChanged['int'].connect(self.rightSliderChanged)
        self.angleDial.valueChanged['int'].connect(self.angleDialChanged)
        
    def setStart(self):
        self.graphicsView.setAlignment(Qt.AlignLeft|Qt.AlignTop)
        self.scene.setSceneRect(0, 0, 0, 0)
        self.scene.imgScale = self.scaleBox.value()
        self.clearSliders()
        self.infoLabel.setText("")
        self.scene.cv2Images = {}
        self.transformsGroupBox.setEnabled(False)
        self.transformsGroupBox.setEnabled(False)
        self.invertedCheckBox.setChecked(False)

        
        
    def clearSliders(self):
        self.infoLabel_2.setText('')
        self.infoLabel_3.setText('')
        self.scene.currentTransform = 0
        self.leftSlider.setEnabled(False)
        self.leftSlider.setToolTip("")
        self.leftSlider.setWhatsThis("")
        self.leftSlider.setMaximum(99)
        self.leftSlider.setMinimum(0)
        self.leftSlider.setTickInterval(10)        
        self.leftSlider.setSingleStep(1)
        self.leftSlider.setTickPosition(11)

        self.rightSlider.setEnabled(False)
        self.rightSlider.setToolTip("")
        self.rightSlider.setWhatsThis("")
        self.rightSlider.setMaximum(99)
        self.rightSlider.setMinimum(0)
        self.rightSlider.setTickInterval(10)        
        self.rightSlider.setSingleStep(1)
        self.rightSlider.setTickPosition(0) 
        self.paramsGroupBox.setFlat(False)
        self.paramsGroupBox.setStyleSheet('QGroupBox * {color: black; font-weight: normal;}') 
        
        self.angleDial.setEnabled(False)
        self.angleDial.setToolTip(" ")
        self.angleDial.setWhatsThis("")



    def invertCheckBoxEvent(self, checked):
        self.scene.inverted = checked
               
    def showSceneSize(self):
        x = self.scene.sceneRect().width()
        y = self.scene.sceneRect().height()      
        self.infoLabel.setText(f'size: {x}x{y}, {self.scene.findSceneArea()}')

    def onScaleBoxValueChanged(self, val):
        self.scene.imgScale = val
          
    def startBrightnessAndBlur(self):
        self.scene.currentTransform = 1
        self.infoLabel_2.setText('Adaptive Threshold')      
        self.scene.currentBrightnessValue = 0
        self.scene.currentBlurValue = 0
        self.scene.transform1()

        self.infoLabel_2.setText('Brightness and Blur')
        self.scene.currentTransform = 1
        self.leftSlider.setEnabled(True)
        self.rightSlider.setEnabled(True)
        self.leftSlider.setToolTip("Change Brightness  -> 0 .. 99")
        self.leftSlider.setWhatsThis("Change Brightness  -> 0 .. 99")
        self.rightSlider.setToolTip("Change Blur  -> 0 .. 99")
        self.rightSlider.setWhatsThis("Change Blur  -> 0 .. 99")
        self.leftSlider.setMaximum(99)
        self.leftSlider.setMinimum(0)
        self.leftSlider.setTickInterval(10)        
        self.leftSlider.setSingleStep(1)
        self.leftSlider.setTickPosition(11)
        self.rightSlider.setMaximum(99)
        self.rightSlider.setMinimum(0)
        self.rightSlider.setTickInterval(10)        
        self.rightSlider.setSingleStep(1)
        self.rightSlider.setTickPosition(0) 
        self.paramsGroupBox.setFlat(True)
        self.paramsGroupBox.setStyleSheet('QGroupBox * {color: red; font-weight: bold;}')
        
    def startGray2colAllButton(self):
        self.infoLabel_2.setText('Gray to Color All Methods')
        self.scene.currentTransform = 2
        self.scene.transform2(1, 1)
        
    def startGray2colSelButton(self):
        self.scene.currentTransform = 3
        self.infoLabel_2.setText(' Gray to Color')
        self.scene.transform2(0, 1)   
    
    def startSobelXY(self):
        self.scene.currentTransform = 4
        self.infoLabel_2.setText('Edge Detection')
        self.scene.transform4()
 
    def startFFT(self):
        self.scene.currentTransform = 7
        self.infoLabel_2.setText('FFT')
        self.scene.transform7()
    
    def startDFT(self):
        self.scene.currentTransform = 6
        self.infoLabel_2.setText('DFT')
        self.scene.transform6()
        
    def startDenoising(self):
        self.scene.currentTransform = 8
        self.infoLabel_2.setText('Denoising')
        self.scene.transform8()
        
    def startDifference(self):
        self.scene.currentTransform = 9
        self.infoLabel_2.setText('Difference')
        self.scene.transform9()
        
    def starRGB2Gray(self):
        self.scene.currentTransform = 10
        #txt = self.infoLabel_2.text()
        self.infoLabel_2.setText('RGB to Gray')
        self.scene.transform10()
        
    def startAdaptiveThreshold(self):
        self.scene.currentTransform = 5
        self.infoLabel_2.setText('Adaptive Threshold')      
        self.scene.currentBlockSizeValue = 11
        self.scene.currentCValue = 5
        self.scene.transform5()

        self.leftSlider.setEnabled(True)
        self.rightSlider.setEnabled(True)
        self.leftSlider.setToolTip("Adaptive Threshold\n"
"blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.")
        self.leftSlider.setWhatsThis("Adaptive Threshold\n"
"blockSize – Size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, and so on.")
        self.rightSlider.setToolTip("Adaptive Threshold\n"
"C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.")
        self.rightSlider.setWhatsThis("Adaptive Threshold\n"
"C – Constant subtracted from the mean or weighted mean (see the details below). Normally, it is positive but may be zero or negative as well.")
        self.leftSlider.setMaximum(16)
        self.leftSlider.setMinimum(1)
        self.leftSlider.setTickInterval(1)        
        self.leftSlider.setSingleStep(1)
        self.leftSlider.setTickPosition(11)
        self.rightSlider.setMaximum(20)
        self.rightSlider.setMinimum(-5)
        self.rightSlider.setTickInterval(1)        
        self.rightSlider.setSingleStep(1)
        self.rightSlider.setTickPosition(5)     
        self.paramsGroupBox.setFlat(True)
        self.paramsGroupBox.setStyleSheet('QGroupBox * {color: red; font-weight: bold;}')       

    def startGabor(self):
        self.scene.currentTransform = 8
        self.infoLabel_2.setText('Gabor Filter') 
        self.scene.currentKernelSizeValue = 10
        self.scene.currentSigmaValue = 10
        self.scene.thetaCurrentValue
        self.scene.transform8()
        self.angleDial.setEnabled(True)
        self.leftSlider.setEnabled(True)
        self.rightSlider.setEnabled(True)
        self.leftSlider.setToolTip("Gabor Filter\n"
                                  "kernelSize – Size of a kernel 1..50")
        self.leftSlider.setWhatsThis("Gabor Filter\n"
                                  "kernelSize – Size of a kernel")
        self.rightSlider.setToolTip("Gabor Filter\n"
                                  "Standard Deviation – 1..30")
        self.rightSlider.setWhatsThis("Gabor Filter\n"
                                  "Standard Deviation – 1..30")
        self.angleDial.setToolTip("GABOR Filter - angle 1..4 ~ 1*np.pi/angle")
        self.angleDial.setWhatsThis("GABOR Filter - angle 1..4 ~ 1*np.pi/angle")       
        self.leftSlider.setMaximum(50)
        self.leftSlider.setMinimum(1)
        self.leftSlider.setTickInterval(5)        
        self.leftSlider.setSingleStep(5)
        self.leftSlider.setTickPosition(10)
        self.rightSlider.setMaximum(30)
        self.rightSlider.setMinimum(1)
        self.rightSlider.setTickInterval(5)        
        self.rightSlider.setSingleStep(5)
        self.rightSlider.setTickPosition(10)     
        self.paramsGroupBox.setFlat(True)
        self.paramsGroupBox.setStyleSheet('QGroupBox * {color: red; font-weight: bold;}')       


    def leftSliderChanged(self, value):
        self.leftLabel.setText(str(value))
        if self.scene.currentTransform == 1:
            self.scene.currentBrightnessValue = value
        elif self.scene.currentTransform == 5:
            if value % 2 == 1:return 
            self.scene.currentBlockSizeValue = value
        elif self.scene.currentTransform == 8:
            self.scene.currentKernelSizeValue = value
        else:
            pass
        self.update()
                    
    def rightSliderChanged(self, value):
        self.rightLabel.setText(str(value))
        if self.scene.currentTransform == 1:
            self.scene.currentBlurValue = value
        elif self.scene.currentTransform == 5:
             self.scene.currentCValue = value
        elif self.scene.currentTransform == 8:
            self.scene.currentSigmaValue = value
        else:
            pass
        self.update()  

    def angleDialChanged(self, value): 
        if self.scene.currentTransform == 8:
            self.scene.thetaCurrentValue = value
        self.update()
           
    def update(self):
        if self.scene.currentTransform == 1:
            if len(self.scene.selectedItems()) > 0:
                self.scene.transform1()
        elif self.scene.currentTransform == 5:
            self.infoLabel_2.setText(f'Adaptive Threshold {self.scene.currentBlockSizeValue} {self.scene.currentCValue}')
            if len(self.scene.selectedItems()) > 0:
                self.scene.transform5()
        elif self.scene.currentTransform == 8:
            if len(self.scene.selectedItems()) > 0:
                self.scene.transform8()
        else:
            ...

    def updateINI(self):
        Dialog = QDialog()
        ui = Ui_INI_Dialog()
        ui.setupUi(Dialog)
        Dialog.show()
        Dialog.exec_()
        self.readINI()
        
    def readINI(self):
        self.scene.source_dir = ''
        self.scene.result_dir = ''
        self.scene.color_map = '' 
        self.scene.scale = ''
        if os.path.exists("elilik.ini"):
            f = open("elilik.ini", "r")
            Lines = f.readlines()
            # Strips the newline character
            for line in Lines:
                l = line.strip()
                if "source_dir : " in l:
                    self.scene.source_dir = l.replace("source_dir : ","").strip()
                elif "result_dir : " in l:
                    self.scene.result_dir = l.replace("result_dir : ","").strip()  
                elif "color_map : " in l:
                     s = l.replace("color_map : ","").strip()
                     self.scene.color_map = s.split()
                elif "scale : " in l:
                    self.scene.scale = l.replace("scale : ","").strip()
                else:
                    ...

    def showHelp(self):
        help = showText(os.getcwd()+"/help.html") 
        help.exec_()
 
    def showAbout(self):
        about = showText(os.getcwd()+"/about.html")
        about.resize(280,250)
        about.exec_()
Ejemplo n.º 24
0
class UiYoutube(PageWindow):  # Youtube UI and Youtube Download Manager
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle("Youtube Downloader")

    def initUI(self):
        self.setupUi(self)

    def UiTest(self):  # Used for testing UI
        self.progressBar.setVisible(True)
        self.pushButton.setVisible(False)
        self.groupBox_for_videoFormats.setVisible(False)
        self.groupBox_for_typeSelection.setVisible(False)
        self.label_for_SizeDisplay.setVisible(True)
        self.label_for_FilenameDisplay.setVisible(True)

    def type_vid(self):  # Executed, if the type video is selected
        """ Changes the UI for video downloading """
        self.groupBox_for_typeSelection.setVisible(False)
        self.groupBox_for_videoFormats.setVisible(True)
        self.resolution_comboBox.setVisible(True)
        self.pushButton.setVisible(True)
        self.progressive_checkbox.setVisible(True)
        QMessageBox.question(
            self, 'NOTE',
            "HD Videos are stored separately as Audio and Only Video "
            "formats in youtube.\nUse High"
            " resolution option to download HD video and combine it with"
            " audio with FFMPEG for best result.\n**-->>SD(480p-) videos "
            "are available in combined form.", QMessageBox.Ok)
        TYPE = "video"
        data.add('type', TYPE)
        print('Type -> video proceeding to qual,format setup')

    def type_aud(self):  # Executed, if the type Audio is selected
        """ Establishes connection and downloads audio """
        print('Type audio -> ask loc and start download')
        TYPE = "audio"
        data.add('type', TYPE)
        self.groupBox_for_typeSelection.setVisible(False)
        self.Title_label.setText('PLEASE WAIT...\nStarting Download..')
        path_to_save = QFileDialog.getExistingDirectory()
        print(path_to_save)
        data.add('loc', path_to_save)
        print(data, '@ type aud')
        try:
            yt = YouTube(data.get('url'))
            aud_stream = yt.streams.filter(type='audio').first(
            )  # Establish connection and gets audio stream
        except:
            print('OOPs!')
            QMessageBox.question(self, 'ELITE', 'Server Connection Failed!!',
                                 QMessageBox.Ok)
            exit(0)
        if aud_stream is None:  # Check if audio stream is available
            print('SGS_ERROR-404_NO_STREAM')
            QMessageBox.question(
                self, 'ELITE', 'Selected Stream not available\nPing Streams'
                ' from other menu or retry a different stream', QMessageBox.Ok)
            exit(0)
        else:
            try:
                aud_stream.download(str(
                    data.get('loc')))  # Download in given location
                print('SGS_CODE_SUCCESS')
                QMessageBox.question(self, 'ELITE', 'Download succesful !!!',
                                     QMessageBox.Ok)
            except:
                print('ERROR_IN_DOWNLOAD')
                QMessageBox.question(self, 'ELITE', 'Download Failed !!!',
                                     QMessageBox.Ok)
                exit(0)
        exit(0)

    def progress_check(self, stream=None, chunk=None, remaining=None):
        """ Computes percentage for displaying in progressbar """
        percentage = (100 * (data.get('size') - remaining)) / data.get('size')
        self.progressBar.setValue(int(percentage))

    def download_manager_vid(self):  # Downloads Youtube videos
        """ Establishes connection and selects reqd. stream and downloads it """
        try:
            yt = YouTube(data.get('url'),
                         on_progress_callback=self.progress_check)
        except:
            print('internet??')
            return 'Server Connection failed! \nCheck Internet and URL'
        resolution = data.get('qual')
        format = data.get('format')
        path = data.get('loc')
        Progressive_or_not = data.get('ext')
        if Progressive_or_not:
            if resolution == 'any' and format == 'mp4':
                self.selected_stream = yt.streams.filter(
                    progressive=Progressive_or_not,
                    file_extension=format).order_by('resolution').last()
            elif format == 'any' and resolution == 'any':
                self.selected_stream = yt.streams.filter(
                    progressive=Progressive_or_not).order_by(
                        'resolution').last()
            else:
                self.selected_stream = yt.streams.filter(
                    progressive=Progressive_or_not,
                    file_extension=format).get_by_resolution(resolution)
        if not Progressive_or_not:
            if resolution == 'any' and format == 'mp4':
                self.selected_stream = yt.streams.filter(
                    type='video',
                    file_extension=format).order_by('resolution').last()
            elif format == 'any' and resolution == 'any':
                self.selected_stream = yt.streams.filter(
                    type='video').order_by('resolution').last()
            else:
                self.selected_stream = yt.streams.filter(
                    file_extension=format).get_by_resolution(resolution)
        if self.selected_stream is None:
            print('SGS_ERROR-404_NO_STREAM')
            return 'Selected Stream not available\nPing Streams' + 'from other menu or retry a different stream'
        data.add('size', self.selected_stream.filesize)
        self.selected_stream.download(path)
        print('SGS_CODE_SUCCESS')
        return 'Download Successful !!'

    def get_VideoSpecs(self):
        """Gets Video specifications and location and adjusts UI accordingly"""
        if self.mp4_radioButton.isChecked():
            print('Mp4 is selected -- proceed 147')
            data.add('format', 'mp4')
        elif self.webm_radioButton.isChecked():
            print('WEBM is selected -- proceed 149')
            data.add('format', 'webm')
        else:
            data.add('format', 'any')
        QUALITY = str(self.resolution_comboBox.currentText())
        data.add('qual', QUALITY)
        if self.progressive_checkbox.isChecked():
            data.add('ext', False)
            print('Progressive - False')
        else:
            data.add('ext', True)
            print('Progressive - True')
        print(data.get('format'), data.get('qual'), data.get('ext'),
              "End of info collection")
        self.groupBox_for_videoFormats.setVisible(False)
        self.pushButton.setVisible(False)
        self.progressive_checkbox.setVisible(False)
        self.resolution_comboBox.setVisible(False)
        self.Title_label.setText('PLEASE WAIT...\nStarting Download...')
        self.Title_label.setVisible(True)
        try:
            yt = YouTube(data.get('url'))
        except:
            QMessageBox.question(
                self, 'ELITE',
                'Server Connection Failed!!\nCheck url or Internet',
                QMessageBox.Ok)
            print('internet??')
            exit(0)
        resolution = data.get('qual')
        format = data.get('format')
        Progressive_or_not = data.get('ext')
        if Progressive_or_not:
            if resolution == 'any' and format == 'mp4':
                selected_stream = yt.streams.filter(
                    progressive=Progressive_or_not,
                    file_extension=format).order_by('resolution').last()
            elif format == 'any' and resolution == 'any':
                selected_stream = yt.streams.filter(
                    progressive=Progressive_or_not).order_by(
                        'resolution').last()
            else:
                selected_stream = yt.streams.filter(
                    progressive=Progressive_or_not,
                    file_extension=format).get_by_resolution(resolution)
        if not Progressive_or_not:
            if resolution == 'any' and format == 'mp4':
                selected_stream = yt.streams.filter(
                    type='video',
                    file_extension=format).order_by('resolution').last()
            elif format == 'any' and resolution == 'any':
                selected_stream = yt.streams.filter(
                    type='video').order_by('resolution').last()
            else:
                selected_stream = yt.streams.filter(
                    file_extension=format).get_by_resolution(resolution)
        if selected_stream is None:
            QMessageBox.question(
                self, 'ELITE', 'Selected Stream not available\nPing Streams'
                ' from other menu or retry a different stream', QMessageBox.Ok)
            print('SGS_ERROR-404_NO_STREAM @ 484')
            exit(0)
        filesize = (selected_stream.filesize) * (10**-6)
        filename = selected_stream.default_filename
        self.label_for_SizeDisplay.setText("FILE SIZE: " +
                                           str(round(filesize, 2)) + ' MB')
        self.label_for_SizeDisplay.setVisible(True)
        self.label_for_FilenameDisplay.setText('VIDEO NAME: ' + str(filename))
        self.label_for_FilenameDisplay.setVisible(True)
        self.progressBar.setVisible(True)
        self.pushButton_.setVisible(False)
        path_to_save = QFileDialog.getExistingDirectory(self)
        print(path_to_save)
        data.add('loc', path_to_save)
        print(data)
        message_from_func = self.download_manager_vid()
        QMessageBox.question(self, 'ELITE', message_from_func, QMessageBox.Ok)
        exit(0)

    def setupUi(self, youtube_setup):
        """Sets up the page UI"""
        youtube_setup.setObjectName("youtube_setup")
        self.centralwidget = QWidget(youtube_setup)
        self.centralwidget.setObjectName("centralwidget")
        self.resolution_comboBox = QComboBox(self.centralwidget)
        self.resolution_comboBox.setGeometry(QRect(410, 110, 100, 33))
        self.resolution_comboBox.setObjectName("resolution_comboBox")
        list_quality = ['any', '240p', '360p', '720p', '1080p']
        self.resolution_comboBox.addItems(list_quality)
        self.resolution_comboBox.setVisible(False)
        self.progressive_checkbox = QCheckBox(self.centralwidget)
        self.progressive_checkbox.setGeometry(QRect(20, 230, 350, 50))
        self.progressive_checkbox.setObjectName("check_box")
        self.progressive_checkbox.setVisible(False)
        self.Title_label = QLabel(self.centralwidget)
        self.Title_label.setGeometry(QRect(170, 10, 261, 51))
        self.label_for_SizeDisplay = QLabel(self.centralwidget)
        self.label_for_SizeDisplay.setGeometry(QRect(160, 160, 180, 41))
        self.label_for_SizeDisplay.setObjectName("label_for_SizeDisplay")
        self.label_for_SizeDisplay.setVisible(False)
        self.label_info = QLabel(self.centralwidget)
        self.label_info.setGeometry(QRect(20, 310, 260, 20))
        self.label_info.setObjectName("label_info")
        font = QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Title_label.setFont(font)
        self.Title_label.setObjectName("Title_label")
        self.groupBox_for_typeSelection = QGroupBox(self.centralwidget)
        self.groupBox_for_typeSelection.setGeometry(QRect(200, 90, 191, 121))
        self.groupBox_for_typeSelection.setObjectName(
            "groupBox_for_typeSelection")
        self.type_audio_radioButton = QRadioButton(
            self.groupBox_for_typeSelection)
        self.type_audio_radioButton.setGeometry(QRect(40, 40, 104, 23))
        self.type_audio_radioButton.setObjectName("type_audio_radioButton")
        self.type_audio_radioButton.clicked.connect(lambda: self.type_aud())
        self.type_video_radioButton = QRadioButton(
            self.groupBox_for_typeSelection)
        self.type_video_radioButton.setGeometry(QRect(40, 70, 104, 23))
        self.type_video_radioButton.setObjectName("type_video_radioButton")
        self.type_video_radioButton.clicked.connect(lambda: self.type_vid())
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QRect(460, 290, 88, 33))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.setVisible(False)
        self.pushButton.clicked.connect(lambda: self.get_VideoSpecs())
        self.pushButton_ = QPushButton(self.centralwidget)
        self.pushButton_.setGeometry(QRect(460, 290, 88, 33))
        self.pushButton_.setObjectName("pushButton")
        self.pushButton_.setVisible(False)
        self.pushButton_.clicked.connect(
            lambda: self.YoutubeManager.download_manager_vid(self))
        self.groupBox_for_videoFormats = QGroupBox(self.centralwidget)
        self.groupBox_for_videoFormats.setGeometry(QRect(200, 90, 141, 111))
        self.groupBox_for_videoFormats.setObjectName(
            "groupBox_for_videoFormats")
        self.groupBox_for_videoFormats.setVisible(False)
        self.mp4_radioButton = QRadioButton(self.groupBox_for_videoFormats)
        self.mp4_radioButton.setGeometry(QRect(20, 30, 104, 23))
        self.mp4_radioButton.setObjectName("mp4_radioButton")
        self.webm_radioButton = QRadioButton(self.groupBox_for_videoFormats)
        self.webm_radioButton.setGeometry(QRect(20, 60, 104, 23))
        self.webm_radioButton.setObjectName("webm_radioButton")
        self.progressBar = QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QRect(90, 230, 391, 23))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.progressBar.setVisible(False)
        self.label_for_FilenameDisplay = QLabel(self.centralwidget)
        self.label_for_FilenameDisplay.setGeometry(QRect(75, 110, 500, 50))
        self.label_for_FilenameDisplay.setObjectName(
            "label_for_FilenameDisplay")
        self.label_for_FilenameDisplay.setVisible(False)
        youtube_setup.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(youtube_setup)
        self.menubar.setGeometry(QRect(0, 0, 586, 25))
        self.menubar.setObjectName("menubar")
        youtube_setup.setMenuBar(self.menubar)
        self.progressBar.setValue(0)
        self.statusbar = QStatusBar(youtube_setup)
        self.statusbar.setObjectName("statusbar")
        youtube_setup.setStatusBar(self.statusbar)

        self.retranslateUi(youtube_setup)
        QMetaObject.connectSlotsByName(youtube_setup)

    def retranslateUi(self, youtube_setup):
        _translate = QCoreApplication.translate
        youtube_setup.setWindowTitle(
            _translate("youtube_setup", "Youtube Video Download-ELITELOADER"))
        self.Title_label.setText(
            _translate("youtube_setup", "Select Format and Quality"))
        self.label_for_SizeDisplay.setText(_translate("ELITE", "SIZE:"))
        self.label_for_FilenameDisplay.setText(_translate(
            "ELITE", "FILENAME:"))
        self.groupBox_for_typeSelection.setTitle(
            _translate("youtube_setup", "Type"))
        self.progressive_checkbox.setText(
            _translate('youtube_setup', "High Resolution/Non-Progressive"))
        self.type_audio_radioButton.setText(
            _translate("youtube_setup", "Audio"))
        self.label_info.setText(
            _translate("StartPage_Url",
                       "*This checking process may take longer"))
        self.type_video_radioButton.setText(
            _translate("youtube_setup", "Video"))
        self.pushButton.setText(_translate("youtube_setup", "Proceed"))
        self.pushButton_.setText(_translate("youtube_setup", "Download"))
        self.groupBox_for_videoFormats.setTitle(
            _translate("youtube_setup", "Format"))
        self.mp4_radioButton.setText(_translate("youtube_setup", "MP4"))
        self.webm_radioButton.setText(_translate("youtube_setup", "WEBM"))

    class YoutubeManager:  # Manage Youtube Downloads
        def __init__(self):
            pass

        def ping(
                self):  # Check Available Streams and returns a list of streams
            try:
                yt = YouTube(data.get('url'))
                pingster = yt.streams.all()
                return pingster
            except:
                print('Error in connection')
                return 'Error in connection\nCheck URL and Internet'
Ejemplo n.º 25
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        self.conn = pymysql.connect(host='localhost',
                                    port=3306,
                                    user='******',
                                    password='',
                                    db='')
        self.cur = self.conn.cursor()
        self.sqlString = "select * from student where "
        MainWindow.setObjectName('MainWindow')
        MainWindow.resize(760, 440)
        MainWindow.setFixedSize(MainWindow.width(), MainWindow.height())
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName('centralwidget')

        self.frame = QFrame(self.centralwidget)
        self.frame.setGeometry(QtCore.QRect(10, 10, 491, 121))
        self.frame.setFrameShape(QFrame.StyledPanel)
        self.frame.setFrameShadow(QFrame.Raised)
        self.frame.setObjectName('frame')

        self.check_sid = QCheckBox(self.frame)
        self.check_sid.setGeometry(QtCore.QRect(20, 10, 71, 16))
        self.check_sid.setObjectName('check_sid')

        # self.check_sage = QCheckBox(self.frame)
        # self.check_sage.setGeometry(QtCore.QRect(20, 70, 71, 16))
        # self.check_sage.setObjectName("check_Sage")

        self.check_sname = QCheckBox(self.frame)
        self.check_sname.setGeometry(QtCore.QRect(20, 40, 71, 16))
        self.check_sname.setObjectName('check_sname')

        self.check_sgender = QCheckBox(self.frame)
        self.check_sgender.setGeometry(QtCore.QRect(20, 100, 71, 16))
        self.check_sgender.setObjectName('check_sgender')

        self.sid = QLineEdit(self.frame)
        self.sid.setGeometry(QtCore.QRect(90, 10, 113, 16))
        self.sid.setObjectName('sid')

        self.sname = QLineEdit(self.frame)
        self.sname.setGeometry(QtCore.QRect(90, 40, 113, 16))
        self.sname.setObjectName("sname")

        # self.first_sage = QLineEdit(self.frame)
        # self.first_sage.setGeometry(QtCore.QRect(90, 70, 41, 16))
        # self.first_sage.setObjectName("first_sage")

        self.sgender = QLineEdit(self.frame)
        self.sgender.setGeometry(QtCore.QRect(90, 100, 113, 16))
        self.sgender.setObjectName("sgender")

        self.label = QLabel(self.frame)
        self.label.setGeometry(QtCore.QRect(140, 70, 16, 16))
        self.label.setObjectName('label')

        self.check_sdept = QCheckBox(self.frame)
        self.check_sdept.setGeometry(QtCore.QRect(270, 40, 71, 16))
        self.check_sdept.setObjectName("check_sdept")
        self.sdept = QLineEdit(self.frame)
        self.sdept.setGeometry(QtCore.QRect(340, 40, 113, 16))
        self.sdept.setObjectName("sdept")

        self.sclass = QLineEdit(self.frame)
        self.sclass.setGeometry(QtCore.QRect(340, 10, 113, 16))
        self.sclass.setObjectName("sclass")
        self.check_sclass = QCheckBox(self.frame)
        self.check_sclass.setGeometry(QtCore.QRect(270, 10, 71, 16))
        self.check_sclass.setObjectName("check_sclass")

        self.find = QPushButton(self.frame)
        self.find.setGeometry(QtCore.QRect(380, 100, 75, 21))
        self.find.setObjectName('find')
        self.find.clicked.connect(self.find_btn)

        self.sql_out = QTextBrowser(self.centralwidget)
        self.sql_out.setGeometry(QtCore.QRect(10, 140, 740, 61))
        self.sql_out.setObjectName('sql_out')

        self.result_out = QTableWidget(self.centralwidget)
        self.result_out.setEditTriggers(QAbstractItemView.NoEditTriggers)
        self.result_out.setGeometry(QtCore.QRect(10, 210, 740, 171))
        self.result_out.setObjectName('result_out')

        self.result_out.setColumnCount(5)
        self.result_out.setRowCount(5)
        self.result_out.resizeColumnsToContents()
        self.result_out.resizeRowsToContents()
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(0, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(1, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(2, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(3, item)
        item = QTableWidgetItem()
        self.result_out.setHorizontalHeaderItem(4, item)
        self.result_out.horizontalHeader().setDefaultSectionSize(100)
        self.result_out.horizontalHeader().setMinimumSectionSize(25)
        self.result_out.verticalHeader().setDefaultSectionSize(30)

        self.pushButton_2 = QPushButton(self.centralwidget)
        self.pushButton_2.setGeometry(QtCore.QRect(675, 390, 75, 21))
        self.pushButton_2.setObjectName("pushButton_2")
        self.pushButton_2.clicked.connect(self.p2_clicked)
        MainWindow.setCentralWidget(self.centralwidget)

        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 509, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)

        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def p2_clicked(self):
        self.pyqt_clicked1.emit()

    def find_btn(self):
        self.pyqt_clicked2.emit()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
        self.check_sid.setText(_translate("MainWindow", "学号", None))
        # self.check_Sage.setText(_translate("MainWindow", "年龄自", None))
        self.check_sname.setText(_translate("MainWindow", "姓名", None))
        self.check_sgender.setText(_translate("MainWindow", "性别", None))
        # self.label.setText(_translate("MainWindow", "到", None))
        self.check_sdept.setText(_translate("MainWindow", "方向", None))
        self.check_sclass.setText(_translate("MainWindow", "班级", None))
        self.find.setText(_translate("MainWindow", "查询", None))
        self.sql_out.setText(self.sqlString)

        item = self.result_out.horizontalHeaderItem(0)
        item.setText(_translate("MainWindow", "学号", None))
        item = self.result_out.horizontalHeaderItem(1)
        item.setText(_translate("MainWindow", "姓名", None))
        item = self.result_out.horizontalHeaderItem(2)
        item.setText(_translate("MainWindow", "性别", None))
        item = self.result_out.horizontalHeaderItem(3)
        item.setText(_translate("MainWindow", "班级", None))
        item = self.result_out.horizontalHeaderItem(4)
        item.setText(_translate("MainWindow", "专业方向", None))
        self.pushButton_2.setText(_translate("MainWindow", "退出", None))

    def mousePressEvent(self, event):
        print(">_<")

    def buttonTest(self):
        temp_sqlstring = self.sqlString
        is_first = True
        if self.check_sid.isChecked():
            mystr = self.sid.text()
            if is_first:
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "sid='" + self.sid.text() + "'"
                else:
                    temp_sqlstring += "sid like'" + self.sid.text() + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and sid = '" + self.sid.text() + "'"
                else:
                    temp_sqlstring += " and sid like '" + self.sid.text() + "'"

        if self.check_sname.isChecked():
            if is_first:
                mystr = self.sname.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "sname = '" + self.sname.text() + "'"
                else:
                    temp_sqlstring += "sname like '" + self.sname.text() + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and sname = '" + self.sname.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and sname like '" + self.sname.text(
                    ) + "'"

        if self.check_sgender.isChecked():
            if is_first:
                is_first = False
                temp_sqlstring += "sgender = '" + self.sgender.text() + "'"
            else:
                temp_sqlstring += " and sgender = '" + self.sgender.text(
                ) + "'"

        if self.check_sclass.isChecked():
            if is_first:
                mystr = self.sclass.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "sclass = '" + self.sclass.text() + "'"
                else:
                    temp_sqlstring += "sclass like '" + self.sclass.text(
                    ) + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and sclass = '" + self.sclass.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and sclass like '" + self.sclass.text(
                    ) + "'"

        if self.check_sdept.isChecked():
            if is_first:
                mystr = self.sdept.text()
                is_first = False
                if mystr.find("%") == -1:
                    temp_sqlstring += "sdept = '" + self.sdept.text() + "'"
                else:
                    temp_sqlstring += "sdept like '" + self.sdept.text() + "'"
            else:
                if mystr.find("%") == -1:
                    temp_sqlstring += " and sdept = '" + self.sdept.text(
                    ) + "'"
                else:
                    temp_sqlstring += " and sdept like '" + self.sdept.text(
                    ) + "'"

        self.result_out.clearContents()

        if not (is_first):
            print(temp_sqlstring)
            self.cur.execute(temp_sqlstring)
            k = 0
            for i in self.cur:
                print("------------", i)
                w = 0
                for j in i:
                    if type(j) == int:
                        newItem = QTableWidgetItem(str(j))
                    else:
                        newItem = QTableWidgetItem(j)
                    self.result_out.setItem(k, w, newItem)
                    w += 1
                k += 1

        self.sql_out.setText("")
        self.sql_out.append(temp_sqlstring)
        print("find button pressed")

    def buttonExit(self):
        self.conn.commit()
        self.cur.close()
        self.conn.close()
        self.close()

    def keyPressEvent(self, e):
        if e.key() == QtCore.Qt.key_Escape:
            self.buttonExit()
Ejemplo n.º 26
0
class GeneralManager(PageWindow):  # Download Normal Video
    def __init__(self):
        super().__init__()
        self.initUI()
        self.BLOCK_SIZE: int = 1024
        self.setWindowTitle("ELITELOADER")

    def initUI(self):
        self.setupUi(self)

    def download(self):
        """ Downloads file and writes with Progressbar"""
        url = data.get('url')
        self.progressBar.setVisible(True)
        self.pushButton.setVisible(False)
        self.label_forSize.setVisible(True)
        self.label_info.setVisible(False)
        self.Title_label.setText("Starting Download..\nPlease wait...")
        try:
            response = requests.get(url, stream=True)
            total = response.headers.get('content-length')
            print('Total_size = ', total)
            with open(data.get('loc'), 'wb') as f:
                self.label_forSize.setText(
                    "FILE SIZE: " + str(round(float(total) *
                                              (0.000001), 3)) + ' MB')
                if total is None:
                    f.write(response.content)
                else:
                    downloaded = 0
                    total = int(total)
                    for datas in response.iter_content(
                            chunk_size=max(int(total / 1000), 1024 * 1024)):
                        downloaded += len(datas)
                        f.write(datas)
                        pct = downloaded / total * 100
                        if downloaded <= total:
                            self.progressBar.setValue(int(pct))
                print('Download Successful !!!')
        except:
            QMessageBox.question(self, "Error", "Download Failed!!",
                                 QMessageBox.Ok)
        exit(0)

    def setupUi(self, general_vidloader):
        """ Sets up UI"""
        general_vidloader.setObjectName("general_vidloader")
        self.centralwidget = QWidget(general_vidloader)
        self.centralwidget.setObjectName("centralwidget")
        self.progressBar = QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QRect(110, 150, 381, 25))
        self.progressBar.setProperty("value", 24)
        self.progressBar.setObjectName("progressBar")
        self.progressBar.setVisible(False)
        self.progressBar.setValue(0)
        self.Title_label = QLabel(self.centralwidget)
        self.Title_label.setGeometry(QRect(170, 10, 261, 51))
        self.label_forSize = QLabel(self.centralwidget)
        self.label_forSize.setGeometry(QRect(220, 200, 180, 41))
        self.label_forSize.setObjectName("label_for_SizeDisplay")
        self.label_forSize.setVisible(False)
        self.Title_label = QLabel(self.centralwidget)
        self.Title_label.setGeometry(QRect(230, 20, 230, 41))
        font = QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.Title_label.setFont(font)
        self.Title_label.setObjectName("Title_label")
        self.label_info = QLabel(self.centralwidget)
        self.label_info.setGeometry(QRect(30, 300, 271, 17))
        self.label_info.setObjectName("label_info")
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QRect(430, 220, 88, 33))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(lambda: self.download())
        general_vidloader.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(general_vidloader)
        self.menubar.setGeometry(QRect(0, 0, 586, 25))
        self.menubar.setObjectName("menubar")
        general_vidloader.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(general_vidloader)
        self.statusbar.setObjectName("statusbar")
        general_vidloader.setStatusBar(self.statusbar)

        self.retranslateUi(general_vidloader)
        QMetaObject.connectSlotsByName(general_vidloader)

    def retranslateUi(self, general_vidloader):
        _translate = QCoreApplication.translate
        general_vidloader.setWindowTitle(
            _translate("general_vidloader", "Video downloader - ELITELOADER"))
        self.Title_label.setText(
            _translate("general_vidloader", "Continue.. ?"))
        self.label_info.setText(
            _translate("general_vidloader",
                       "*save file with reqd. name and extension"))
        self.pushButton.setText(_translate("general_vidloader", "Download"))
        self.label_forSize.setText(_translate("ELITE", "SIZE:"))
Ejemplo n.º 27
0
class Ui_MainWindows(object):
    def setupUi(self, MainWindows):
        MainWindows.setObjectName("MainWindows")
        MainWindows.resize(800, 506)
        self.centralwidget = QWidget(MainWindows)
        self.centralwidget.setObjectName("centralwidget")
        self.plot = QGraphicsView(self.centralwidget)
        self.plot.setGeometry(QRect(135, 0, 671, 461))
        self.plot.setObjectName("plot")
        self.open = QPushButton(self.centralwidget)
        self.open.setGeometry(QRect(30, 210, 75, 23))
        self.open.setObjectName("open")
        self.closebtn = QPushButton(self.centralwidget)
        self.closebtn.setGeometry(QRect(30, 260, 75, 23))
        self.closebtn.setObjectName("close")
        self.COM = QComboBox(self.centralwidget)
        self.COM.setGeometry(QRect(10, 50, 111, 22))
        self.COM.setObjectName("COM")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COM.addItem("")
        self.COMlable = QLabel(self.centralwidget)
        self.COMlable.setGeometry(QRect(10, 30, 54, 12))
        self.COMlable.setObjectName("COMlable")
        self.baud = QLineEdit(self.centralwidget)
        self.baud.setGeometry(QRect(10, 140, 113, 20))
        self.baud.setObjectName("baud")
        self.baudlable = QLabel(self.centralwidget)
        self.baudlable.setGeometry(QRect(10, 120, 54, 12))
        self.baudlable.setObjectName("baudlable")
        self.output = QTextBrowser(self.centralwidget)
        self.output.setGeometry(QRect(10, 380, 111, 81))
        self.output.setObjectName("output")
        self.outputlabel = QLabel(self.centralwidget)
        self.outputlabel.setGeometry(QRect(10, 350, 54, 12))
        self.outputlabel.setObjectName("outputlabel")
        MainWindows.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindows)
        self.menubar.setGeometry(QRect(0, 0, 800, 23))
        self.menubar.setObjectName("menubar")
        MainWindows.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindows)
        self.statusbar.setObjectName("statusbar")
        MainWindows.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindows)
        QMetaObject.connectSlotsByName(MainWindows)

    def retranslateUi(self, MainWindows):
        _translate = QCoreApplication.translate
        MainWindows.setWindowTitle(_translate("MainWindows", "Serial Helper"))
        self.open.setText(_translate("MainWindows", "打开串口"))
        self.closebtn.setText(_translate("MainWindows", "关闭串口"))
        self.COM.setItemText(0, _translate("MainWindows", "COM1"))
        self.COM.setItemText(1, _translate("MainWindows", "COM2"))
        self.COM.setItemText(2, _translate("MainWindows", "COM3"))
        self.COM.setItemText(3, _translate("MainWindows", "COM4"))
        self.COM.setItemText(4, _translate("MainWindows", "COM5"))
        self.COM.setItemText(5, _translate("MainWindows", "COM6"))
        self.COM.setItemText(6, _translate("MainWindows", "COM7"))
        self.COM.setItemText(7, _translate("MainWindows", "COM8"))
        self.COMlable.setText(_translate("MainWindows", "COM口"))
        self.baudlable.setText(_translate("MainWindows", "波特率"))
        self.outputlabel.setText(_translate("MainWindows", "串口输出"))
Ejemplo n.º 28
0
class UiFacebook(PageWindow):  # Facebook UI
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle("FaceBook - ELITELOADER")

    def initUI(self):
        self.setupUi(self)

    def Progressbar_Manager(self, current, total, width):
        pct = (current / total) * 100
        self.progressBar.setValue(int(pct))

    def Download_H(self):  # For High Quality
        ERASE_LINE = '\x1b[2K'
        Location = os_path.join(data.get('loc'))
        try:
            html = requests.get(data.get('url'))
            hdvideo_url = search('hd_src:"(.+?)"', html.text)[1]
        except requests.ConnectionError as e:
            print("OOPS!! Connection Error.")
            return 'Connection Error\n' + 'Check your Internet'
        except requests.Timeout as e:
            print("OOPS!! Timeout Error")
            return 'Network Timeout'
        except requests.RequestException as e:
            print("OOPS!! General Error or Invalid URL")
            return 'General Error or Invalid URL'
        except (KeyboardInterrupt, SystemExit):
            print("Ok ok, quitting")
            exit(1)
        except TypeError:
            print("Video May be Private or Hd version not available")
            return 'Video May Private or Hd version not available'
        else:
            hd_url = hdvideo_url.replace('hd_src:"', '')
            print("\n")
            print("High Quality: " + hd_url)
            print("[+] Video Started Downloading")
            wget.download(hd_url, Location, bar=self.Progressbar_Manager)
            stdout.write(ERASE_LINE)
            print("\n")
            print("Video downloaded")
            return 'Video Downloaded Successfully !!'

    def Download_L(self):  # For Low Quality
        ERASE_LINE = '\x1b[2K'
        Location = os_path.join(data.get('loc'))
        try:
            html = requests.get(data.get('url'))
            sdvideo_url = search('sd_src:"(.+?)"', html.text)[1]
        except requests.ConnectionError as e:
            print("OOPS!! Connection Error.")
            return 'Connection Error\n' + 'Check your Internet'
        except requests.Timeout as e:
            print("OOPS!! Timeout Error")
            return 'Network Timeout'
        except requests.RequestException as e:
            print("OOPS!! General Error or Invalid URL")
            return 'General Error or Invalid URL'
        except (KeyboardInterrupt, SystemExit):
            print("Ok ok, quitting")
            exit(1)
        except TypeError:
            print("Video May Private or Invalid URL")
            return 'Video May be Private or Invalid URL'
        else:
            sd_url = sdvideo_url.replace('sd_src:"', '')
            print("\n")
            print("Normal Quality: " + sd_url)
            print("[+] Video Started Downloading")
            wget.download(sd_url, Location, bar=self.Progressbar_Manager)
            stdout.write(ERASE_LINE)
            print("\n")
            print("Video downloaded")
            return 'Video Downloaded Successfully !!'

    def Selector(self):
        """ Identifies which Quality is reqd."""
        if self.HighQual_radioButton.isChecked():
            print('HQ selected--fwding to manager')
            self.groupBox_forQuality.setVisible(False)
            self.pushButton.setVisible(False)
            self.label.setText('PLEASE WAIT..\nSTARTING DOWNLOAD...')
            sgs = QFileDialog.getExistingDirectory()
            print(sgs)
            data.add('loc', sgs)
            self.progressBar.setVisible(True)
            print(data)
            msg = self.Download_H()
            QMessageBox.question(self, 'ELITE', msg, QMessageBox.Ok)
            exit(0)

        if self.LowQual_radioButton.isChecked():
            print('LQ selected--fwding to manager')
            self.groupBox_forQuality.setVisible(False)
            self.pushButton.setVisible(False)
            self.label.setText('PLEASE WAIT..\nSTARTING DOWNLOAD...')
            sgs = QFileDialog.getExistingDirectory()
            print(sgs)
            data.add('loc', sgs)
            self.progressBar.setVisible(True)
            print(data)
            msg = self.Download_L()
            QMessageBox.question(self, 'ELITE', msg, QMessageBox.Ok)
            exit(0)

    def setupUi(self, facebook_dwn):
        facebook_dwn.setObjectName("facebook_dwn")
        facebook_dwn.resize(586, 379)
        self.centralwidget = QWidget(facebook_dwn)
        self.centralwidget.setObjectName("centralwidget")
        self.label = QLabel(self.centralwidget)
        self.label.setGeometry(QRect(220, 10, 250, 61))
        font = QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.label.setFont(font)
        self.label.setObjectName("Title_label")
        self.pushButton = QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QRect(460, 290, 88, 33))
        self.pushButton.setObjectName("pushButton")
        self.pushButton.clicked.connect(lambda: self.Selector())
        self.groupBox_forQuality = QGroupBox(self.centralwidget)
        self.groupBox_forQuality.setGeometry(QRect(200, 90, 141, 111))
        self.groupBox_forQuality.setObjectName("groupBox_for_videoFormats")
        self.HighQual_radioButton = QRadioButton(self.groupBox_forQuality)
        self.HighQual_radioButton.setGeometry(QRect(20, 30, 104, 23))
        self.HighQual_radioButton.setObjectName("mp4_radioButton")
        self.LowQual_radioButton = QRadioButton(self.groupBox_forQuality)
        self.LowQual_radioButton.setGeometry(QRect(20, 60, 104, 23))
        self.LowQual_radioButton.setObjectName("webm_radioButton")
        self.progressBar = QProgressBar(self.centralwidget)
        self.progressBar.setGeometry(QRect(110, 180, 391, 23))
        self.progressBar.setProperty("value", 0)
        self.progressBar.setObjectName("progressBar")
        self.progressBar.setVisible(False)
        facebook_dwn.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(facebook_dwn)
        self.menubar.setGeometry(QRect(0, 0, 586, 25))
        self.menubar.setObjectName("menubar")
        facebook_dwn.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(facebook_dwn)
        self.statusbar.setObjectName("statusbar")
        facebook_dwn.setStatusBar(self.statusbar)

        self.retranslateUi(facebook_dwn)
        QMetaObject.connectSlotsByName(facebook_dwn)

    def retranslateUi(self, facebook_dwn):
        _translate = QCoreApplication.translate
        facebook_dwn.setWindowTitle(
            _translate("facebook_dwn", "Facebook Video Download-ELITELOADER"))
        self.label.setText(_translate("facebook_dwn", "Select  Quality"))
        self.pushButton.setText(_translate("facebook_dwn", "Proceed"))
        self.groupBox_forQuality.setTitle(_translate("facebook_dwn",
                                                     "Quality"))
        self.HighQual_radioButton.setText(
            _translate("facebook_dwn", "High Quality"))
        self.LowQual_radioButton.setText(
            _translate("facebook_dwn", "Low Quality"))
Ejemplo n.º 29
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(460, 606)
        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.timer = QLabel(self.centralwidget)
        self.timer.setGeometry(QRect(170, 420, 104, 32))
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.timer.setFont(font)
        self.timer.setObjectName("timer")
        self.layoutWidget = QWidget(self.centralwidget)
        self.layoutWidget.setGeometry(QRect(10, 10, 424, 397))
        self.layoutWidget.setObjectName("layoutWidget")
        self.gridLayout = QGridLayout(self.layoutWidget)
        self.gridLayout.setContentsMargins(0, 0, 0, 0)
        self.gridLayout.setObjectName("gridLayout")
        self.label_0 = QLabel(self.layoutWidget)
        self.label_0.setText("")
        self.label_0.setPixmap(QPixmap("../ui/bob_0.png"))
        self.label_0.setObjectName("label_0")
        self.gridLayout.addWidget(self.label_0, 0, 0, 1, 1)
        self.label_1 = QLabel(self.layoutWidget)
        self.label_1.setText("")
        self.label_1.setPixmap(QPixmap("../ui/bob_1.png"))
        self.label_1.setObjectName("label_1")
        self.gridLayout.addWidget(self.label_1, 0, 1, 1, 1)
        self.label_2 = QLabel(self.layoutWidget)
        self.label_2.setText("")
        self.label_2.setPixmap(QPixmap("../ui/bob_2.png"))
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 0, 2, 1, 1)
        self.label_3 = QLabel(self.layoutWidget)
        self.label_3.setText("")
        self.label_3.setPixmap(QPixmap("../ui/bob_3.png"))
        self.label_3.setObjectName("label_3")
        self.gridLayout.addWidget(self.label_3, 1, 0, 1, 1)
        self.label_4 = QLabel(self.layoutWidget)
        self.label_4.setText("")
        self.label_4.setPixmap(QPixmap("../ui/bob_4.png"))
        self.label_4.setObjectName("label_4")
        self.gridLayout.addWidget(self.label_4, 1, 1, 1, 1)
        self.label_5 = QLabel(self.layoutWidget)
        self.label_5.setText("")
        self.label_5.setPixmap(QPixmap("../ui/bob_5.png"))
        self.label_5.setObjectName("label_5")
        self.gridLayout.addWidget(self.label_5, 1, 2, 1, 1)
        self.label_6 = QLabel(self.layoutWidget)
        self.label_6.setText("")
        self.label_6.setPixmap(QPixmap("../ui/bob_6.png"))
        self.label_6.setObjectName("label_6")
        self.gridLayout.addWidget(self.label_6, 2, 0, 1, 1)
        self.label_7 = QLabel(self.layoutWidget)
        self.label_7.setText("")
        self.label_7.setPixmap(QPixmap("../ui/bob_7.png"))
        self.label_7.setObjectName("label_7")
        self.gridLayout.addWidget(self.label_7, 2, 1, 1, 1)
        self.label_8 = QLabel(self.layoutWidget)
        self.label_8.setText("")
        self.label_8.setPixmap(QPixmap("../ui/bob_8.png"))
        self.label_8.setObjectName("label_8")
        self.gridLayout.addWidget(self.label_8, 2, 2, 1, 1)
        self.layoutWidget1 = QWidget(self.centralwidget)
        self.layoutWidget1.setGeometry(QRect(10, 420, 195, 34))
        self.layoutWidget1.setObjectName("layoutWidget1")
        self.horizontalLayout = QHBoxLayout(self.layoutWidget1)
        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.counter = QLabel(self.layoutWidget1)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.counter.setFont(font)
        self.counter.setObjectName("counter")
        self.horizontalLayout.addWidget(self.counter)
        self.level = QLabel(self.centralwidget)
        self.level.setGeometry(QRect(310, 420, 151, 31))
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.level.setFont(font)
        self.level.setObjectName("level")
        self.layoutWidget2 = QWidget(self.centralwidget)
        self.layoutWidget2.setGeometry(QRect(260, 470, 171, 101))
        self.layoutWidget2.setObjectName("layoutWidget2")
        self.gridLayout_2 = QGridLayout(self.layoutWidget2)
        self.gridLayout_2.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.U = QPushButton(self.layoutWidget2)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(22)
        self.U.setFont(font)
        self.U.setObjectName("U")
        self.gridLayout_2.addWidget(self.U, 0, 1, 1, 1)
        self.L = QPushButton(self.layoutWidget2)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(22)
        self.L.setFont(font)
        self.L.setObjectName("L")
        self.gridLayout_2.addWidget(self.L, 1, 0, 1, 1)
        self.D = QPushButton(self.layoutWidget2)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(22)
        self.D.setFont(font)
        self.D.setObjectName("D")
        self.gridLayout_2.addWidget(self.D, 1, 1, 1, 1)
        self.R = QPushButton(self.layoutWidget2)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(22)
        self.R.setFont(font)
        self.R.setObjectName("R")
        self.gridLayout_2.addWidget(self.R, 1, 2, 1, 1)
        self.layoutWidget3 = QWidget(self.centralwidget)
        self.layoutWidget3.setGeometry(QRect(10, 460, 241, 121))
        self.layoutWidget3.setObjectName("layoutWidget3")
        self.gridLayout_3 = QGridLayout(self.layoutWidget3)
        self.gridLayout_3.setContentsMargins(0, 0, 0, 0)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.start = QPushButton(self.layoutWidget3)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.start.setFont(font)
        self.start.setObjectName("start")
        self.gridLayout_3.addWidget(self.start, 0, 0, 1, 1)
        self.reset = QPushButton(self.layoutWidget3)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.reset.setFont(font)
        self.reset.setObjectName("reset")
        self.gridLayout_3.addWidget(self.reset, 0, 1, 1, 1)
        self.setting = QPushButton(self.layoutWidget3)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.setting.setFont(font)
        self.setting.setObjectName("setting")
        self.gridLayout_3.addWidget(self.setting, 1, 0, 1, 1)
        self.file = QPushButton(self.layoutWidget3)
        font = QFont()
        font.setFamily(".PingFang SC0")
        font.setPointSize(14)
        self.file.setFont(font)
        self.file.setObjectName("file")
        self.gridLayout_3.addWidget(self.file, 1, 1, 1, 1)
        self.start.raise_()
        self.reset.raise_()
        self.file.raise_()
        self.setting.raise_()
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "拼图小游戏"))
        self.timer.setText(_translate("MainWindow", "用时 0"))
        self.counter.setText(_translate("MainWindow", "步数 0"))
        self.level.setText(_translate("MainWindow", "关数"))
        self.U.setText(_translate("MainWindow", "U"))
        self.L.setText(_translate("MainWindow", "L"))
        self.D.setText(_translate("MainWindow", "D"))
        self.R.setText(_translate("MainWindow", "R"))
        self.start.setText(_translate("MainWindow", "开始"))
        self.reset.setText(_translate("MainWindow", "重置"))
        self.setting.setText(_translate("MainWindow", "设置"))
        self.file.setText(_translate("MainWindow", "文件"))
Ejemplo n.º 30
0
class UiStartPage(PageWindow):  # Starting Page UI
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle("ELITELOADER")

    def initUI(self):
        self.setupUi(self)

    def ping(self):
        """ Pings youtube Streams"""
        data.add('url', self.url_txtbox.text())
        obj = UiYoutube.YoutubeManager()
        print('Please Wait..')
        QMessageBox.question(self, 'ELITE', 'It takes a while, please wait..',
                             QMessageBox.Ok)
        streams = UiYoutube.YoutubeManager.ping(obj)
        if isinstance(streams, list):
            Mstream = ""
            for i in streams:
                Mstream += str(i) + '\n'
            QMessageBox.question(self, 'Streams', Mstream, QMessageBox.Ok)
            print(streams)
        if isinstance(streams, str):
            QMessageBox.question(self, 'ELITE', streams, QMessageBox.Ok)

    def TypeFinder(self):
        """ Identfies URL and calls resective pages"""
        print(self.url_txtbox.text(),
              'All clear @ main page after getting link')
        data.add('url', self.url_txtbox.text())
        URl = self.url_txtbox.text()
        if URl != '':
            try:
                partition = URl.split('/')
                type = partition[2]
            except:
                QMessageBox.question(self, "ELITE_ERROR", 'Invalid URL !!!')
                exit(0)
            if type == 'www.youtube.com':
                print("Youtube link is found -> fwding to youtube page ")
                self.goto("Youtube")
            elif type == 'youtu.be':
                print("Youtube link is found -> fwding to youtube page ")
                self.goto("Youtube")
            elif type == 'www.facebook.com':
                print("facebook link is found -> forwarding to fb page ")
                self.goto("fb_setup")
            elif type == 'www.instagram.com':
                sg = QFileDialog.getSaveFileName(self)
                data.add('loc', sg[0])
                print("instagram link is found -> forwarding to insta page ")
                self.goto("insta")
            else:
                sg = QFileDialog.getSaveFileName(self)
                data.add('loc', sg[0])
                print(data, 'Before General manage call')
                self.goto("general")

    def setupUi(self, StartPage_Url):
        StartPage_Url.setObjectName("StartPage_Url")
        self.centralwidget = QWidget(StartPage_Url)
        self.centralwidget.setObjectName("centralwidget")
        self.btn_go = QPushButton(self.centralwidget)
        self.btn_go.setGeometry(QRect(250, 150, 88, 33))
        self.btn_go.setObjectName("btn_go")
        self.btn_go.clicked.connect(lambda: self.TypeFinder())
        self.L_Heading = QLabel(self.centralwidget)
        self.L_Heading.setGeometry(QRect(120, 20, 331, 20))
        font = QFont()
        font.setPointSize(14)
        font.setBold(True)
        font.setItalic(True)
        font.setWeight(75)
        self.L_Heading.setFont(font)
        self.L_Heading.setLayoutDirection(Qt.LeftToRight)
        self.L_Heading.setAutoFillBackground(True)
        self.L_Heading.setObjectName("L_Heading")
        self.groupBox = QGroupBox(self.centralwidget)
        self.groupBox.setGeometry(QRect(20, 200, 231, 111))
        self.groupBox.setObjectName("groupBox_for_typeSelection")
        self.label = QLabel(self.groupBox)
        self.label.setGeometry(QRect(40, 20, 111, 17))
        self.label.setObjectName("Title_label")
        self.label_2 = QLabel(self.groupBox)
        self.label_2.setGeometry(QRect(40, 40, 121, 17))
        self.label_2.setObjectName("label_info")
        self.label_5 = QLabel(self.groupBox)
        self.label_5.setGeometry(QRect(40, 60, 141, 20))
        self.label_5.setObjectName("label_5")
        self.label_3 = QLabel(self.groupBox)
        self.label_3.setGeometry(QRect(40, 80, 141, 20))
        self.label_3.setObjectName("label_3")
        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setGeometry(QRect(200, 310, 451, 20))
        self.label_4.setObjectName("label_info")
        self.url_txtbox = QLineEdit(self.centralwidget)
        self.url_txtbox.setGeometry(QRect(72, 70, 431, 33))
        self.url_txtbox.setObjectName("url_txtbox")
        self.url_txtbox.returnPressed.connect(self.TypeFinder)
        StartPage_Url.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(StartPage_Url)
        self.menubar.setGeometry(QRect(0, 0, 586, 25))
        self.menubar.setObjectName("menubar")
        self.menuAbout = QMenu(self.menubar)
        self.menuAbout.setObjectName("menuAbout")
        self.about_opt = QMenu(self.menubar)
        self.about_opt.setObjectName("about_opt")
        StartPage_Url.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(StartPage_Url)
        self.statusbar.setObjectName("statusbar")
        StartPage_Url.setStatusBar(self.statusbar)
        self.pings = QAction(StartPage_Url)
        self.pings.setObjectName("pings")
        self.menuAbout.addAction(self.pings)
        self.pings.triggered.connect(lambda: self.ping())
        self.menubar.addAction(self.menuAbout.menuAction())
        self.retranslateUi(StartPage_Url)
        QMetaObject.connectSlotsByName(StartPage_Url)

    def retranslateUi(self, StartPage_Url):
        _translate = QCoreApplication.translate
        StartPage_Url.setWindowTitle(_translate("StartPage_Url",
                                                "ELITELOADER"))
        self.btn_go.setText(_translate("StartPage_Url", "Go"))
        self.L_Heading.setText(
            _translate("StartPage_Url", "General purpose video downloader"))
        self.groupBox.setTitle(
            _translate("StartPage_Url", "Downloadable Items"))
        self.label.setText(_translate("StartPage_Url", "# Youtube videos"))
        self.label_2.setText(_translate("StartPage_Url", "# Facebook videos"))
        self.label_5.setText(_translate("StartPage_Url", "# Instagram videos"))
        self.label_3.setText(
            _translate("StartPage_Url", "# Mp4 with source url"))
        self.label_4.setText(
            _translate(
                "StartPage_Url",
                "*This app auto detects the url type and proceeds accordingly")
        )
        self.menuAbout.setTitle(
            _translate("StartPage_Url", "Available streams"))
        self.about_opt.setTitle(_translate("StartPage_Url", "About"))
        self.pings.setText(_translate("StartPage_Url", "Ping Youtube Streams"))
Ejemplo n.º 31
0
class listAdminUI(QMainWindow):
    def __init__(self, parent=None):
        super(listAdminUI, self).__init__(parent)
        self.resize(900, 700)
        self.setupUi()
       
    def setupUi(self):     
        self.setObjectName("MainWindow")  
        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        
        self.tableWidget = QTableWidget(self.centralwidget)
        self.tableWidget.setGeometry(QtCore.QRect(30, 50, 810, 520))
        self.tableWidget.setRowCount(50)
        self.tableWidget.setColumnCount(7)
        self.tableWidget.setObjectName("tableWidget")
        self.tableWidget.setHorizontalHeaderLabels(["Id Admin", "Id Role", "Nama Pengguna",  "Kata Sandi", "Nama Lengkap", "Dibuat Oleh", "Dibuat Tanggal"])
        self.tableWidget.setEditTriggers(QTreeView.NoEditTriggers)
        self.tableWidget.setStyleSheet("background-color:#ECEBE4") 
        data_df = self.load_data()
        for data in data_df:
            self.tableWidget.setItem(data[0],data[1], data[2])

        #self.tableWidget.setEditTriggers(QAbstractItemView.CurrentChanged)
        self.btnHapus = QPushButton(self.centralwidget)
        self.btnHapus.setGeometry(QtCore.QRect(28, 600, 90, 30)) 
        self.btnHapus.setObjectName("btnHapus")
        self.setCentralWidget(self.centralwidget)
        self.btnHapus.clicked.connect(self.hapus)
        
        self.btnEdit = QPushButton(self.centralwidget)
        self.btnEdit.setGeometry(QtCore.QRect(650, 600, 90, 30))
        self.btnEdit.setStyleSheet("background-color:#4DAE4E")  
        self.btnEdit.setObjectName("btnEdit")
        self.setCentralWidget(self.centralwidget)
        self.btnEdit.clicked.connect(self.editData)
                
        self.btnKembali = QPushButton(self.centralwidget)
        self.btnKembali.setGeometry(QtCore.QRect(750, 600, 90, 30))
        self.btnKembali.setStyleSheet("background-color:#3498DB")  
        self.btnKembali.setObjectName("btnKembali")
        self.setCentralWidget(self.centralwidget)
        self.btnKembali.clicked.connect(self.kembali)
       
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.retranslateUi()  
        QMetaObject.connectSlotsByName(self)

    def retranslateUi(self):
        _translate = QCoreApplication.translate
        self.setWindowTitle(_translate("MainWindow", "list Admin"))
        self.btnKembali.setText(_translate("MainWindow", "Kembali"))
        self.btnHapus.setText(_translate("MainWindow", "Hapus"))
        self.btnEdit.setText(_translate("MainWindow", "Ubah"))
        
        """       
    def _removerow(self):
        row = self.tableWidget.currentRow()
        '''query = 
        "DELETE FROM  WHERE  = ?"
        cur.execute(query, (item,customerId,date,qty))
        con.commit()
        '''
        self.tableWidget.removeRow(row)
        print("Berhasil Hapus!")
        """

    def load_data(self):
        model= mUser()
        data = model.getData("setup_admin", "ORDER BY id_admin")
        key_data = list(data.keys())
        len_data = len(data[key_data[0]])
        data_return = []
        for row in range(len_data):
            for col in range(len(key_data)):
                value = QTableWidgetItem(str(data[key_data[col]][row]))
                data_return.append((row, col, value))
            
        return data_return

    def editData(self,obj):
        if self.tableWidget.currentIndex().row() > -1:
            index=(self.tableWidget.selectionModel().currentIndex())
            #print(index)
            self.value=index.sibling(index.row(),0).data()
            if(self.value == None):
                QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok)
            else:
                dash = cListAdmin.cListAdmin()
                dash.editData(self)
            #print(value)
        else:
             QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok)
             self.show()

    def hapus(self):
        if self.tableWidget.currentIndex().row() > -1:
            index=(self.tableWidget.selectionModel().currentIndex())
            self.value=index.sibling(index.row(),0).data()
            if(self.value == None):
                QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok)
            else:
                hps = QMessageBox.question(self,'Message', "Hapus Data?", QMessageBox.Yes | QMessageBox.No,QMessageBox.No)
                if(hps == QMessageBox.Yes):
                    dash = cListAdmin.cListAdmin()
                    dash.hapusData(self)
            #print(value)
        else:
             QMessageBox.question(self,'Message', "Pilih baris yang akan dihapus!", QMessageBox.Ok)
             self.show()

    def kembali(self):
        dash = cListAdmin.cListAdmin()
        dash.gotodash(self)
Ejemplo n.º 32
0
class Ui_MainWindow(object):
    def setupUi(self, MainWindow, url):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(576, 117)

        MainWindow.setWindowFlags(MainWindow.windowFlags()
                                  | Qt.WindowStaysOnTopHint)
        MainWindow.setWindowIcon(QIcon(Icons["Download"]))

        self.MainWindow = MainWindow
        self.url = url

        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.progressBar = QProgressBar(self.centralwidget, minimumWidth=400)
        self.progressBar.setGeometry(QRect(30, 50, 531, 31))
        self.progressBar.setMinimumSize(QSize(531, 31))
        self.progressBar.setMaximumSize(QSize(531, 31))
        self.progressBar.setValue(0)
        self.progressBar.setObjectName("progressBar")
        self.label = QLabel(self.centralwidget)
        self.label.setGeometry(QRect(10, 20, 250, 16))
        self.label.setObjectName("label")
        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QRect(0, 0, 576, 26))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)

        self.on_pushButton_clicked()

        # Download button event
    def on_pushButton_clicked(self):
        the_url = self.url
        the_filesize = requests.get(the_url,
                                    stream=True).headers['Content-Length']
        self.the_filepath = os.getcwd() + "\\" + self.url.split(chr(47))[-1]
        the_fileobj = open(self.the_filepath, 'wb')
        #### Create a download thread
        self.downloadThread = downloadThread(the_url,
                                             the_filesize,
                                             the_fileobj,
                                             buffer=10240)
        self.downloadThread.download_proess_signal.connect(
            self.set_progressbar_value)
        self.downloadThread.start()

    def set_progressbar_value(self, value):
        self.progressBar.setValue(value)
        if value == 100:
            try:
                os.remove("\\".join(self.the_filepath.split("\\")[:-1]) +
                          "\\chromedriver.exe")
            except FileNotFoundError:
                pass
            with zipfile.ZipFile(self.the_filepath, 'r') as zip_ref:
                zip_ref.extractall(os.getcwd() + "\\")
            self.MainWindow.close()
            os.remove(self.the_filepath)
            warnMessage(
                "Bilgi", QMessageBox.Information,
                "Gerekli dosyalar yüklendi, programı kullanabilirsiniz.")

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        MainWindow.setWindowTitle(
            _translate("MainWindow", "Wp Auto Message Sender - Sürücü"))
        self.label.setText(
            _translate("MainWindow", "Gerekli sürücüler indiriliyor..."))
Ejemplo n.º 33
0
Archivo: app.py Proyecto: iGio90/Dwarf
class AppWindow(QMainWindow):
    onRestart = pyqtSignal(name='onRestart')
    onSystemUIElementCreated = pyqtSignal(str,
                                          QWidget,
                                          name='onSystemUIElementCreated')
    onSystemUIElementRemoved = pyqtSignal(str, name='onSystemUIElementRemoved')
    switchTabRequest = pyqtSignal(str)

    def __init__(self, dwarf_args, flags=None):
        super(AppWindow, self).__init__(flags)

        self.dwarf_args = dwarf_args

        self.session_manager = SessionManager(self)
        self.session_manager.sessionCreated.connect(self.session_created)
        self.session_manager.sessionStopped.connect(self.session_stopped)
        self.session_manager.sessionClosed.connect(self.session_closed)

        self._tab_order = [
            'debug', 'modules', 'ranges', 'jvm-inspector', 'jvm-debugger'
        ]

        self._is_newer_dwarf = False
        self.q_settings = QSettings(utils.home_path() + "dwarf_window_pos.ini",
                                    QSettings.IniFormat)

        self.menu = self.menuBar()
        self.view_menu = None

        # dockwidgets
        self.watchpoints_dwidget = None
        self.breakpoint_dwiget = None
        self.bookmarks_dwiget = None
        self.registers_dock = None
        self.console_dock = None
        self.backtrace_dock = None
        self.threads_dock = None
        # panels
        self.asm_panel = None
        self.backtrace_panel = None
        self.bookmarks_panel = None
        self.console_panel = None
        self.context_panel = None
        self.debug_panel = None
        self.contexts_list_panel = None
        self.data_panel = None
        self.ftrace_panel = None
        self.breakpoints_panel = None
        self.objc_inspector_panel = None
        self.java_inspector_panel = None
        self.java_explorer_panel = None
        self.java_trace_panel = None
        self.modules_panel = None
        self.ranges_panel = None
        self.search_panel = None
        self.smali_panel = None
        self.watchpoints_panel = None

        self._ui_elems = []

        self.setWindowTitle(
            'Dwarf - A debugger for reverse engineers, crackers and security analyst'
        )

        # load external assets
        _app = QApplication.instance()

        # themes
        self.prefs = Prefs()
        utils.set_theme(self.prefs.get('dwarf_ui_theme', 'dark'), self.prefs)

        # load font
        if os.path.exists(utils.resource_path('assets/Anton.ttf')):
            QFontDatabase.addApplicationFont(
                utils.resource_path('assets/Anton.ttf'))
        else:
            QFontDatabase.addApplicationFont(':/assets/Anton.ttf')

        if os.path.exists(utils.resource_path('assets/OpenSans-Regular.ttf')):
            QFontDatabase.addApplicationFont(
                utils.resource_path('assets/OpenSans-Regular.ttf'))
        else:
            QFontDatabase.addApplicationFont(':/assets/OpenSans-Regular.ttf')

        if os.path.exists(utils.resource_path('assets/OpenSans-Bold.ttf')):
            QFontDatabase.addApplicationFont(
                utils.resource_path('assets/OpenSans-Bold.ttf'))
        else:
            QFontDatabase.addApplicationFont(':/assets/OpenSans-Bold.ttf')

        font = QFont("OpenSans", 9, QFont.Normal)
        # TODO: add settingsdlg
        font_size = self.prefs.get('dwarf_ui_font_size', 12)
        font.setPixelSize(font_size)
        _app.setFont(font)

        # mainwindow statusbar
        self.progressbar = QProgressBar()
        self.progressbar.setRange(0, 0)
        self.progressbar.setVisible(False)
        self.progressbar.setFixedHeight(15)
        self.progressbar.setFixedWidth(100)
        self.progressbar.setTextVisible(False)
        self.progressbar.setValue(30)
        self.statusbar = QStatusBar(self)
        self.statusbar.setAutoFillBackground(False)
        self.statusbar.addPermanentWidget(self.progressbar)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        self.main_tabs = QTabWidget(self)
        self.main_tabs.setMovable(False)
        self.main_tabs.setTabsClosable(True)
        self.main_tabs.setAutoFillBackground(True)
        self.main_tabs.tabCloseRequested.connect(self._on_close_tab)
        self.setCentralWidget(self.main_tabs)

        # pluginmanager
        self.plugin_manager = PluginManager(self)
        self.plugin_manager.reload_plugins()

        self.welcome_window = None
        if dwarf_args.any == '':
            self.welcome_window = WelcomeDialog(self)
            self.welcome_window.setModal(True)
            self.welcome_window.onIsNewerVersion.connect(
                self._enable_update_menu)
            self.welcome_window.onUpdateComplete.connect(
                self._on_dwarf_updated)
            self.welcome_window.setWindowTitle(
                'Welcome to Dwarf - A debugger for reverse engineers, crackers and security analyst'
            )
            self.welcome_window.onSessionSelected.connect(self._start_session)
            # wait for welcome screen
            self.hide()
            self.welcome_window.show()
        else:
            print('* Starting new Session')
            self._start_session(dwarf_args.target)

    def _initialize_ui_elements(self):
        # dockwidgets
        self.watchpoints_dwidget = None
        self.breakpoint_dwiget = None
        self.bookmarks_dwiget = None
        self.registers_dock = None
        self.console_dock = None
        self.backtrace_dock = None
        self.threads_dock = None
        # panels
        self.asm_panel = None
        self.backtrace_panel = None
        self.bookmarks_panel = None
        self.console_panel = None
        self.context_panel = None
        self.debug_panel = None
        self.contexts_list_panel = None
        self.data_panel = None
        self.ftrace_panel = None
        self.breakpoints_panel = None
        self.objc_inspector_panel = None
        self.java_inspector_panel = None
        self.java_explorer_panel = None
        self.java_trace_panel = None
        self.modules_panel = None
        self.ranges_panel = None
        self.search_panel = None
        self.smali_panel = None
        self.watchpoints_panel = None

        self._ui_elems = []

    def _setup_main_menu(self):
        self.menu = self.menuBar()
        dwarf_menu = QMenu('Dwarf', self)
        theme = QMenu('Theme', dwarf_menu)
        theme.addAction('Black')
        theme.addAction('Dark')
        theme.addAction('Light')
        theme.triggered.connect(self._set_theme)
        dwarf_menu.addMenu(theme)
        dwarf_menu.addSeparator()

        if self._is_newer_dwarf:
            dwarf_menu.addAction('Update', self._update_dwarf)
        dwarf_menu.addAction('Close', self.close)
        self.menu.addMenu(dwarf_menu)

        session = self.session_manager.session
        if session is not None:
            session_menu = session.main_menu
            if isinstance(session_menu, list):
                for menu in session_menu:
                    self.menu.addMenu(menu)
            else:
                self.menu.addMenu(session_menu)

        # plugins
        if self.plugin_manager.plugins:
            self.plugin_menu = QMenu('Plugins', self)
            for plugin in self.plugin_manager.plugins:
                plugin_instance = self.plugin_manager.plugins[plugin]
                plugin_sub_menu = self.plugin_menu.addMenu(
                    plugin_instance.name)

                try:
                    actions = plugin_instance.__get_top_menu_actions__()
                    for action in actions:
                        plugin_sub_menu.addAction(action)
                except:
                    pass

                if not plugin_sub_menu.isEmpty():
                    plugin_sub_menu.addSeparator()

                about = plugin_sub_menu.addAction('About')
                about.triggered.connect(
                    lambda x, item=plugin: self._show_plugin_about(item))

            if not self.plugin_menu.isEmpty():
                self.menu.addMenu(self.plugin_menu)

        self.view_menu = QMenu('View', self)
        self.panels_menu = QMenu('Panels', self.view_menu)
        self.panels_menu.addAction('Search',
                                   lambda: self.show_main_tab('search'),
                                   shortcut=QKeySequence(Qt.CTRL + Qt.Key_F3))
        self.panels_menu.addAction('Modules',
                                   lambda: self.show_main_tab('modules'))
        self.panels_menu.addAction('Ranges',
                                   lambda: self.show_main_tab('ranges'))

        self.view_menu.addMenu(self.panels_menu)

        self.debug_view_menu = self.view_menu.addMenu('Debug')

        self.view_menu.addSeparator()

        self.view_menu.addAction('Hide all',
                                 self._hide_all_widgets,
                                 shortcut=QKeySequence(Qt.CTRL + Qt.Key_F1))
        self.view_menu.addAction('Show all',
                                 self._show_all_widgets,
                                 shortcut=QKeySequence(Qt.CTRL + Qt.Key_F2))

        self.view_menu.addSeparator()

        self.menu.addMenu(self.view_menu)

        if self.dwarf_args.debug_script:
            debug_menu = QMenu('Debug', self)
            debug_menu.addAction('Reload core', self._menu_reload_core)
            debug_menu.addAction('Debug dwarf js core',
                                 self._menu_debug_dwarf_js)
            self.menu.addMenu(debug_menu)

        # tools
        _tools = self.prefs.get('tools')
        if _tools:
            tools_menu = QMenu('Tools', self)

            for _tool in _tools:
                if _tool and _tool['name']:
                    if _tool['name'] == 'sep':
                        tools_menu.addSeparator()
                        continue

                    _cmd = _tool['cmd']

                    tools_menu.addAction(_tool['name'])

            if not tools_menu.isEmpty():
                tools_menu.triggered.connect(self._execute_tool)
                self.menu.addMenu(tools_menu)

        about_menu = QMenu('About', self)
        about_menu.addAction('Dwarf on GitHub', self._menu_github)
        about_menu.addAction('Documention', self._menu_documentation)
        about_menu.addAction('Api', self._menu_api)
        about_menu.addAction('Slack', self._menu_slack)
        about_menu.addSeparator()

        about_menu.addAction('Info', self._show_about_dlg)
        self.menu.addMenu(about_menu)

    def _show_plugin_about(self, plugin):
        plugin = self.plugin_manager.plugins[plugin]
        if plugin:
            info = plugin.__get_plugin_info__()

            version = utils.safe_read_map(info, 'version', '')
            description = utils.safe_read_map(info, 'description', '')
            author = utils.safe_read_map(info, 'author', '')
            homepage = utils.safe_read_map(info, 'homepage', '')
            license_ = utils.safe_read_map(info, 'license', '')

            utils.show_message_box(
                'Name: {0}\nVersion: {1}\nDescription: {2}\nAuthor: {3}\nHomepage: {4}\nLicense: {5}'
                .format(plugin.name, version, description, author, homepage,
                        license_))

    def _enable_update_menu(self):
        self._is_newer_dwarf = True

    def _update_dwarf(self):
        if self.welcome_window:
            self.welcome_window._update_dwarf()

    def _on_close_tab(self, index):
        tab_text = self.main_tabs.tabText(index)
        if tab_text:
            tab_text = tab_text.lower().replace(' ', '-')
            try:
                self._ui_elems.remove(tab_text)
            except ValueError:  # recheck ValueError: list.remove(x): x not in list
                pass
            self.main_tabs.removeTab(index)

            self.onSystemUIElementRemoved.emit(tab_text)

    def _on_dwarf_updated(self):
        self.onRestart.emit()

    def _execute_tool(self, qaction):
        if qaction:
            _tools = self.prefs.get('tools')
            if _tools:
                for _tool in _tools:
                    if _tool and _tool['name'] and _tool['name'] != 'sep':
                        if qaction.text() == _tool['name']:
                            try:
                                import subprocess
                                subprocess.Popen(_tool['cmd'],
                                                 creationflags=subprocess.
                                                 CREATE_NEW_CONSOLE)
                            except:
                                pass
                            break

    def _set_theme(self, qaction):
        if qaction:
            utils.set_theme(qaction.text(), self.prefs)

    def _hide_all_widgets(self):
        self.watchpoints_dwidget.hide()
        self.breakpoint_dwiget.hide()
        self.bookmarks_dwiget.hide()
        self.registers_dock.hide()
        self.console_dock.hide()
        self.backtrace_dock.hide()
        self.threads_dock.hide()

    def _show_all_widgets(self):
        self.watchpoints_dwidget.show()
        self.breakpoint_dwiget.show()
        self.bookmarks_dwiget.show()
        self.registers_dock.show()
        self.console_dock.show()
        self.backtrace_dock.show()
        self.threads_dock.show()

    def _menu_reload_core(self):
        self.dwarf.script.exports.reload()

    def _menu_debug_dwarf_js(self):
        you_know_what_to_do = json.loads(
            self.dwarf.script.exports.debugdwarfjs())
        return you_know_what_to_do

    def show_main_tab(self, name):
        name = name.lower()
        # elem doesnt exists? create it
        if name not in self._ui_elems:
            self._create_ui_elem(name)

        index = 0
        name = name.join(name.split()).lower()
        if name == 'ranges':
            index = self.main_tabs.indexOf(self.ranges_panel)
        elif name == 'search':
            index = self.main_tabs.indexOf(self.search_panel)
        elif name == 'modules':
            index = self.main_tabs.indexOf(self.modules_panel)
        elif name == 'data':
            index = self.main_tabs.indexOf(self.data_panel)
        elif name == 'jvm-tracer':
            index = self.main_tabs.indexOf(self.java_trace_panel)
        elif name == 'jvm-inspector':
            index = self.main_tabs.indexOf(self.java_inspector_panel)
        elif name == 'jvm-debugger':
            index = self.main_tabs.indexOf(self.java_explorer_panel)
        elif name == 'objc-inspector':
            index = self.main_tabs.indexOf(self.objc_inspector_panel)
        elif name == 'smali':
            index = self.main_tabs.indexOf(self.smali_panel)

        self.main_tabs.setCurrentIndex(index)

    def jump_to_address(self, ptr, view=0, show_panel=True):
        if show_panel:
            self.show_main_tab('debug')
        self.debug_panel.jump_to_address(ptr, view=view)

    @pyqtSlot(name='mainMenuGitHub')
    def _menu_github(self):
        QDesktopServices.openUrl(QUrl('https://github.com/iGio90/Dwarf'))

    @pyqtSlot(name='mainMenuApi')
    def _menu_api(self):
        QDesktopServices.openUrl(QUrl('https://igio90.github.io/Dwarf/'))

    @pyqtSlot(name='mainMenuDocumentation')
    def _menu_documentation(self):
        QDesktopServices.openUrl(QUrl('http://www.giovanni-rocca.com/dwarf/'))

    @pyqtSlot(name='mainMenuSlack')
    def _menu_slack(self):
        QDesktopServices.openUrl(
            QUrl('https://join.slack.com/t/resecret/shared_invite'
                 '/enQtMzc1NTg4MzE3NjA1LTlkNzYxNTIwYTc2ZTYyOWY1MT'
                 'Q1NzBiN2ZhYjQwYmY0ZmRhODQ0NDE3NmRmZjFiMmE1MDYwN'
                 'WJlNDVjZDcwNGE'))

    def _show_about_dlg(self):
        about_dlg = AboutDialog(self)
        about_dlg.show()

    def _create_ui_elem(self, elem):
        elem = elem.lower()

        if not isinstance(elem, str):
            return

        if elem not in self._ui_elems:
            self._ui_elems.append(elem)

        elem_wiget = None

        if elem == 'watchpoints':
            from dwarf_debugger.ui.session_widgets.watchpoints import WatchpointsWidget
            self.watchpoints_dwidget = QDockWidget('Watchpoints', self)
            self.watchpoints_panel = WatchpointsWidget(self)
            # dont respond to dblclick mem cant be shown
            # self.watchpoints_panel.onItemDoubleClicked.connect(
            #    self._on_watchpoint_clicked)
            self.watchpoints_panel.onItemRemoved.connect(
                self._on_watchpoint_removeditem)
            self.watchpoints_panel.onItemAdded.connect(
                self._on_watchpoint_added)
            self.watchpoints_dwidget.setWidget(self.watchpoints_panel)
            self.watchpoints_dwidget.setObjectName('WatchpointsWidget')
            self.addDockWidget(Qt.LeftDockWidgetArea, self.watchpoints_dwidget)
            self.view_menu.addAction(
                self.watchpoints_dwidget.toggleViewAction())
            elem_wiget = self.watchpoints_panel
        elif elem == 'breakpoints':
            from dwarf_debugger.ui.session_widgets.breakpoints import BreakpointsWidget
            self.breakpoint_dwiget = QDockWidget('breakpoint', self)
            self.breakpoints_panel = BreakpointsWidget(self)
            self.breakpoints_panel.onBreakpointRemoved.connect(
                self._on_breakpoint_removed)
            self.breakpoint_dwiget.setWidget(self.breakpoints_panel)
            self.breakpoint_dwiget.setObjectName('breakpointWidget')
            self.addDockWidget(Qt.LeftDockWidgetArea, self.breakpoint_dwiget)
            self.view_menu.addAction(self.breakpoint_dwiget.toggleViewAction())
            elem_wiget = self.breakpoints_panel
        elif elem == 'bookmarks':
            from dwarf_debugger.ui.session_widgets.bookmarks import BookmarksWidget
            self.bookmarks_dwiget = QDockWidget('Boomarks', self)
            self.bookmarks_panel = BookmarksWidget(self)
            self.bookmarks_dwiget.setWidget(self.bookmarks_panel)
            self.bookmarks_dwiget.setObjectName('BookmarksWidget')
            self.addDockWidget(Qt.LeftDockWidgetArea, self.bookmarks_dwiget)
            self.view_menu.addAction(self.bookmarks_dwiget.toggleViewAction())
            elem_wiget = self.bookmarks_panel
        elif elem == 'registers':
            from dwarf_debugger.ui.session_widgets.context import ContextWidget
            self.registers_dock = QDockWidget('Context', self)
            self.context_panel = ContextWidget(self)
            self.registers_dock.setWidget(self.context_panel)
            self.registers_dock.setObjectName('ContextWidget')
            self.addDockWidget(Qt.RightDockWidgetArea, self.registers_dock)
            self.view_menu.addAction(self.registers_dock.toggleViewAction())
            elem_wiget = self.context_panel
        elif elem == 'debug':
            from dwarf_debugger.ui.panels.panel_debug import QDebugPanel
            self.debug_panel = QDebugPanel(self)
            self.main_tabs.addTab(self.debug_panel, 'Debug')
            elem_wiget = self.debug_panel
        elif elem == 'jvm-debugger':
            from dwarf_debugger.ui.panels.panel_java_explorer import JavaExplorerPanel
            self.java_explorer_panel = JavaExplorerPanel(self)
            self.main_tabs.addTab(self.java_explorer_panel, 'JVM debugger')
            self.main_tabs.tabBar().moveTab(
                self.main_tabs.indexOf(self.java_explorer_panel), 1)
            elem_wiget = self.java_explorer_panel
        elif elem == 'jvm-inspector':
            from dwarf_debugger.ui.panels.panel_java_inspector import JavaInspector
            self.java_inspector_panel = JavaInspector(self)
            self.main_tabs.addTab(self.java_inspector_panel, 'JVM inspector')
            elem_wiget = self.java_inspector_panel
        elif elem == 'objc-inspector':
            from dwarf_debugger.ui.panels.panel_objc_inspector import ObjCInspector
            self.objc_inspector_panel = ObjCInspector(self)
            self.main_tabs.addTab(self.objc_inspector_panel, 'ObjC inspector')
            elem_wiget = self.objc_inspector_panel
        elif elem == 'console':
            from dwarf_debugger.ui.session_widgets.console import ConsoleWidget
            self.console_dock = QDockWidget('Console', self)
            self.console_panel = ConsoleWidget(self)
            if self.dwarf_args.script and len(
                    self.dwarf_args.script) > 0 and os.path.exists(
                        self.dwarf_args.script):
                with open(self.dwarf_args.script, 'r') as f:
                    self.console_panel.get_js_console(
                    ).script_file = self.dwarf_args.script
                    self.console_panel.get_js_console(
                    ).function_content = f.read()
            self.dwarf.onLogToConsole.connect(self._log_js_output)
            self.dwarf.onLogEvent.connect(self._log_event)
            self.console_dock.setWidget(self.console_panel)
            self.console_dock.setObjectName('ConsoleWidget')
            self.addDockWidget(Qt.BottomDockWidgetArea, self.console_dock)
            self.view_menu.addAction(self.console_dock.toggleViewAction())
            elem_wiget = self.console_panel
        elif elem == 'backtrace':
            from dwarf_debugger.ui.session_widgets.backtrace import BacktraceWidget
            self.backtrace_dock = QDockWidget('Backtrace', self)
            self.backtrace_panel = BacktraceWidget(self)
            self.backtrace_dock.setWidget(self.backtrace_panel)
            self.backtrace_dock.setObjectName('BacktraceWidget')
            self.backtrace_panel.onShowMemoryRequest.connect(
                self._on_showmemory_request)
            self.addDockWidget(Qt.RightDockWidgetArea, self.backtrace_dock)
            self.view_menu.addAction(self.backtrace_dock.toggleViewAction())
            elem_wiget = self.backtrace_panel
        elif elem == 'threads':
            from dwarf_debugger.ui.session_widgets.threads import ThreadsWidget
            self.threads_dock = QDockWidget('Threads', self)
            self.contexts_list_panel = ThreadsWidget(self)
            self.dwarf.onThreadResumed.connect(
                self.contexts_list_panel.resume_tid)
            self.contexts_list_panel.onItemDoubleClicked.connect(
                self._manually_apply_context)
            self.threads_dock.setWidget(self.contexts_list_panel)
            self.threads_dock.setObjectName('ThreadPanel')
            self.addDockWidget(Qt.RightDockWidgetArea, self.threads_dock)
            self.view_menu.addAction(self.threads_dock.toggleViewAction())
            elem_wiget = self.contexts_list_panel
        elif elem == 'modules':
            from dwarf_debugger.ui.panels.panel_modules import ModulesPanel
            self.modules_panel = ModulesPanel(self)
            self.modules_panel.onModuleSelected.connect(
                self._on_module_dblclicked)
            self.modules_panel.onModuleFuncSelected.connect(
                self._on_modulefunc_dblclicked)
            self.modules_panel.onAddBreakpoint.connect(
                self._on_addmodule_breakpoint)
            self.modules_panel.onDumpBinary.connect(self._on_dump_module)
            self.main_tabs.addTab(self.modules_panel, 'Modules')
            elem_wiget = self.modules_panel
        elif elem == 'ranges':
            from dwarf_debugger.ui.panels.panel_ranges import RangesPanel
            self.ranges_panel = RangesPanel(self)
            self.ranges_panel.onItemDoubleClicked.connect(
                self._range_dblclicked)
            self.ranges_panel.onDumpBinary.connect(self._on_dump_module)
            # connect to watchpointpanel func
            self.ranges_panel.onAddWatchpoint.connect(
                self.watchpoints_panel.do_addwatchpoint_dlg)
            self.main_tabs.addTab(self.ranges_panel, 'Ranges')
            elem_wiget = self.ranges_panel
        elif elem == 'search':
            from dwarf_debugger.ui.panels.panel_search import SearchPanel
            self.search_panel = SearchPanel(self)
            self.main_tabs.addTab(self.search_panel, 'Search')
            elem_wiget = self.search_panel
        elif elem == 'data':
            from dwarf_debugger.ui.panels.panel_data import DataPanel
            self.data_panel = DataPanel(self)
            self.main_tabs.addTab(self.data_panel, 'Data')
            elem_wiget = self.data_panel
        elif elem == 'jvm-tracer':
            from dwarf_debugger.ui.panels.panel_java_trace import JavaTracePanel
            self.java_trace_panel = JavaTracePanel(self)
            self.main_tabs.addTab(self.java_trace_panel, 'JVM tracer')
            elem_wiget = self.java_trace_panel
        elif elem == 'smali':
            from dwarf_debugger.ui.panels.panel_smali import SmaliPanel
            self.smali_panel = SmaliPanel()
            self.main_tabs.addTab(self.smali_panel, 'Smali')
            elem_wiget = self.smali_panel
        else:
            print('no handler for elem: ' + elem)

        if elem_wiget is not None:
            self.onSystemUIElementCreated.emit(elem, elem_wiget)

        # TODO: remove add @2x
        for item in self.findChildren(QDockWidget):
            if item:
                if 'darwin' in sys.platform:
                    item.setStyleSheet(
                        'QDockWidget::title { padding-left:-30px; }')

    def set_status_text(self, txt):
        self.statusbar.showMessage(txt)

    # ************************************************************************
    # **************************** Properties ********************************
    # ************************************************************************
    @property
    def disassembly(self):
        return self.asm_panel

    @property
    def backtrace(self):
        return self.backtrace_panel

    @property
    def console(self):
        return self.console_panel

    @property
    def context(self):
        return self.context_panel

    @property
    def threads(self):
        return self.contexts_list_panel

    @property
    def ftrace(self):
        return self.ftrace_panel

    @property
    def breakpoint(self):
        return self.breakpoints_panel

    @property
    def java_inspector(self):
        return self.java_inspector_panel

    @property
    def objc_inspector(self):
        return self.objc_inspector_panel

    @property
    def java_explorer(self):
        return self.java_explorer_panel

    @property
    def modules(self):
        return self.modules_panel

    @property
    def ranges(self):
        return self.ranges_panel

    @property
    def watchpoints(self):
        return self.watchpoints_panel

    @property
    def dwarf(self):
        if self.session_manager.session is not None:
            return self.session_manager.session.dwarf
        else:
            return None

    @property
    def ui_elements(self):
        return self._ui_elems

    # ************************************************************************
    # **************************** Handlers **********************************
    # ************************************************************************
    # session handlers
    def _start_session(self, session_type, session_data=None):
        if self.welcome_window is not None:
            self.welcome_window.close()
        try:
            self.session_manager.create_session(session_type,
                                                session_data=session_data)
        except Exception as e:
            if self.welcome_window:
                utils.show_message_box(str(e))

    def _restore_session(self, session_data):
        if 'session' in session_data:
            session_type = session_data['session']
            self.dwarf_args.any = session_data['package']
            self._start_session(session_type, session_data=session_data)

    def session_created(self):
        # session init done create ui for it
        session = self.session_manager.session
        self._setup_main_menu()
        for ui_elem in session.session_ui_sections:
            ui_elem = ui_elem.join(ui_elem.split()).lower()
            self._create_ui_elem(ui_elem)

        self.dwarf.onProcessAttached.connect(self._on_attached)
        self.dwarf.onProcessDetached.connect(self._on_detached)
        self.dwarf.onScriptLoaded.connect(self._on_script_loaded)

        self.dwarf.onSetRanges.connect(self._on_setranges)
        self.dwarf.onSetModules.connect(self._on_setmodules)

        self.dwarf.onAddNativeBreakpoint.connect(self._on_add_breakpoint)
        self.dwarf.onApplyContext.connect(self._apply_context)
        self.dwarf.onThreadResumed.connect(self.on_tid_resumed)
        self.dwarf.onHitModuleInitializationBreakpoint.connect(
            self._on_hit_module_initialization_breakpoint)

        self.dwarf.onSetData.connect(self._on_set_data)

        self.session_manager.start_session(self.dwarf_args)
        ui_state = self.q_settings.value('dwarf_ui_state')
        if ui_state:
            self.restoreGeometry(ui_state)
        window_state = self.q_settings.value('dwarf_ui_window',
                                             self.saveState())
        if window_state:
            self.restoreState(window_state)

        self.showMaximized()

    def session_stopped(self):
        self.menu.clear()

        self.main_tabs.clear()

        # actually we need to kill this. needs a refactor
        if self.java_trace_panel is not None:
            self.java_trace_panel = None

        for elem in self._ui_elems:
            if elem == 'watchpoints':
                self.watchpoints_panel.clear_list()
                self.watchpoints_panel.close()
                self.watchpoints_panel = None
                self.removeDockWidget(self.watchpoints_dwidget)
                self.watchpoints_dwidget = None
            elif elem == 'breakpoints':
                self.breakpoints_panel.close()
                self.breakpoints_panel = None
                self.removeDockWidget(self.breakpoint_dwiget)
                self.breakpoint_dwiget = None
            elif elem == 'registers':
                self.context_panel.close()
                self.context_panel = None
                self.removeDockWidget(self.registers_dock)
                self.registers_dock = None
            elif elem == 'debug':
                self.debug_panel.close()
                self.debug_panel = None
                self.main_tabs.removeTab(0)
                # self.main_tabs
            elif elem == 'jvm-debugger':
                self.java_explorer_panel.close()
                self.java_explorer_panel = None
                self.removeDockWidget(self.watchpoints_dwidget)
            elif elem == 'console':
                self.console_panel.close()
                self.console_panel = None
                self.removeDockWidget(self.console_dock)
                self.console_dock = None
            elif elem == 'backtrace':
                self.backtrace_panel.close()
                self.backtrace_panel = None
                self.removeDockWidget(self.backtrace_dock)
            elif elem == 'threads':
                self.contexts_list_panel.close()
                self.contexts_list_panel = None
                self.removeDockWidget(self.threads_dock)
                self.threads_dock = None
            elif elem == 'bookmarks':
                self.bookmarks_panel.close()
                self.bookmarks_panel = None
                self.removeDockWidget(self.bookmarks_dwiget)
                self.bookmarks_dwiget = None

        self._initialize_ui_elements()

    def session_closed(self):
        self._initialize_ui_elements()
        self.hide()
        if self.welcome_window:
            self.welcome_window.exec()
        else:
            if self.dwarf_args.any != '':
                self.close()

    # ui handler
    def closeEvent(self, event):
        """ Window closed
            save stuff or whatever at exit

            detaches dwarf
        """
        if self.session_manager.session:
            self.session_manager.session.stop()

        # save windowstuff
        self.q_settings.setValue('dwarf_ui_state', self.saveGeometry())
        self.q_settings.setValue('dwarf_ui_window', self.saveState())

        if self.dwarf:
            try:
                self.dwarf.detach()
            except:
                pass
        super().closeEvent(event)

    def _on_watchpoint_clicked(self, ptr):
        """ Address in Watchpoint/Breakpointpanel was clicked
            show Memory
        """
        if '.' in ptr:  # java_breakpoint
            file_path = ptr.replace('.', os.path.sep)
        else:
            self.jump_to_address(ptr)

    def _on_watchpoint_added(self, ptr):
        """ Watchpoint Entry was added
        """
        try:
            # set highlight
            self.debug_panel.memory_panel.add_highlight(
                HighLight('watchpoint', ptr, self.dwarf.pointer_size))
        except HighlightExistsError:
            pass

    def _on_watchpoint_removeditem(self, ptr):
        """ Watchpoint Entry was removed
            remove highlight too
        """
        self.debug_panel.memory_panel.remove_highlight(ptr)

    def _on_module_dblclicked(self, data):
        """ Module in ModulePanel was doubleclicked
        """
        addr, size = data
        addr = utils.parse_ptr(addr)
        self.jump_to_address(addr)

    def _on_modulefunc_dblclicked(self, ptr):
        """ Function in ModulePanel was doubleclicked
        """
        ptr = utils.parse_ptr(ptr)
        self.jump_to_address(ptr)

    def _on_dump_module(self, data):
        """ DumpBinary MenuItem in ModulePanel was selected
        """
        ptr, size = data
        ptr = utils.parse_ptr(ptr)
        size = int(size, 10)
        self.dwarf.dump_memory(ptr=ptr, length=size)

    def _range_dblclicked(self, ptr):
        """ Range in RangesPanel was doubleclicked
        """
        ptr = utils.parse_ptr(ptr)
        self.jump_to_address(ptr)

    # dwarf handlers
    def _log_js_output(self, output):
        if self.console_panel is not None:
            time_prefix = True
            if len(output.split('\n')) > 1 or len(output.split('<br />')) > 1:
                time_prefix = False
            self.console_panel.get_js_console().log(output,
                                                    time_prefix=time_prefix)

    def _log_event(self, output):
        if self.console_panel is not None:
            self.console_panel.get_events_console().log(output)

    def _on_setranges(self, ranges):
        """ Dwarf wants to set Ranges
            only breakpointed up to switch tab or create ui
            its connected in panel after creation
        """
        if self.ranges_panel is None:
            self.show_main_tab('ranges')
            # forward only now to panel it connects after creation
            self.ranges_panel.set_ranges(ranges)
        else:
            self.show_main_tab('ranges')

    def _on_setmodules(self, modules):
        """ Dwarf wants to set Modules
            only breakpointed up to switch tab or create ui
            its connected in panel after creation
        """
        if self.modules_panel is None:
            self._create_ui_elem('modules')
            self.modules_panel.set_modules(modules)
        else:
            self.show_main_tab('modules')

    def _manually_apply_context(self, context):
        """
        perform additional operation if the context has been manually applied from the context list
        """
        self._apply_context(context, manual=True)

    def _on_hit_module_initialization_breakpoint(self, data):
        if self.debug_panel.memory_panel.number_of_lines() == 0:
            data = data[1]
            module_base = int(data['moduleBase'], 16)
            self.jump_to_address(module_base)

    def _apply_context(self, context, manual=False):
        # update current context tid
        # this should be on top as any further api from js needs to be executed on that thread
        reason = context['reason']
        is_initial_setup = reason == -1
        if manual or (self.dwarf.context_tid and not is_initial_setup):
            self.dwarf.context_tid = context['tid']

        if is_initial_setup:
            self.debug_panel.on_context_setup()

        if 'context' in context:
            if not manual:
                self.threads.add_context(context)

            is_java = context['is_java']
            if is_java:
                if self.java_explorer_panel is None:
                    self._create_ui_elem('jvm-debugger')
                self.context_panel.set_context(context['ptr'], 1,
                                               context['context'])
                self.java_explorer_panel.init()
                self.show_main_tab('jvm-debugger')
            else:
                self.context_panel.set_context(context['ptr'], 0,
                                               context['context'])

                if reason == 0:
                    if 'pc' in context['context']:
                        if self.debug_panel.disassembly_panel.number_of_lines(
                        ) == 0 or manual:
                            self.jump_to_address(
                                context['context']['pc']['value'], view=1)
                elif reason == 3:
                    # step
                    # we make the frontend believe we are in the real step pc instead of the frida space
                    context['context']['pc'] = context['ptr']
                    if 'rip' in context['context']:
                        context['context']['rip'] = context['ptr']

                    self.jump_to_address(context['ptr'], view=1)

        if 'backtrace' in context:
            self.backtrace_panel.set_backtrace(context['backtrace'])

    def _on_add_breakpoint(self, breakpoint):
        try:
            # set highlight
            ptr = breakpoint.get_target()
            ptr = utils.parse_ptr(ptr)
            self.debug_panel.memory_panel.add_highlight(
                HighLight('breakpoint', ptr, self.dwarf.pointer_size))
        except HighlightExistsError:
            pass

    def _on_breakpoint_removed(self, ptr):
        ptr = utils.parse_ptr(ptr)
        self.debug_panel.memory_panel.remove_highlight(ptr)

    def _on_addmodule_breakpoint(self, data):
        ptr, name = data
        self.dwarf.breakpoint_native(input_=ptr)

    def on_tid_resumed(self, tid):
        if self.dwarf:
            if self.dwarf.context_tid == tid:
                # clear backtrace
                if 'backtrace' in self._ui_elems:
                    if self.backtrace_panel is not None:
                        self.backtrace_panel.clear()

                # remove thread
                if 'threads' in self._ui_elems:
                    if self.contexts_list_panel is not None:
                        self.contexts_list_panel.resume_tid(tid)

                # clear registers
                if 'registers' in self._ui_elems:
                    if self.context_panel is not None:
                        self.context_panel.clear()

                # clear jvm explorer
                if 'jvm-debugger' in self._ui_elems:
                    if self.java_explorer_panel is not None:
                        self.java_explorer_panel.clear_panel()

                # invalidate dwarf context tid
                self.dwarf.context_tid = 0

    def _on_set_data(self, data):
        if not isinstance(data, list):
            return

        if self.data_panel is None:
            self.show_main_tab('data')

        if self.data_panel is not None:
            self.data_panel.append_data(data[0], data[1], data[2])

    def show_progress(self, text):
        self.progressbar.setVisible(True)
        self.set_status_text(text)

    def hide_progress(self):
        self.progressbar.setVisible(False)
        self.set_status_text('')

    def _on_attached(self, data):
        self.setWindowTitle('Dwarf - Attached to %s (%s)' % (data[1], data[0]))

    def _on_detached(self, data):
        reason = data[1]

        if reason == 'application-requested':
            if self.session_manager.session:
                self.session_manager.session.stop()
            return 0

        if self.dwarf is not None:
            ret = QDialogDetached.show_dialog(self.dwarf, data[0], data[1],
                                              data[2])
            if ret == 0:
                self.dwarf.restart_proc()
            elif ret == 1:
                self.session_manager.session.stop()

        return 0

    def _on_script_loaded(self):
        # restore the loaded session if any
        self.session_manager.restore_session()

    def on_add_bookmark(self, ptr):
        """
        provide ptr as int
        """
        if self.bookmarks_panel is not None:
            self.bookmarks_panel._create_bookmark(ptr=hex(ptr))

    def _on_showmemory_request(self, ptr):
        # its simple ptr show in memorypanel
        if isinstance(ptr, str):
            ptr = utils.parse_ptr(ptr)
            self.jump_to_address(ptr, 0)

        elif isinstance(ptr, list):
            # TODO: extend
            caller, ptr = ptr
            ptr = utils.parse_ptr(ptr)
            if caller == 'backtrace' or caller == 'bt':
                # jumpto in disasm
                self.jump_to_address(ptr, 1)
Ejemplo n.º 34
0
class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi()
        self.show()
        self.current_knee_step = 0
        self.target_step = 5
        self.current_order = 0
        self.is_horizontal = False
        self.is_current_step_visible = True
        self.calibration_position = QPointF(0, 0)

        try:
            self.timer_thread = KneePosition.TimerThread()
            self.timer_thread.updateSignal.connect(self.control_params_with_knee)
            self.timer_thread.start()
            self.kneePosition = self.timer_thread.kneePosition
            self.calibration_position = QPointF(self.kneePosition.knee_pos_x_center, self.kneePosition.knee_pos_y_center)

        except serial.serialutil.SerialException as e:
            pass
            # self.statusbar.showMessage("膝操作が無効:シリアル通信が確保できていません。原因:" + str(e))

        self.rectangles = []
        self.rect_orders = []
        self.setup_rect(steps)
        self.setup_experiment()

    def setupUi(self):
        self.setObjectName("self")
        self.resize(1280, 720)
        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)

        self.menubar = QMenuBar(self)
        self.menubar.setGeometry(QRect(0, 0, 889, 22))
        self.menubar.setObjectName("menubar")

        self.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        start_experiment_action = QAction("計測開始", self)
        start_experiment_action.setShortcut(QKeySequence("Ctrl+E"))
        start_experiment_action.triggered.connect(self.start_experiment)

        save_records_action = QAction("計測結果を保存", self)
        save_records_action.setShortcut(QKeySequence("Ctrl+S"))
        save_records_action.triggered.connect(self.save_records)

        switch_current_step_visible_action = QAction("現在のステップを表示/非表示切り替え", self)
        switch_current_step_visible_action.setShortcut(QKeySequence("Ctrl+V"))
        switch_current_step_visible_action.triggered.connect(self.switch_current_step_visible)

        operation_menus = self.menubar.addMenu("experiments")
        operation_menus.addAction(start_experiment_action)
        operation_menus.addAction(save_records_action)

    # def switch_vertical_and_horizontal(self):
    #     self.is_horizontal = not self.is_horizontal
    #     self.setup_rect(steps)
    #     self.centralwidget.update()
    #     self.update()

    def setup_rect(self, num_of_rects: int):
        if self.is_horizontal:
            rect_width = 1080 / num_of_rects
            for i in range(num_of_rects):
                self.rectangles.append(QRect(100 + rect_width * i, 260, rect_width, 100))
        else:
            rect_height = 620 / num_of_rects
            for i in range(num_of_rects):
                self.rectangles.append(QRect(540, 50 + rect_height * i, 100, rect_height))

    def setup_experiment(self):
        # UIのsetup
        self.rect_orders = []
        if steps == 5:
            for i in range(4):
                self.rect_orders += random.sample(range(steps), steps)
        elif steps == 10:
            for i in range(2):
                self.rect_orders += random.sample(range(steps), steps)
        elif steps == 15:
            self.rect_orders += random.sample(range(steps), steps)
            tmp_orders = random.sample(range(steps), steps)
            self.rect_orders += tmp_orders[0:5]
        elif steps == 20:
            self.rect_orders += random.sample(range(steps), steps)

        for i in range(steps):
            print(self.rectangles[i])

        # 取得する指標
        self.operation_times      = np.empty((steps * 3), dtype=float)
        self.offsets              = np.empty((steps * 3), dtype=int)
        self.current_position     = QPointF(0, 0)

        # タイマー
        self.start_time    = 0
        self.previous_operated_time = 0

        self.is_started_experiment = False

        self.frame_records     = np.empty((0, 3), float) # 操作ごとの記録
        self.operation_records = np.empty((0, 5), float) # フレーム(膝位置が更新される)ごとの記録

    def start_experiment(self):
        self.start_time            = time.time()
        self.is_started_experiment = True

        self.statusbar.showMessage("Experiment started p{}, {}, steps_{}, step_{}"
                                       .format(participant_No,
                                        ("horizontal" if self.is_horizontal
                                        else "vertical"),
                                        steps,
                                        ("visible" if self.is_current_step_visible
                                        else "invisible")
                                        )
                                   )

    def record_frame(self):
        if self.is_started_experiment:
            current_time   = time.time()  - self.start_time
            self.frame_records = np.append(self.frame_records, np.array(
                                                [[self.current_position.x(),
                                                 self.current_position.y(),
                                                 current_time]]
                                          ), axis=0)

    def record_operation(self):
        current_time = time.time() - self.start_time

        operation_times = current_time - self.previous_operated_time
        offsets         = self.current_knee_step - self.rect_orders[self.current_order]

        self.operation_records = np.append(self.operation_records, np.array(
                                            [[self.current_position.x(),
                                             self.current_position.y(),
                                             operation_times,
                                             self.current_knee_step,
                                             self.rect_orders[self.current_order]]]
                                      ), axis=0)
        self.previous_operated_time = current_time
        self.statusbar.showMessage(str(current_time))

    def save_records(self):
        date = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
        if not self.is_started_experiment:
            file_path = "result_preliminary/p{}/{}/steps_{}/step_{}".format(participant_No,
                                                                     ("horizontal" if self.is_horizontal
                                                                                      else "vertical"),
                                                                     steps,
                                                                     ("visible" if self.is_current_step_visible
                                                                                      else "invisible")
                                                                    )
            try:
                os.makedirs(file_path)
            except FileExistsError:
                pass

            np.savetxt(file_path + "test_frameRecords_{}.csv".format(date), self.frame_records, delimiter=',',
                       fmt=['%.5f', '%.5f', '%.5f'],
                       header='knee_pos_x, knee_pos_y, time',
                       comments=' ')
            np.savetxt(file_path + "test_operationRecords_{}.csv".format(date), self.operation_records, delimiter=',',
                       fmt=['%.5f', '%.5f', '%.5f', '%.0f', '%.0f'],
                       header="knee_pos_x, knee_pos_y, time, selected_No, target_No, calibration x:{} y:{}"
                                .format(self.kneePosition.knee_pos_x_center, self.kneePosition.knee_pos_y_center),
                       comments=' ')
            self.statusbar.showMessage("Saved.")

    def switch_current_step_visible(self):
        if not self.is_started_experiment:
            self.is_current_step_visible = not self.is_current_step_visible

    def control_params_with_knee(self, x, y):
        self.current_position.setX(x)
        self.current_position.setY(y)
        self.record_frame()
        x, y = self.kneePosition.get_mapped_positions(x, y, 1, 359)
        if self.is_horizontal:
            self.current_knee_step = (int)(x / (360 / steps))
        else:
            self.current_knee_step = steps - (int)(y / (360 / steps)) - 1

        # status_str = "x: " + str(x) + "y: " + str(y)
        # self.statusbar.showMessage(status_str)
        self.update()

    def keyPressEvent(self, keyevent: QKeyEvent):
        if keyevent.key() == Qt.Key_Return:
            if self.is_started_experiment:
                self.record_operation()
                self.current_order = self.current_order + 1

                if self.current_order >= 20:
                    self.statusbar.showMessage("End. Save data with Cmd+S.")
                    self.is_started_experiment = False
                    self.current_order = 0


        self.update()

    def paintEvent(self, event: QPaintEvent):
        painter = QPainter(self)

        for rect in self.rectangles:
            painter.drawRect(rect)

        # ターゲットの段階
        painter.setBrush(Qt.green)
        painter.drawRect(self.rectangles[self.rect_orders[self.current_order % 20]])

        # 現在の段階
        if self.is_current_step_visible or not self.is_started_experiment:
            painter.setBrush(Qt.blue)
            painter.drawRect(self.rectangles[self.current_knee_step])
Ejemplo n.º 35
0
class EditorMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setupUi(self)
        self.retranslateUi(self)

        self.level = None
        path = get_default_path()
        if path is None:
            self.default_path = ""
        else:
            self.default_path = path

        self.dragging = False
        self.last_x = None
        self.last_y = None
        self.dragged_time = None
        self.deleting_item = False # Hack for preventing focusing on next item after deleting the previous one

        self.moving = False

        self.resetting = False

        self.entity_list_widget.currentItemChanged.connect(self.action_listwidget_change_selection)
        self.button_zoom_in.pressed.connect(self.zoom_in)
        self.button_zoom_out.pressed.connect(self.zoom_out)
        self.button_remove_entity.pressed.connect(self.remove_position)
        self.button_move_entity.pressed.connect(self.move_entity)
        self.button_clone_entity.pressed.connect(self.action_clone_entity)
        self.button_show_passengers.pressed.connect(self.action_passenger_window)
        self.button_edit_xml.pressed.connect(self.action_open_xml_editor)
        self.button_edit_base_xml.pressed.connect(self.action_open_basexml_editor)
        self.lineedit_angle.editingFinished.connect(self.action_lineedit_changeangle)


        self.bw_map_screen.mouse_clicked.connect(self.get_position)
        self.bw_map_screen.entity_clicked.connect(self.entity_position)
        self.bw_map_screen.mouse_dragged.connect(self.mouse_move)
        self.bw_map_screen.mouse_released.connect(self.mouse_release)
        self.bw_map_screen.mouse_wheel.connect(self.mouse_wheel_scroll_zoom)


        status = self.statusbar
        self.bw_map_screen.setMouseTracking(True)

        self.passenger_window = BWPassengerWindow()
        self.passenger_window.passengerlist.currentItemChanged.connect(self.passengerwindow_action_choose_entity)

        self.xmlobject_textbox = BWEntityXMLEditor()
        self.xmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_object_xml)
        self.xmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited)


        self.basexmlobject_textbox = BWEntityXMLEditor(windowtype="XML Base Object")
        self.basexmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_base_object_xml)
        self.basexmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited)

        self.types_visible = {}
        self.terrain_image = None

        status.showMessage("Ready")

        self.xml_windows = {}
        print("We are now ready!")

    def reset(self):
        self.resetting = True
        self.statusbar.clearMessage()
        self.dragged_time = None
        self.moving = False
        self.dragging = False
        self.last_x = None
        self.last_y = None
        self.dragged_time = None

        self.moving = False

        self.entity_list_widget.clearSelection()
        self.entity_list_widget.clear()

        self.bw_map_screen.reset()
        self.clear_visibility_toggles()

        for window in (self.passenger_window, self.xmlobject_textbox, self.basexmlobject_textbox):
            window.close()
            window.reset()

        for id in self.xml_windows:
            self.destroy_xml_editor(id)

        self.resetting = False

        print("reset done")

    def destroy_xml_editor(self, id):
        pass

    @catch_exception
    def open_xml_editor(self, objectid, offsetx=0, offsety=0):
        selected = objectid
        if self.level is not None and selected in self.level.obj_map:
            delete = []
            for objid, window in self.xml_windows.items():
                if not window.isVisible() and objid != selected:
                    window.destroy()
                    delete.append(objid)
            for objid in delete:
                del self.xml_windows[objid]

            if selected == self.basexmlobject_textbox.entity or selected == self.xmlobject_textbox.entity:
                pass # No need to make a new window
            elif selected in self.xml_windows and self.xml_windows[selected].isVisible():
                self.xml_windows[selected].activateWindow()
                self.xml_windows[selected].update()

            else:
                xml_window = BWEntityXMLEditor()

                def xmleditor_save_object_unlimited():
                    self.statusbar.showMessage("Saving object changes...")
                    try:
                        xmlnode = xml_window.get_content()
                        #assert self.bw_map_screen.current_entity == self.basexmlobject_textbox.entity
                        assert xml_window.entity == xmlnode.get("id")  # Disallow changing the id of the base object

                        self.level.remove_object(xmlnode.get("id"))
                        self.level.add_object(xmlnode)

                        self.statusbar.showMessage("Saved base object {0} as {1}".format(
                            xml_window.entity, self.level.obj_map[xmlnode.get("id")].name))
                    except:
                        self.statusbar.showMessage("Saving object failed")
                        traceback.print_exc()

                xml_window.button_xml_savetext.pressed.connect(xmleditor_save_object_unlimited)
                xml_window.triggered.connect(self.action_open_xml_editor_unlimited)


                obj = self.level.obj_map[selected]
                xml_window.set_title(obj.name)

                xml_window.set_content(obj._xml_node)
                #xml_window.move(QPoint(xml_editor_owner.pos().x()+20, xml_editor_owner.pos().y()+20))
                xml_window.move(QPoint(offsetx, offsety))

                xml_window.show()
                xml_window.update()
                self.xml_windows[selected] = xml_window



    @catch_exception
    def action_open_xml_editor_unlimited(self, xml_editor_owner):
        selected = xml_editor_owner.textbox_xml.textCursor().selectedText()
        self.open_xml_editor(selected,
                             offsetx=xml_editor_owner.pos().x()+20,
                             offsety=xml_editor_owner.pos().y()+20)

    @catch_exception
    def action_open_basexml_editor(self):
        """
        if not self.basexmlobject_textbox.isVisible():
            self.basexmlobject_textbox.destroy()
            self.basexmlobject_textbox = BWEntityXMLEditor(windowtype="XML Base Object")
            self.basexmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_base_object_xml)
            self.basexmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited)
            self.basexmlobject_textbox.show()

        self.basexmlobject_textbox.activateWindow()"""
        if self.level is not None and self.bw_map_screen.current_entity is not None:
            obj = self.level.obj_map[self.bw_map_screen.current_entity]
            if not obj.has_attr("mBase"):
                pass
            else:
                baseobj = self.level.obj_map[obj.get_attr_value("mBase")]
                #self.basexmlobject_textbox.set_title(baseobj.id)
                self.open_xml_editor(baseobj.id)

    def xmleditor_action_save_base_object_xml(self):
        self.statusbar.showMessage("Saving base object changes...")
        try:
            xmlnode = self.basexmlobject_textbox.get_content()
            #assert self.bw_map_screen.current_entity == self.basexmlobject_textbox.entity
            assert self.basexmlobject_textbox.entity == xmlnode.get("id")  # Disallow changing the id of the base object

            self.level.remove_object(xmlnode.get("id"))
            self.level.add_object(xmlnode)

            self.statusbar.showMessage("Saved base object {0} as {1}".format(
                self.basexmlobject_textbox.entity, self.level.obj_map[xmlnode.get("id")].name))
        except:
            self.statusbar.showMessage("Saving base object failed")
            traceback.print_exc()

    def action_open_xml_editor(self):
        """
        if not self.xmlobject_textbox.isVisible():
            self.xmlobject_textbox.destroy()
            self.xmlobject_textbox = BWEntityXMLEditor()
            self.xmlobject_textbox.button_xml_savetext.pressed.connect(self.xmleditor_action_save_object_xml)
            self.xmlobject_textbox.triggered.connect(self.action_open_xml_editor_unlimited)
            self.xmlobject_textbox.show()

        self.xmlobject_textbox.activateWindow()"""
        if self.level is not None and self.bw_map_screen.current_entity is not None:
            entityobj = self.level.obj_map[self.bw_map_screen.current_entity]
            self.open_xml_editor(objectid=entityobj.id)

            update_mapscreen(self.bw_map_screen, self.level.obj_map[entityobj.id])
            self.bw_map_screen.update()

        """self.xmlobject_textbox.set_title(entityobj.id)

            self.xmlobject_textbox.set_content(entityobj._xml_node)

            self.xmlobject_textbox.update()"""

    def xmleditor_action_save_object_xml(self):
        self.statusbar.showMessage("Saving object changes...")
        try:
            xmlnode = self.xmlobject_textbox.get_content()
            #assert self.bw_map_screen.current_entity == self.xmlobject_textbox.entity
            assert self.xmlobject_textbox.entity == xmlnode.get("id") or xmlnode.get("id") not in self.level.obj_map

            if self.passenger_window.isVisible():
                self.passenger_window.close()

            if self.xmlobject_textbox.entity != xmlnode.get("id"):
                #obj = self.level.obj_map[xmlnode.get("id")]
                self.level.remove_object(self.xmlobject_textbox.entity)
                print("adding", xmlnode.get("id"), xmlnode.get("id") in self.level.obj_map )
                self.level.add_object(xmlnode)

                pos = self.get_entity_item_pos(self.xmlobject_textbox.entity)
                item = self.entity_list_widget.takeItem(pos)
                self.entity_list_widget.removeItemWidget(item)
                self.add_item_sorted(xmlnode.get("id"))

                self.bw_map_screen.rename_entity(self.xmlobject_textbox.entity, xmlnode.get("id"))
                assert xmlnode.get("id") in self.level.obj_map
                self.xmlobject_textbox.entity = xmlnode.get("id")
                self.xmlobject_textbox.set_title(xmlnode.get("id"))

            else:
                self.level.remove_object(xmlnode.get("id"))
                self.level.add_object(xmlnode)

            update_mapscreen(self.bw_map_screen, self.level.obj_map[xmlnode.get("id")])

            self.statusbar.showMessage("Saved object {0} as {1}".format(
                self.xmlobject_textbox.entity, self.level.obj_map[xmlnode.get("id")].name))
            self.bw_map_screen.update()

        except:
            self.statusbar.showMessage("Saving object failed")
            traceback.print_exc()

    def action_clone_entity(self):
        entities = []
        if self.bw_map_screen.current_entity is not None:
            entities.append(self.bw_map_screen.current_entity)
        elif len(self.bw_map_screen.selected_entities) > 0:
            entities.extend(self.bw_map_screen.selected_entities.keys())

        if len(entities) > 0:
            dont_clone = {}
            for entity in entities:
                obj = self.level.obj_map[entity]
                if obj.has_attr("mPassenger"):
                    passengers = obj.get_attr_elements("mPassenger")
                    for passenger in passengers:
                        if passenger != "0":
                            dont_clone[passenger] = True
            select = []
            for entity in entities:
                if entity in dont_clone:
                    continue

                obj = self.level.obj_map[entity]

                xml_node = deepcopy(obj._xml_node)
                try:
                    cloned_id = self.level.generate_unique_id(entity)
                    xml_node.set("id", cloned_id)
                    self.level.add_object(xml_node)

                    bw_x, bw_y, angle = object_get_position(self.level, cloned_id)
                    x, y = bw_coords_to_image_coords(bw_x, bw_y)

                    self.add_item_sorted(cloned_id)

                    self.bw_map_screen.add_entity(x, y, cloned_id, obj.type)

                    clonedobj = self.level.obj_map[cloned_id]
                    select.append(cloned_id)
                    update_mapscreen(self.bw_map_screen, clonedobj)
                    if clonedobj.has_attr("mPassenger"):
                        orig_x = bw_x
                        orig_y = bw_y
                        passengers = clonedobj.get_attr_elements("mPassenger")

                        passengers_added = []

                        for i, passenger in enumerate(passengers):
                            if passenger != "0":
                                obj = self.level.obj_map[passenger]
                                xml_node = deepcopy(obj._xml_node)

                                clonedpassenger_id = self.level.generate_unique_id(passenger)
                                xml_node.set("id", clonedpassenger_id)
                                #print("orig passenger: {0}, new passenger: {1}, alreadyexists: {2}".format(
                                #    passenger, clonedpassenger_id, clonedpassenger_id in self.level.obj_map
                                #))
                                #print(type(passenger), type(clonedpassenger_id))

                                self.level.add_object(xml_node)
                                #x, y = object_get_position(self.level, newid)
                                x = orig_x + (i+1)*8
                                y = orig_y + (i+1)*8
                                #print(orig_x, orig_y, x, y)
                                object_set_position(self.level, clonedpassenger_id, x, y)
                                x, y = bw_coords_to_image_coords(x, y)

                                self.add_item_sorted(clonedpassenger_id)
                                self.bw_map_screen.add_entity(x, y, clonedpassenger_id, obj.type)
                                update_mapscreen(self.bw_map_screen, self.level.obj_map[clonedpassenger_id])
                                passengers_added.append(passenger)
                                clonedobj.set_attr_value("mPassenger", clonedpassenger_id, i)
                                select.append(clonedpassenger_id)
                        #print("passengers added:", passengers_added)
                    self.bw_map_screen.selected_entities = {}
                    if len(select) == 1:
                        ent = select[0]
                        self.set_entity_text(ent)
                        self.bw_map_screen.choose_entity(ent)
                    else:
                        for ent in select:
                            self.bw_map_screen.selected_entities[ent] = True
                        self.set_entity_text_multiple(self.bw_map_screen.selected_entities)
                    self.bw_map_screen.update()
                except:
                    traceback.print_exc()

    def add_item_sorted(self, entity):
        max_count = self.entity_list_widget.count()
        entityobj = self.level.obj_map[entity]
        index = 0
        entity_item = BWEntityEntry(entity, "{0}[{1}]".format(entity, entityobj.type))

        # Similar to loading a level, we add the entity in a sorted way by
        # creating this string and comparing it for every item in the list.
        entity_string = get_type(entityobj.type)+entityobj.type+entityobj.id

        inserted = False

        for i in range(max_count):
            curritem = self.entity_list_widget.item(i)
            currobj = self.level.obj_map[curritem.xml_ref]
            currstring = get_type(currobj.type)+currobj.type+currobj.id

            # The list is already sorted, so if we find an item bigger than
            # the one we are inserting, we know the position we have to insert the item in.
            # String comparison should be alpabetically.
            if currstring > entity_string:
                self.entity_list_widget.insertItem(i, entity_item)
                inserted = True
                break

        # If we couldn't insert the item, i.e. there are no items at all
        # or all items are smaller than the item we add, we just add it at the end.
        if not inserted:
            self.entity_list_widget.addItem(entity_item)

    def get_entity_item_pos(self, entityid):
        for i in range(self.entity_list_widget.count()):
            item = self.entity_list_widget.item(i)

            if item.xml_ref == entityid:
                return i

        return None

    def action_passenger_window(self):
        #if self.passenger_window.isVisible()
        print("window is visible: ", self.passenger_window.isVisible())
        #self.passenger_window.reset()

        if not self.passenger_window.isVisible():
            self.passenger_window.destroy()
            self.passenger_window = BWPassengerWindow()
            self.passenger_window.passengerlist.currentItemChanged.connect(self.passengerwindow_action_choose_entity)
            self.passenger_window.show()

        self.passenger_window.activateWindow()
        if self.bw_map_screen.current_entity is not None:
            self.passenger_window.reset()
            entityobj = self.level.obj_map[self.bw_map_screen.current_entity]
            self.passenger_window.set_title(entityobj.id)
            if entityobj.has_attr("mPassenger"):
                for i, passenger in enumerate(entityobj.get_attr_elements("mPassenger")):
                    if passenger in self.level.obj_map:
                        passengerobj = self.level.obj_map[passenger]
                        list_item_name = "{0}[{1}]".format(passenger, passengerobj.type)
                    elif passenger == "0":
                        list_item_name = "{0}<none>".format(passenger)
                    else:
                        list_item_name = "{0}<missing>".format(passenger)
                    self.passenger_window.add_passenger(list_item_name, passenger)
            self.passenger_window.update()

    def passengerwindow_action_choose_entity(self, current, previous):
        try:
            if current is not None and current.xml_ref in self.level.obj_map:
                self.set_entity_text(current.xml_ref)
                self.bw_map_screen.choose_entity(current.xml_ref)
            elif current is not None:
                self.statusbar.showMessage("No such entity: {0}".format(current.xml_ref), 1000*2)
        except:
            traceback.print_exc()

    def move_entity(self):
        if not self.dragging:
            if not self.moving:
                self.moving = True
                currtext = self.button_move_entity.text()
                self.button_move_entity.setText("Stop [Move Entity]")
            else:
                self.moving = False

                currtext = "Move Entity"
                self.button_move_entity.setText(currtext)

    def button_load_level(self):
        try:
            print("ok", self.default_path)
            self.xmlPath = ""
            filepath, choosentype = QFileDialog.getOpenFileName(
                self, "Open File",
                self.default_path,
                BW_LEVEL+";;"+BW_COMPRESSED_LEVEL+";;All files (*)")
            print("doooone")
            if filepath:
                print("resetting")
                self.reset()
                print("done")
                print("chosen type:",choosentype)

                # Some BW levels are clear XML files, some are compressed with GZIP
                # We decide between the two either based on user choice or end of filepath
                if choosentype == BW_COMPRESSED_LEVEL or filepath.endswith(".gz"):
                    print("OPENING AS COMPRESSED")
                    file_open = gzip.open
                else:
                    file_open = open

                with file_open(filepath, "rb") as f:
                    try:
                        self.level = BattWarsLevel(f)
                        self.default_path = filepath
                        set_default_path(filepath)

                        self.setup_visibility_toggles()

                        for obj_id, obj in sorted(self.level.obj_map.items(),
                                                  key=lambda x: get_type(x[1].type)+x[1].type+x[1].id):
                            #print("doing", obj_id)
                            if get_position_attribute(obj) is None:
                                continue
                            #if not obj.has_attr("Mat"):
                            #    continue
                            x, y, angle = object_get_position(self.level, obj_id)
                            assert type(x) != str
                            x, y = bw_coords_to_image_coords(x, y)

                            item = BWEntityEntry(obj_id, "{0}[{1}]".format(obj_id, obj.type))
                            self.entity_list_widget.addItem(item)

                            self.bw_map_screen.add_entity(x, y, obj_id, obj.type, update=False)
                            #if obj.type == "cMapZone":
                            update_mapscreen(self.bw_map_screen, obj)

                        print("ok")
                        self.bw_map_screen.update()
                        path_parts = path.split(filepath)
                        self.setWindowTitle("BW-MapEdit - {0}".format(path_parts[-1]))

                    except Exception as error:
                        print("error", error)
                        traceback.print_exc()
        except Exception as er:
            print("errrorrr", er)
            traceback.print_exc()
        print("loaded")

    def button_save_level(self):
        if self.level is not None:
            filepath, choosentype = QFileDialog.getSaveFileName(
                self, "Save File",
                self.default_path,
                BW_LEVEL+";;"+BW_COMPRESSED_LEVEL+";;All files (*)")
            print(filepath, "saved")

            if filepath:
                # Simiar to load level
                if choosentype == BW_COMPRESSED_LEVEL or filepath.endswith(".gz"):
                    file_open = gzip.open
                else:
                    file_open = open
                try:
                    with file_open(filepath, "wb") as f:
                        self.level._tree.write(f)
                except Exception as error:
                    print("COULDN'T SAVE:", error)
                    traceback.print_exc()

                self.default_path = filepath
        else:
            pass # no level loaded, do nothing

    def entity_position(self, event, entity):
        try:
            # Make it possible to select objects in move mode, but don't make it too easy to lose
            # a selection.
            if not (self.moving and len(self.bw_map_screen.selected_entities) > 1):
                print("got entity:",entity, self.bw_map_screen.entities[entity][2])
                print(entity_get_model(self.level, entity))
                self.set_entity_text(entity)
                self.bw_map_screen.choose_entity(entity)
                pos = self.get_entity_item_pos(entity)
                print("searching:",pos)
                try:
                    self.entity_list_widget.select_item(pos)
                except:
                    traceback.print_exc()
                self.bw_map_screen.selected_entities = {}

                self.bw_map_screen.update()

        except:
            traceback.print_exc()

    def remove_position(self):
        #self.bw_map_screen.entities.pop()
        try:
            # Remove the entity from the map, the list widget and the level data
            self.deleting_item = True
            entities = []
            if self.bw_map_screen.current_entity is not None:
                entities.append(self.bw_map_screen.current_entity)
            elif len(self.bw_map_screen.selected_entities) > 0:
                entities.extend(self.bw_map_screen.selected_entities.keys())
                self.bw_map_screen.selected_entities = {}
                self.set_entity_text_multiple(self.bw_map_screen.selected_entities)
            if len(entities) > 0:
                for entity in entities:
                    pos = self.get_entity_item_pos(entity)
                    item = self.entity_list_widget.takeItem(pos)
                    assert item.xml_ref == entity
                    #self.entity_list_widget.clearSelection()
                    self.entity_list_widget.clearFocus()
                    self.entity_list_widget.removeItemWidget(item)
                    self.level.remove_object(entity)
                    self.bw_map_screen.remove_entity(entity)

                self.bw_map_screen.update()
        except:
            traceback.print_exc()
            raise

    #@catch_exception
    def get_position(self, event):
        self.dragging = True
        self.last_x = event.x()
        self.last_y = event.y()
        self.dragged_time = default_timer()

        mouse_x = event.x()/self.bw_map_screen.zoom_factor
        mouse_y = event.y()/self.bw_map_screen.zoom_factor

        if event.buttons() == QtCore.Qt.LeftButton:

            if not self.moving:
                self.bw_map_screen.set_selectionbox_start((event.x(), event.y()))
            else:
                if self.bw_map_screen.current_entity is not None:
                    newx, newy = image_coords_to_bw_coords(mouse_x, mouse_y)
                    object_set_position(self.level, self.bw_map_screen.current_entity,
                                        newx, newy)
                    self.bw_map_screen.move_entity(self.bw_map_screen.current_entity,
                                                   mouse_x, mouse_y)
                    self.set_entity_text(self.bw_map_screen.current_entity)

                    update_mapscreen(self.bw_map_screen, self.level.obj_map[self.bw_map_screen.current_entity])

                elif len(self.bw_map_screen.selected_entities) > 0:
                    for entity in self.bw_map_screen.selected_entities:
                        first_entity = entity
                        break
                    #first_entity = self.bw_map_screen.selected_entities.keys()[0]
                    x, y, entitytype, metadata = self.bw_map_screen.entities[first_entity]
                    startx = endx = x
                    starty = endy = y

                    for entity in self.bw_map_screen.selected_entities:
                        x, y, dontneed, dontneed = self.bw_map_screen.entities[entity]
                        if x < startx:
                            startx = x
                        if x > endx:
                            endx = x
                        if y < starty:
                            starty = y
                        if y > endy:
                            endy = y
                    middle_x = (startx+endx) / 2
                    middle_y = (starty+endy) / 2

                    delta_x = mouse_x - middle_x
                    delta_y = mouse_y - middle_y

                    for entity in self.bw_map_screen.selected_entities:
                        x, y, dontneed, dontneed = self.bw_map_screen.entities[entity]

                        newx, newy = image_coords_to_bw_coords(x+delta_x, y+delta_y)
                        object_set_position(self.level, entity,
                                            newx, newy)
                        self.bw_map_screen.move_entity(entity,
                                                       x+delta_x, y+delta_y)
                        #self.set_entity_text(self.bw_map_screen.current_entity)

                        update_mapscreen(self.bw_map_screen, self.level.obj_map[entity])

            self.bw_map_screen.update()

    @catch_exception
    def mouse_move(self, event):
        x, y = image_coords_to_bw_coords(event.x()/self.bw_map_screen.zoom_factor,
                                         event.y()/self.bw_map_screen.zoom_factor)
        self.statusbar.showMessage("x: {0} y: {1}".format(round(x, 5), round(y, 5)))

        if self.dragging and default_timer() - self.dragged_time > 0.1:
            if event.buttons() == QtCore.Qt.RightButton:
                delta_x = (event.x()-self.last_x)/8
                delta_y = (event.y()-self.last_y)/8
                #print("hi",event.x(), event.y())

                vertbar = self.scrollArea.verticalScrollBar()
                horizbar = self.scrollArea.horizontalScrollBar()

                vertbar.setSliderPosition(vertbar.value()-delta_y)
                horizbar.setSliderPosition(horizbar.value()-delta_x)

            elif event.buttons() == QtCore.Qt.LeftButton:
                self.bw_map_screen.set_selectionbox_end((event.x(), event.y()))
                if len(self.bw_map_screen.selected_entities) > 0 or self.bw_map_screen.current_entity is None:
                    self.bw_map_screen.choose_entity(None)
                    self.set_entity_text_multiple(self.bw_map_screen.selected_entities)
                self.bw_map_screen.update()

    def mouse_release(self, event):
        self.dragging = False
        if self.bw_map_screen.selectionbox_end is not None:
            self.bw_map_screen.clear_selection_box()
            self.bw_map_screen.update()

    def set_entity_text_multiple(self, entities):
        self.label_object_id.setText("{0} objects selected".format(len(entities)))
        MAX = 15
        listentities = [self.level.obj_map[x].name for x in sorted(entities.keys())][0:MAX]
        listentities.sort()
        if len(entities) > MAX:
            listentities.append("... and {0} more".format(len(entities) - len(listentities)))
        self.label_position.setText("\n".join(listentities[:5]))
        self.label_model_name.setText("\n".join(listentities[5:10]))
        self.label_4.setText("\n".join(listentities[10:]))#15]))
        self.label_5.setText("")#("\n".join(listentities[12:16]))

    def set_entity_text(self, entityid):
        try:
            obj = self.level.obj_map[entityid]
            if obj.has_attr("mBase"):
                base = self.level.obj_map[obj.get_attr_value("mBase")]
                self.label_object_id.setText("{0}\n[{1}]\nBase: {2}\n[{3}]".format(
                    entityid, obj.type, base.id, base.type))
            else:
                self.label_object_id.setText("{0}\n[{1}]".format(entityid, obj.type))
            self.label_model_name.setText("Model: {0}".format(entity_get_model(self.level, entityid)))
            x, y, angle = object_get_position(self.level, entityid)
            self.label_position.setText("x: {0}\ny: {1}".format(x, y))
            self.lineedit_angle.setText(str(round(angle,2)))
            self.label_4.setText("Army: {0}".format(entity_get_army(self.level, entityid)))
            if not obj.has_attr("mPassenger"):
                self.label_5.setText("Icon Type: \n{0}".format(entity_get_icon_type(self.level, entityid)))
            else:

                passengers = 0
                for passenger in obj.get_attr_elements("mPassenger"):
                    if passenger != "0":
                        passengers += 1
                self.label_5.setText("Icon Type: \n{0}\n\nPassengers: {1}".format(
                    entity_get_icon_type(self.level, entityid), passengers))
        except:
            traceback.print_exc()

    def action_listwidget_change_selection(self, current, previous):
        #QtWidgets.QListWidgetItem.
        if not self.resetting and current is not None:
            print("ok")
            print("hi", current.text(), current.xml_ref)

            self.set_entity_text(current.xml_ref)
            self.bw_map_screen.choose_entity(current.xml_ref)

            posx, posy, typename, metadata = self.bw_map_screen.entities[current.xml_ref]
            zf = self.bw_map_screen.zoom_factor
            try:
                if not self.deleting_item:
                    x_margin = min(100, 50*zf)
                    y_margin = min(100, 50*zf)
                    self.scrollArea.ensureVisible(posx*zf, posy*zf,
                                                  xMargin=x_margin, yMargin=y_margin)
                else:
                    self.deleting_item = False
            except:
                traceback.print_exc()

    def zoom_out(self, noslider=False):

        horizbar = self.scrollArea.horizontalScrollBar()
        vertbar = self.scrollArea.verticalScrollBar()

        print(horizbar.maximum(), vertbar.maximum())

        if horizbar.maximum() > 0:
            widthratio = horizbar.value()/horizbar.maximum()
        else:
            widthratio = 0

        if vertbar.maximum() > 0:
            heightratio = vertbar.value()/vertbar.maximum()
        else:
            heightratio = 0

        #oldzf = self.bw_map_screen.zoom_factor / (0.1+1)
        #diff = oldzf - self.bw_map_screen.zoom_factor
        zf = self.bw_map_screen.zoom_factor
        self.bw_map_screen.zoom(calc_zoom_out_factor(zf))#diff)

        #
        if not noslider:
            horizbar.setSliderPosition(horizbar.maximum()*widthratio)
            vertbar.setSliderPosition(vertbar.maximum()*heightratio)
            self.bw_map_screen.update()

        self.statusbar.showMessage("Zoom: {0}x".format(self.bw_map_screen.zoom_factor))

    def zoom_in(self, noslider=False):
        horizbar = self.scrollArea.horizontalScrollBar()
        vertbar = self.scrollArea.verticalScrollBar()

        if horizbar.maximum() > 0:
            widthratio = horizbar.value()/horizbar.maximum()
        else:
            widthratio = 0

        if vertbar.maximum() > 0:
            heightratio = vertbar.value()/vertbar.maximum()
        else:
            heightratio = 0

        zf = self.bw_map_screen.zoom_factor
        self.bw_map_screen.zoom(calc_zoom_in_factor(zf))#zf)

        #

        print("wedidit?")
        if not noslider:
            horizbar.setSliderPosition(horizbar.maximum()*widthratio)
            vertbar.setSliderPosition(vertbar.maximum()*heightratio)
            self.bw_map_screen.update()

        self.statusbar.showMessage("Zoom: {0}x".format(self.bw_map_screen.zoom_factor))

    @catch_exception
    def mouse_wheel_scroll_zoom(self, wheel_event):
        print("scrolling", wheel_event)
        print("Scroll", wheel_event.x(), wheel_event.y(), wheel_event.angleDelta().y())#, wheel_event.delta())

        wheel_delta = wheel_event.angleDelta().y()
        zf = self.bw_map_screen.zoom_factor
        norm_x = wheel_event.x()/zf
        norm_y = wheel_event.y()/zf
        if wheel_delta > 0:
            if zf <= 10:
                self.zoom_in(True)

                zf = self.bw_map_screen.zoom_factor

                xmargin = self.scrollArea.viewport().width()//2 - 200
                ymargin = self.scrollArea.viewport().height()//2 - 200
                self.scrollArea.ensureVisible(norm_x*zf, norm_y*zf, xmargin, ymargin)
                self.bw_map_screen.update()
            else:
                self.zoom_in()
        elif wheel_delta < 0:
            self.zoom_out()



    def action_lineedit_changeangle(self):
        if not self.resetting and self.bw_map_screen.current_entity is not None:
            print("ok")
            current = self.bw_map_screen.current_entity
            currx, curry, angle = object_get_position(self.level, current)

            newangle = self.lineedit_angle.text().strip()
            print(newangle, newangle.isdecimal())
            try:
                angle = float(newangle)
                object_set_position(self.level, current, currx, curry, angle=angle)
                currentobj = self.level.obj_map[current]
                update_mapscreen(self.bw_map_screen, currentobj)
                self.bw_map_screen.update()
            except:
                traceback.print_exc()

    def button_terrain_load_action(self):
        try:
            print("ok", self.default_path)
            filepath, choosentype = QFileDialog.getOpenFileName(
                self, "Open File",
                self.default_path,
                "BW terrain files (*.out *out.gz);;All files (*)")
            print("doooone")
            if filepath:
                if filepath.endswith(".gz"):
                    file_open = gzip.open
                else:
                    file_open = open

                with file_open(filepath, "rb") as f:
                    try:
                        terrain = BWArchiveBase(f)
                        if self.level is not None:
                            waterheight = get_water_height(self.level)
                        else:
                            waterheight = None

                        image, light_image = parse_terrain_to_image(terrain, waterheight)
                        self.bw_map_screen.set_terrain(image, light_image)
                    except:
                        traceback.print_exc()
        except:
            traceback.print_exc()

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(820, 760)
        MainWindow.setMinimumSize(QSize(720, 560))
        MainWindow.setWindowTitle("BW-MapEdit")
        #MainWindow.setWindowTitle("Nep-Nep")


        self.centralwidget = QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        MainWindow.setCentralWidget(self.centralwidget)

        self.horizontalLayout = QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")


        self.scrollArea = QScrollArea(self.centralwidget)
        self.scrollArea.setWidgetResizable(True)

        self.bw_map_screen = BWMapViewer(self.centralwidget)
        self.scrollArea.setWidget(self.bw_map_screen)
        self.horizontalLayout.addWidget(self.scrollArea)

        #self.horizontalLayout.addWidget(self.bw_map_screen)

        self.entity_list_widget = BWEntityListWidget(self.centralwidget)
        self.entity_list_widget.setMaximumSize(QSize(300, 16777215))
        self.entity_list_widget.setObjectName("entity_list_widget")
        self.horizontalLayout.addWidget(self.entity_list_widget)

        spacerItem = QSpacerItem(10, 20, QSizePolicy.Minimum, QSizePolicy.Expanding)
        self.horizontalLayout.addItem(spacerItem)

        self.vertLayoutWidget = QWidget(self.centralwidget)
        self.vertLayoutWidget.setMaximumSize(QSize(250, 1200))
        self.verticalLayout = QVBoxLayout(self.vertLayoutWidget)
        self.verticalLayout.setObjectName("verticalLayout")
        #self.verticalLayout.
        self.button_clone_entity = QPushButton(self.centralwidget)
        self.button_clone_entity.setObjectName("button_clone_entity")
        self.verticalLayout.addWidget(self.button_clone_entity)

        self.button_remove_entity = QPushButton(self.centralwidget)
        self.button_remove_entity.setObjectName("button_remove_entity")
        self.verticalLayout.addWidget(self.button_remove_entity)

        self.button_move_entity = QPushButton(self.centralwidget)
        self.button_move_entity.setObjectName("button_move_entity")
        self.verticalLayout.addWidget(self.button_move_entity)

        self.button_show_passengers = QPushButton(self.centralwidget)
        self.button_show_passengers.setObjectName("button_move_entity")
        self.verticalLayout.addWidget(self.button_show_passengers)


        self.gridLayout = QGridLayout()
        self.gridLayout.setObjectName("gridLayout")

        self.button_zoom_in = QPushButton(self.centralwidget)
        self.button_zoom_in.setObjectName("button_zoom_in")
        self.gridLayout.addWidget(self.button_zoom_in, 0, 0, 0, 1)

        self.button_zoom_out = QPushButton(self.centralwidget)
        self.button_zoom_out.setObjectName("button_zoom_out")
        self.gridLayout.addWidget(self.button_zoom_out, 0, 1, 0, 1)

        self.button_edit_xml = QPushButton(self.centralwidget)
        self.button_edit_xml.setObjectName("button_edit_xml")

        self.button_edit_base_xml = QPushButton(self.centralwidget)
        self.button_edit_base_xml.setObjectName("button_edit_base_xml")


        self.verticalLayout.addLayout(self.gridLayout)
        self.verticalLayout.addWidget(self.button_edit_xml)
        self.verticalLayout.addWidget(self.button_edit_base_xml)

        spacerItem1 = QSpacerItem(10, 20, QSizePolicy.Expanding, QSizePolicy.Minimum)
        self.verticalLayout.addItem(spacerItem1)

        self.verticalLayout_2 = QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")


        self.lineedit_angle = QLineEdit(self.centralwidget)
        self.lineedit_angle.setObjectName("lineedit_angle")
        self.lineedit_angle.setPlaceholderText("Angle")

        self.label_object_id = QLabel(self.centralwidget)
        self.label_object_id.setObjectName("label_object_id")
         #TextSelectableByCursor

        self.label_position = QLabel(self.centralwidget)
        self.label_position.setObjectName("label_position")

        self.label_model_name = QLabel(self.centralwidget)
        self.label_model_name.setObjectName("label_model_name")

        self.label_4 = QLabel(self.centralwidget)
        self.label_4.setObjectName("label_4")

        self.label_5 = QLabel(self.centralwidget)
        self.label_5.setObjectName("label_5")

        for label in (self.label_object_id, self.label_position, self.label_model_name, self.label_4, self.label_5):
            label.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)

        self.verticalLayout_2.addWidget(self.lineedit_angle)
        self.verticalLayout_2.addWidget(self.label_object_id)
        self.verticalLayout_2.addWidget(self.label_position)
        self.verticalLayout_2.addWidget(self.label_model_name)
        self.verticalLayout_2.addWidget(self.label_4)
        self.verticalLayout_2.addWidget(self.label_5)


        self.verticalLayout.addLayout(self.verticalLayout_2)

        self.horizontalLayout.addWidget(self.vertLayoutWidget)

        self.menubar = QMenuBar(MainWindow)
        self.menubar.setGeometry(QRect(0, 0, 820, 29))
        self.menubar.setObjectName("menubar")
        self.file_menu = QMenu(self.menubar)
        self.file_menu.setObjectName("menuLoad")



        self.file_load_action = QAction("Load", self)
        self.file_load_action.triggered.connect(self.button_load_level)
        self.file_menu.addAction(self.file_load_action)
        self.file_save_action = QAction("Save", self)
        self.file_save_action.triggered.connect(self.button_save_level)
        self.file_menu.addAction(self.file_save_action)

        self.visibility_menu = MenuDontClose(self.menubar)#QMenu(self.menubar)
        self.visibility_menu.setObjectName("visibility")



        #self.visibility_menu.addAction(self.toggle_action)
        self.visibility_actions = []

        self.terrain_menu = QMenu(self.menubar)
        self.terrain_menu.setObjectName("terrain")

        self.terrain_load_action = QAction("Load Terrain", self)
        self.terrain_load_action.triggered.connect(self.button_terrain_load_action)
        self.terrain_menu.addAction(self.terrain_load_action)
        self.terrain_display_actions = []
        self.setup_terrain_display_toggles()

        #self.menuLoad_2 = QMenu(self.menubar)
        #self.menuLoad_2.setObjectName("menuLoad_2")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.menubar.addAction(self.file_menu.menuAction())
        #self.menubar.addAction(self.menuLoad_2.menuAction())
        self.menubar.addAction(self.visibility_menu.menuAction())
        self.menubar.addAction(self.terrain_menu.menuAction())
        self.retranslateUi(MainWindow)
        QMetaObject.connectSlotsByName(MainWindow)


    def make_terrain_toggle(self, show_mode):
        def terraintoggle(toggled):
            print("I am", show_mode, "and I was pressed")
            if toggled is True:
                for action, toggle, mode in self.terrain_display_actions:
                    if mode != show_mode:
                        action.setChecked(False)
                self.bw_map_screen.set_show_terrain_mode(show_mode)
            elif toggled is False:
                self.bw_map_screen.set_show_terrain_mode(SHOW_TERRAIN_NO_TERRAIN)
            else:
                print("This shouldn't be possible", toggled, type(toggled))
            self.bw_map_screen.update()
        return terraintoggle

    def setup_terrain_display_toggles(self):
        for mode, name in ((SHOW_TERRAIN_REGULAR, "Show Heightmap"),
                            (SHOW_TERRAIN_LIGHT, "Show Lightmap")):
            toggle = self.make_terrain_toggle(mode)
            toggle_action = QAction(name, self)
            toggle_action.setCheckable(True)
            if mode == SHOW_TERRAIN_REGULAR:
                toggle_action.setChecked(True)
            else:
                toggle_action.setChecked(False)
            toggle_action.triggered.connect(toggle)
            self.terrain_menu.addAction(toggle_action)
            self.terrain_display_actions.append((toggle_action, toggle, mode))

    def clear_terrain_toggles(self):
        try:
            for action, func, mode in self.terrain_display_actions:
                self.terrain_menu.removeAction(action)
            self.terrain_display_actions = []
        except:
            traceback.print_exc()

    def make_toggle_function(self, objtype):
        def toggle(toggled):
            print("i was pressed")
            my_type = copy(objtype)
            self.types_visible[my_type] = toggled
            self.bw_map_screen.set_visibility(self.types_visible)
            self.bw_map_screen.update()
        return toggle

    def setup_visibility_toggles(self):
        for objtype in sorted(self.level.objtypes_with_positions):

            toggle = self.make_toggle_function(objtype)


            toggle_action = QAction(copy(objtype), self)
            toggle_action.setCheckable(True)
            toggle_action.setChecked(True)
            toggle_action.triggered.connect(toggle)
            self.types_visible[objtype] = True

            self.visibility_menu.addAction(toggle_action)
            self.visibility_actions.append((toggle_action, toggle))

        toggle_all = QAction("Toggle All", self)
        toggle_all.triggered.connect(self.toggle_visiblity_all)

        self.visibility_menu.addAction(toggle_all)
        self.visibility_actions.append((toggle_all, self.toggle_visiblity_all))

    def toggle_visiblity_all(self):
        for action, func in self.visibility_actions:
            if action.isCheckable():
                objtype = action.text()
                toggle = self.types_visible[objtype]
                self.types_visible[objtype] = not toggle
                action.setChecked(not toggle)
                self.bw_map_screen.set_visibility(self.types_visible)
        self.bw_map_screen.update()

    def clear_visibility_toggles(self):
        try:
            for action, func in self.visibility_actions:
                self.visibility_menu.removeAction(action)
            self.visibility_actions = []
            self.types_visible = {}
        except:
            traceback.print_exc()

    def retranslateUi(self, MainWindow):
        _translate = QCoreApplication.translate
        self.button_clone_entity.setText(_translate("MainWindow", "Clone Entity"))
        self.button_remove_entity.setText(_translate("MainWindow", "Delete Entity"))
        self.button_move_entity.setText(_translate("MainWindow", "Move Entity"))
        self.button_zoom_in.setText(_translate("MainWindow", "Zoom In"))
        self.button_zoom_out.setText(_translate("MainWindow", "Zoom Out"))
        self.button_show_passengers.setText(_translate("MainWindow", "Show Passengers"))
        self.button_edit_xml.setText("Edit Object XML")
        self.button_edit_base_xml.setText("Edit Base Object XML")

        self.label_model_name.setText(_translate("MainWindow", "TextLabel1"))
        self.label_object_id.setText(_translate("MainWindow", "TextLabel2"))
        self.label_position.setText(_translate("MainWindow", "TextLabel3"))
        self.label_4.setText(_translate("MainWindow", "TextLabel4"))
        self.label_5.setText(_translate("MainWindow", "TextLabel5"))
        self.file_menu.setTitle(_translate("MainWindow", "File"))
        self.visibility_menu.setTitle(_translate("MainWindow", "Visibility"))
        self.terrain_menu.setTitle("Terrain")
class DeckEditorMainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setup_ui()

        self.stringfile = None
        self.reset_in_process = False

        path = get_default_path()
        if path is None:
            self.default_path = ""
        else:
            self.default_path = path

        self.deck_list.currentItemChanged.connect(self.action_listwidget_change_item)
        self.button_set_deck.pressed.connect(self.action_button_set_deck)

        self.deck_data = None

    def reset(self):
        self.reset_in_process = True
        self.deck_list.clearSelection()
        self.deck_list.clear()

        self.reset_in_process = False


    def action_button_set_deck(self):
        print("I was pressed")
        current = self.deck_list.currentItem()
        self.statusbar.clearMessage()
        if current is not None and self.deck_data is not None:
            try:
                leader, rank = self.lineedit_leader.text(), self.lineedit_leader_rank.text()

                deck_data = []

                if rank.isnumeric():
                    rank = int(rank)
                else:
                    self.statusbar.showMessage("Rank is not numeric")
                    return


                if leader.isnumeric():
                    leaderdata = (int(leader) & 0xFFF) | ((rank & 0xF) << 12)
                else:
                    match = match_partly(leader)

                    if isinstance(match, tuple) and match[0] is None:
                        self.statusbar.showMessage("No matching card found: '{0}'".format(leader))
                        return
                    elif isinstance(match, tuple):
                        index, card = match
                        leaderdata = (int(index) & 0xFFF) | ((rank & 0xF) << 12)
                    else:
                        if len(match) > 5:
                            self.statusbar.showMessage("Too many matches found ({0} matches)".format(len(match)))
                        else:
                            self.statusbar.showMessage("More than 1 match found: {0}".format(
                                ", ".join("{0} ({1})".format(x[1], x[0]) for x in match)))
                        return

                deck_data.append(leaderdata)

                cards = []
                for i in range(40):
                    textedit, indexlabel, cardname = self.card_slots[i][0:3]

                    card = textedit.text()
                    if card.isnumeric():
                        card = int(card) & 0xFFF
                        deck_data.append(card)
                    else:
                        match = match_partly(card)

                        if isinstance(match, tuple) and match[0] is None:
                            self.statusbar.showMessage("No matching card found: '{0}'".format(card))
                            return
                        elif isinstance(match, tuple):
                            index, card = match

                            deck_data.append(index)
                        else:
                            if len(match) > 5:
                                self.statusbar.showMessage("Too many matches found ({0} matches)".format(len(match)))
                            else:
                                self.statusbar.showMessage("More than 1 match found: {0}".format(
                                    ", ".join("{0} ({1})".format(x[1], x[0]) for x in match)))
                            return

                if current.is_starter:
                    current.setText("[Starter] {0:>7} [rank:{1:>2}] {2}".format(leaderdata&0xFFF,
                                                                                rank, get_name(leaderdata & 0xFFF)))
                else:

                    current.setText("[CPU] {0:>7} [rank:{1:>2}] {2}".format(leaderdata&0xFFF,
                                                                            rank, get_name(leaderdata & 0xFFF)))

                self.leader_label.setText(get_name(leaderdata & 0xFFF))
                self.lineedit_leader.setText(str(leaderdata & 0xFFF))


                print(len(deck_data))
                for i in range(40):
                    card = deck_data[1+i]
                    textedit, indexlabel, cardname = self.card_slots[i][0:3]
                    textedit.setText(str(card))
                    cardname.setText(get_name(card))

                print(type(self.deck_data))
                struct.pack_into("H"*41, self.deck_data, current.number*41*2, *deck_data)


            except:
                traceback.print_exc()


    def action_listwidget_change_item(self, current, previous):
        try:
            if current is not None:
                print(current, current.number, current.deck_offset)

                leader = struct.unpack_from("H", self.deck_data, current.number*41*2)[0]

                rank = leader >> 12
                leader_card = leader & 0xFFF

                self.lineedit_leader.setText(str(leader_card))
                self.lineedit_leader_rank.setText(str(rank))
                self.leader_label.setText(get_name(leader_card))

                for i in range(40):
                    card = struct.unpack_from("H", self.deck_data, current.number*41*2 + 2 + i*2)[0] & 0xFFF

                    textedit, indexlabel, cardname = self.card_slots[i][0:3]

                    textedit.setText(str(card))

                    cardname.setText(get_name(card))

        except:
            traceback.print_exc()
            raise

    def button_load_decks(self):
        try:
            print("ok", self.default_path)
            self.xmlPath = ""
            filepath, choosentype = QFileDialog.getOpenFileName(
                self, "Open File",
                self.default_path,
                "PS2 iso (*.iso);;All files (*)")
            print("doooone")
            if filepath:
                print("resetting")
                self.reset()
                print("done")

                with open(filepath, "rb") as f:
                    try:
                        f.seek(STARTER_DECK_OFFSET)
                        self.deck_data = bytearray(f.read(17*41*2)) # 17 starter decks, each 41 bytes
                        f.seek(CPU_DECK_OFFSET)
                        self.deck_data += f.read(24*41*2) # 24 CPU decks

                        self.default_path = filepath


                        for i in range(17):
                            leader_byte1, leader_byte2 = struct.unpack_from("BB", self.deck_data, i*41*2)
                            rank = leader_byte2 >> 4
                            leader = ((leader_byte2 & 0x0F) << 8) + leader_byte1
                            deck = YugiohDeckEntry(starter=True, number=i, offset=STARTER_DECK_OFFSET+i*41*2)

                            cardname = get_name(leader)

                            deck.setText("[Starter] {0:>7} [rank:{1:>2}] {2}".format(leader, rank, cardname))
                            self.deck_list.addItem(deck)

                        for i in range(17, 17+24):

                            leader_byte1, leader_byte2 = struct.unpack_from("BB", self.deck_data, i*41*2)
                            rank = leader_byte2 >> 4
                            leader = ((leader_byte2 & 0x0F) << 8) + leader_byte1
                            deck = YugiohDeckEntry(starter=False, number=i, offset=CPU_DECK_OFFSET +i*41*2
                                                   )

                            cardname = get_name(leader)

                            deck.setText("[CPU] {0:>7} [rank:{1:>1}] {2}".format(leader, rank,cardname))
                            self.deck_list.addItem(deck)

                        print("loaded decks")
                    except Exception as error:
                        print("error", error)

        except Exception as er:
            print("errrorrr", error)
            traceback.print_exc()
        print("loaded")

    def button_save_decks(self):
        if self.deck_data is not None:
            filepath, choosentype = QFileDialog.getSaveFileName(
                self, "Save File",
                self.default_path,
                "PS2 iso (*.iso);;All files (*)")
            print(filepath, "saved")
            if filepath:
                with open(filepath, "r+b") as f:
                    f.seek(STARTER_DECK_OFFSET)
                    f.write(self.deck_data[0:17*41*2])
                    f.seek(CPU_DECK_OFFSET)
                    f.write(self.deck_data[17*41*2:17*41*2+24*41*2])


                self.default_path = filepath
                set_default_path(filepath)
        else:
            pass # no level loaded, do nothing

    def setup_ui(self):
        self.setObjectName("MainWindow")
        self.resize(820, 760)
        self.setMinimumSize(QSize(720, 560))
        self.setWindowTitle("Yugioh Duelist of Roses - Deck Edit")

        self.centralwidget = QWidget(self)
        self.centralwidget.setObjectName("centralwidget")
        self.setCentralWidget(self.centralwidget)

        self.horizontalLayout = QHBoxLayout(self.centralwidget)
        self.horizontalLayout.setObjectName("horizontalLayout")

        self.deck_list = QListWidget(self.centralwidget)
        self.horizontalLayout.addWidget(self.deck_list)

        self.vertLayoutWidget = QWidget(self.centralwidget)
        self.verticalLayout = QVBoxLayout(self.vertLayoutWidget)
        self.button_set_deck = QPushButton(self.centralwidget)

        self.button_set_deck.setText("Set Deck")

        self.leader_layoutwidget = QWidget(self.centralwidget)
        self.leader_layout = QHBoxLayout(self.leader_layoutwidget)
        self.leader_layoutwidget.setLayout(self.leader_layout)
        self.lineedit_leader = QLineEdit(self.centralwidget)
        self.leader_label = QLabel(self.centralwidget)

        self.leader_layout.addWidget(self.lineedit_leader)
        self.leader_layout.addWidget(self.leader_label)

        self.lineedit_leader_rank = QLineEdit(self.centralwidget)

        for widget in (self.button_set_deck, self.leader_layoutwidget, self.lineedit_leader_rank):
            self.verticalLayout.addWidget(widget)
        self.cards_scroll = QScrollArea(self.centralwidget)
        self.cards_scroll.setWidgetResizable(True)

        self.card_slots = []
        self.cards_verticalWidget = QWidget(self.centralwidget)

        self.cards_vertical = QVBoxLayout(self.centralwidget)
        self.cards_verticalWidget.setLayout(self.cards_vertical)
        self.cards_scroll.setWidget(self.cards_verticalWidget)

        for i in range(40):
            layoutwidget = QWidget(self.centralwidget)
            layout = QHBoxLayout(layoutwidget)
            layoutwidget.setLayout(layout)

            index_text = QLabel(self.centralwidget)
            index_text.setText("{0:>2}".format(i))
            textedit = QLineEdit(self.centralwidget)
            textedit.setMinimumSize(20, 20)
            textedit.setMaximumSize(100, 5000)
            card_name_text = QLabel(self.centralwidget)
            card_name_text.setText("---")
            card_name_text.setTextInteractionFlags(QtCore.Qt.TextSelectableByMouse)

            layout.addWidget(index_text)
            layout.addWidget(textedit)
            layout.addWidget(card_name_text)
            self.card_slots.append((textedit, index_text, card_name_text, layout, layoutwidget))

            self.cards_vertical.addWidget(layoutwidget)

        self.verticalLayout.addWidget(self.cards_scroll)
        self.horizontalLayout.addWidget(self.vertLayoutWidget)

        self.menubar = self.menuBar()
        self.file_menu = self.menubar.addMenu("File")
        self.file_menu.setObjectName("menuLoad")


        self.file_load_action = QAction("Load", self)
        self.file_load_action.triggered.connect(self.button_load_decks)
        self.file_menu.addAction(self.file_load_action)
        self.file_save_action = QAction("Save", self)
        self.file_save_action.triggered.connect(self.button_save_decks)
        self.file_menu.addAction(self.file_save_action)

        self.statusbar = QStatusBar(self)
        self.statusbar.setObjectName("statusbar")
        self.setStatusBar(self.statusbar)

        print("done")