Beispiel #1
0
    def test_dirlist_users(self):
        tabs = self.form.tabs.tabs
        tabs.setCurrentIndex(USERS_TAB_INDEX)
        current_tab = tabs.widget(USERS_TAB_INDEX)

        self.assertEqual(len(Users.users), 1)

        edits = current_tab.findChildren(QLineEdit)
        self.assertEqual(len(edits), 2)

        add_button = current_tab.findChild(QPushButton)
        self.assertIsNotNone(add_button)
        self.assertEqual(add_button.text(), "Add")
        add_button.click()

        edits = current_tab.findChildren(QLineEdit)
        self.assertEqual(len(edits), 4)

        self.assertEqual(edits[0].getValue(), "guest")
        self.assertEqual(edits[1].getValue(), "guest")

        QTest.keyClicks(edits[2], "test_user")
        self.assertEqual(edits[2].getValue(), "test_user")
        QApplication.sendEvent(edits[2], QEvent(QEvent.FocusOut))

        QTest.keyClicks(edits[3], "test_password")
        self.assertEqual(edits[3].getValue(), "test_password")
        QApplication.sendEvent(edits[2], QEvent(QEvent.FocusOut))

        edits[2].setValue("test_user1")
        self.assertEqual(edits[2].getValue(), "test_user1")

        self.assertEqual(len(Users.users), 2)
def test_styles_animated(mocker, main_window):
    wrapper = main_window.main_view.view_layout.itemAt(0).widget()
    conversation_scrollarea = wrapper.conversation_view.scroll
    file_widget = conversation_scrollarea.widget().layout().itemAt(0).widget()
    download_button = file_widget.download_button

    file_widget.start_button_animation()

    expected_image = load_icon("download_file.gif").pixmap(20, 20).toImage()
    assert download_button.icon().pixmap(20, 20).toImage() == expected_image
    assert "Source Sans Pro" == download_button.font().family()
    assert QFont.Bold == download_button.font().weight()
    assert 13 == download_button.font().pixelSize()
    assert "#05a6fe" == download_button.palette().color(QPalette.Foreground).name()
    # assert 'border: none;' for download_button

    file_widget.eventFilter(download_button, QEvent(QEvent.HoverEnter))
    expected_image = load_icon("download_file.gif").pixmap(20, 20).toImage()
    assert download_button.icon().pixmap(20, 20).toImage() == expected_image
    assert "#05a6fe" == download_button.palette().color(QPalette.Foreground).name()

    file_widget.eventFilter(download_button, QEvent(QEvent.HoverLeave))
    expected_image = load_icon("download_file.gif").pixmap(20, 20).toImage()
    assert download_button.icon().pixmap(20, 20).toImage() == expected_image
    assert "#05a6fe" == download_button.palette().color(QPalette.Foreground).name()
Beispiel #3
0
    def run(self):
        while True:
            ac = async_call_queue.get()

            if ac == None:
                break

            if ac.function == None:
                continue

            with async_session_lock:
                if ac.session_id != async_session_id:
                    continue

            result = None

            try:
                retry_on_exception = ac.retry_on_exception

                for _ in range(2):
                    try:
                        if ac.arguments == None:
                            result = ac.function()
                        elif isinstance(ac.arguments, tuple):
                            result = ac.function(*ac.arguments)
                        else:
                            result = ac.function(ac.arguments)
                    except:
                        if not retry_on_exception:
                            raise

                        retry_on_exception = False
                        continue

                    break
            except Exception as e:
                with async_session_lock:
                    if ac.session_id != async_session_id:
                        continue

                if ac.debug_exception:
                    logging.exception('Error while doing async call')

                if ac.error_callback != None:
                    async_event_queue.put((ac, False, e))

                    QApplication.postEvent(self, QEvent(ASYNC_EVENT))

                continue

            if ac.result_callback != None:
                with async_session_lock:
                    if ac.session_id != async_session_id:
                        continue

                async_event_queue.put((ac, True, result))

                QApplication.postEvent(self, QEvent(ASYNC_EVENT))
Beispiel #4
0
    def test_dirlist_scan_paths(self):
        tabs = self.form.tabs.tabs
        tabs.setCurrentIndex(LOCAL_SCAN_PATHS_TAB_INDEX)
        current_tab = tabs.widget(LOCAL_SCAN_PATHS_TAB_INDEX)

        edits = current_tab.findChildren(QLineEdit)
        self.assertEqual(len(edits), 1)
        scan_edit = edits[0]
        self.assertIsNotNone(scan_edit)
        logging.debug(scan_edit.text())

        add_button = _find_button_by_text(current_tab, "Add")
        self.assertIsNotNone(add_button)

        edits = current_tab.findChildren(DirectoryLocal)
        self.assertEqual(len(edits), 1)

        add_button.click()

        edits = current_tab.findChildren(DirectoryLocal)
        self.assertEqual(len(edits), 2)

        dir_local: DirectoryLocal = edits[1]
        temp_path = "/tmp"
        dir_local.setValue(temp_path)
        self.assertEqual(dir_local.getValue(), temp_path)
        QApplication.sendEvent(dir_local, QEvent(QEvent.FocusOut))
Beispiel #5
0
def test_note_state_number_of_full_turns_equals_number_of_annotated_events_times_per_turns_in_full_turn(
    database_fixture,
):
    state_machine = StateMachine(database=database_fixture)
    state_machine.document, *_ = pytest.helpers.add_document_and_foreign_keys(
        database_fixture
    )
    state = state_machine.s6
    event_count = 3
    # Generate and insert annotated events
    state_machine.database.bulk_insert(
        [
            AnnotatedEvent(
                document_id=state.document.document_id,
                event_begin=0,
                event_end=1,
                event_num=i + 1,
                annotation_done=True,
                recorded=True,
                event_type=EventType.distraction_event_type().event_type,
            )
            for i in range(event_count)
        ]
    )
    sensor_info = state.document.get_related_sensor_info(
        database=state_machine.database
    )
    # trigger entry with dummy event
    event = QEvent(QEvent.None_)
    state.onEntry(event)
    assert state.full_turn_count == event_count / float(sensor_info.turns_in_full_turn)
    assert state.dialog.full_turn_count == event_count / float(
        sensor_info.turns_in_full_turn
    )
Beispiel #6
0
 def copyPath(self) -> None:
     """
     Копирование пути до изображения в буфер обмена.
     """
     clipboard = QApplication.clipboard()
     clipboard.setText(os.path.abspath(self.filename))
     QApplication.sendEvent(clipboard, QEvent(QEvent.Clipboard))
Beispiel #7
0
def test_log_events(qapp, caplog):
    obj = EventObject()
    qapp.postEvent(obj, QEvent(QEvent.User))
    qapp.processEvents()
    records = caplog.records()
    assert len(records) == 1
    assert records[0].msg == 'Event in test_debug.EventObject: User'
Beispiel #8
0
def test_are_you_sure_state_opens_dialog_on_entry_and_closes_on_exit():
    event = QEvent(QEvent.None_)
    state = AreYouSureState('foo')
    state.onEntry(event)
    assert state.dialog.isVisible()
    state.onExit(event)
    assert not state.dialog.isVisible()
    def accept(self):
        location = self.locationField.text()
        condition = self.conditionField.toPlainText()
        resources = self.resourcesField.toPlainText()
        other = self.otherField.toPlainText()
        team = self.callsignField.text()
        subjDate = self.dateField.text()
        subjTime = self.timeField.text()
        radioLoc = self.radioLocField.toPlainText()

        # validation: description, location, instructions fields must all be non-blank
        vText = ""
        if location == "":
            vText += "\n'Location' cannot be blank."
        if condition == "":
            vText += "\n'Condition' cannot be blank."
        if resources == "":
            vText += "\n'Resources Needed' cannot be blank."
        LOG.debug("vText:" + vText)
        if vText:
            inform_user_about_issue(
                "Please complete the form and try again:\n" + vText,
                parent=self)
            return

        textToAdd = ""
        existingText = self.parent.messageField.text()
        if existingText != "":
            textToAdd = "; "
        textToAdd += "SUBJECT LOCATED: LOCATION: " + location + "; CONDITION: " + condition + "; RESOURCES NEEDED: " + resources
        if other != "":
            textToAdd += "; " + other
        self.parent.messageField.setText(existingText + textToAdd)
        self.closeEvent(QEvent(QEvent.Close), True)
        super(subjectLocatedDialog, self).accept()
Beispiel #10
0
def test_notify_2():
    ui = QtWidgets.QLineEdit()
    event = QEvent(QEvent.MouseButtonPress)
    with mock.patch.object(PyQt5.QtWidgets.QApplication,
                           'beep',
                           return_value=False):
        suc = app.notify(obj=ui, event=event)
        assert suc
Beispiel #11
0
 def ThreadBackTest(self):
     try:
         self.OnBackTest(self.analys.symbol_list, self.analys.trading_day_list, self.analys.trade_fees)
     except Exception as e:
         traceback.print_exc() #
         QApplication.postEvent(self.analysis_panel, QEvent(define.DEF_EVENT_SET_ANALYSIS_PROGRESS_ERROR))
         self.log_text = "回测 %s %s 计算发生异常!%s" % (self.analysis, self.analysis_name, e)
         self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "S")
Beispiel #12
0
 def OnQuoteFuture(self, msg): # 行情触发
     try:
         str_code = msg.data[0].decode()
         if str_code == self.contract:
             self.quote_data = msg.data
             QApplication.postEvent(self, QEvent(define.DEF_EVENT_TRADER_FUE_CTP_UPDATE_QUOTE)) # postEvent异步,sendEvent同步
     except Exception as e:
         self.log_text = "%s:函数 OnQuoteFuture 异常!%s" % (self.strategy, e)
         self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M")
Beispiel #13
0
def test_notify_3():
    ui = QtWidgets.QLineEdit()
    event = QEvent(QEvent.MouseMove)
    with mock.patch.object(PyQt5.QtWidgets.QApplication,
                           'notify',
                           return_value=False,
                           side_effect=Exception()):
        suc = app.notify(obj=ui, event=event)
        assert not suc
Beispiel #14
0
 def eventFilter(self, obj, e: QEvent):
     """ 过滤事件 """
     if obj == self:
         if e.type() == QEvent.Hide:
             # 隐藏按钮组时强行取消按钮的hover状态
             e = QEvent(QEvent.Leave)
             QApplication.sendEvent(self.playButton, e)
             QApplication.sendEvent(self.addToButton, e)
     return super().eventFilter(obj, e)
Beispiel #15
0
 def slotVisibleChanged(self):
     if self.isVisible():
         if self.__bfirstshow:
             QCoreApplication.postEvent(self, QEvent(QEvent.User + 1))
             self.__bfirstshow = False
         else:
             self.__windowItem.show()
             self.setWindowGeometry()
     else:
         self.__windowItem.hide()
Beispiel #16
0
    def tell(self, target, message):
        # this can run in an arbitrary thread

        # we'll assume `appendLeft` is thread safe
        if target in self.actors:
            self.actors[target].inbox.appendleft(message)
        else:
            logger.info("Was asked to add to an actor which does not exist")

        self.app.postEvent(self, QEvent(1000))
Beispiel #17
0
    def selectLayers(self, activation, info) -> None:
        # FIXME[old]:
        # def activation_changed(self, activation: ActivationEngine,
        #                        info: ActivationEngine.Change) -> None:
        # pylint: disable=invalid-name
        """The QLayerSelector is interested in network related changes, i.e.
        changes of the network itself or the current layer.
        """
        LOG.debug("QLayerSelector.activation_changed(%s, %s)",
                  activation, info)

        # FIXME[design]: The 'network_changed' message can mean that
        # either the current model has changed or that the list of
        # models was altered (or both).
        # FIXME[old]: should be redundant with network.observable_changed
        if False and info.network_changed:
            #
            # Respond to network change
            #

            # As we may add/remove QWidgets, we need to make sure that
            # this method is executed in the main thread
            event = QEvent(QLayerSelector._UPDATE_NETWORK)
            event.activation = activation
            QCoreApplication.postEvent(self, event)

        return  # FIXME[old]

        if ((info.network_changed or info.layer_changed) and
                activation is not None):
            #
            # Respond to layer change
            #

            layerId = activation.layer_id
            try:
                layer_index = activation.idForLayer(layerId)
            except ValueError:
                print(f"ERROR: {self.__class__.__name__}."
                      "activation_changed(): {error}")
                layer_index = None
            if layer_index != self._currentSelected:

                # unmark the previously active layer
                if self._currentSelected is not None:
                    oldItem = self._layerButtons[self._currentSelected]
                    self._markButton(oldItem, False)

                self._currentSelected = layer_index
                if self._currentSelected is not None:
                    # and mark the new layer
                    newItem = self._layerButtons[self._currentSelected]
                    self._markButton(newItem, True)
Beispiel #18
0
    def dropEvent(self, event):
        if event.mimeData().hasText():
            event.accept()
            self.handle(event.mimeData().text())
        elif event.mimeData().hasUrls():
            event.accept()
            for url in event.mimeData().urls():
                url = str(url)
                self.handle(url)

        utils.propagateEvent(self, QEvent(events.COLLAPSE_WINDOW))
        QWidget.dropEvent(self, event)
Beispiel #19
0
    def accept(self):
        ##		self.parent.timer.start(newEntryDialogTimeoutSeconds*1000) # reset the timeout
        number = self.clueNumberField.text()
        description = self.descriptionField.toPlainText()
        location = self.locationField.text()
        instructions = self.instructionsField.text()
        team = self.callsignField.text()
        clueDate = self.dateField.text()
        clueTime = self.timeField.text()
        radioLoc = self.radioLocField.toPlainText()

        # validation: description, location, instructions fields must all be non-blank
        vText = ""
        if description == "":
            vText += "\n'Description' cannot be blank."
        if location == "":
            vText += "\n'Location' cannot be blank."
        if instructions == "":
            vText += "\n'Instructions' cannot be blank."
        LOG.debug("vText:" + vText)
        if vText:
            inform_user_about_issue(
                "Please complete the form and try again:\n" + vText,
                parent=self)
            return

        self.parent.clueLogNeedsPrint = True
        textToAdd = ""
        existingText = self.parent.messageField.text()
        if existingText != "":
            textToAdd = "; "
        textToAdd += "CLUE#" + number + ": " + description + "; LOCATION: " + location + "; INSTRUCTIONS: " + instructions
        self.parent.messageField.setText(existingText + textToAdd)
        # previously, lastClueNumber was saved here - on accept; we need to save it on init instead, so that
        #  multiple concurrent clueDialogs will not have the same clue number!
        # header_labels=['CLUE#','DESCRIPTION','TEAM','TIME','DATE','OP','LOCATION','INSTRUCTIONS','RADIO LOC.']
        clueData = [
            number, description, team, clueTime, clueDate,
            self.parent.parent.opPeriod, location, instructions, radioLoc
        ]
        self.parent.parent.clueLog.append(clueData)
        if self.clueReportPrintCheckBox.isChecked():
            self.parent.parent.printClueReport(clueData)
        LOG.trace("accepted - calling close")
        self.parent.parent.clueLogDialog.tableView.model().layoutChanged.emit()
        self.closeEvent(QEvent(QEvent.Close), True)
        ##		pixmap=QPixmap(":/radiolog_ui/print_icon.png")
        ##		self.parent.parent.clueLogDialog.tableView.model().setHeaderData(0,Qt.Vertical,pixmap,Qt.DecorationRole)
        ##		self.parent.parent.clueLogDialog.tableView.model().setHeaderData(1,Qt.Vertical,pixmap,Qt.DecorationRole)
        ##		self.parent.parent.clueLogDialog.tableView.model().headerDataChanged.emit(Qt.Vertical,0,1)
        ##		# don't try self.close() here - it can cause the dialog to never close!  Instead use super().accept()
        super(clueDialog, self).accept()
Beispiel #20
0
class CallEvent(QEvent):
    """An event containing a request for a function call."""
    EVENT_TYPE = QEvent(QEvent.registerEventType())

    def __init__(self, queue, exceptions_in_main, fn, *args, **kwargs):
        QEvent.__init__(self, self.EVENT_TYPE)
        self.fn = fn
        self.args = args
        self.kwargs = kwargs
        self._returnval = queue
        # Whether to raise exceptions in the main thread or store them
        # for raising in the calling thread:
        self._exceptions_in_main = exceptions_in_main
Beispiel #21
0
 def SendMessage(self, log_kind, log_class, log_cate, log_info, log_show = ""): # 自身的日志就不保存到数据库了
     if log_kind == "D" or log_kind == "I" or log_kind == "H" or log_kind == "W":
         self.logger.debug("%s %d <%s> - %s" % (log_kind, log_class, log_cate, log_info))
     elif log_kind == "S" or log_kind == "E" or log_kind == "F":
         self.logger.error("%s %d <%s> - %s" % (log_kind, log_class, log_cate, log_info))
     log_item = LogInfo(log_kind, log_class, log_cate, log_info)
     self.AddTbData_Logger(log_item)
     if log_show == define.DEF_LOG_SHOW_TYPE_S and self.log_info_panel_s != None:
         self.log_info_panel_s.AddLogInfo(log_item)
         QApplication.postEvent(self.log_info_panel_s, QEvent(define.DEF_EVENT_LOG_INFO_PRINT))
     elif log_show == define.DEF_LOG_SHOW_TYPE_T and self.log_info_panel_t != None:
         self.log_info_panel_t.AddLogInfo(log_item)
         QApplication.postEvent(self.log_info_panel_t, QEvent(define.DEF_EVENT_LOG_INFO_PRINT))
     elif log_show == define.DEF_LOG_SHOW_TYPE_M and self.log_info_panel_m != None:
         self.log_info_panel_m.AddLogInfo(log_item)
         QApplication.postEvent(self.log_info_panel_m, QEvent(define.DEF_EVENT_LOG_INFO_PRINT))
     elif log_show == define.DEF_LOG_SHOW_TYPE_A and self.log_info_panel_a != None:
         self.log_info_panel_a.AddLogInfo(log_item)
         QApplication.postEvent(self.log_info_panel_a, QEvent(define.DEF_EVENT_LOG_INFO_PRINT))
     elif log_show == define.DEF_LOG_SHOW_TYPE_SPBSA and self.log_info_panel_spbsa != None:
         self.log_info_panel_spbsa.AddLogInfo(log_item)
         QApplication.postEvent(self.log_info_panel_spbsa, QEvent(define.DEF_EVENT_LOG_INFO_PRINT))
Beispiel #22
0
 def onDelete(self):
     """
     After confirming the delete action, removes the item from the settings file.
     """
     reply = QMessageBox.question(
         self,
         "Message",
         "Are you sure you want to delete this action?",
         QMessageBox.Yes,
         QMessageBox.No,
     )
     if reply == QMessageBox.Yes:
         settings.removeItem(self.index)
         utils.propagateEvent(self, QEvent(events.RELOAD_WIDGETS))
 def fsFilterConfirm(self):
     if not ask_user_to_confirm(
             "Filter (ignore) future incoming messages\n  from this FleetSync device?",
             icon=ICON_WARN,
             parent=self):
         self.close()
         return
     self.parent.parent.fsFilterEdit(self.fleet, self.device, True)
     self.close()
     # also close the related new entry dialog if its message field is blank, in the same manner as autoCleanup
     if self.parent.messageField.text() == "":
         self.parent.closeEvent(QEvent(QEvent.Close),
                                accepted=False,
                                force=True)
Beispiel #24
0
 def OnQuoteStock(self, msg):  # 行情触发
     try:
         str_code = msg.data[0].decode()
         if str_code == self.symbol:
             if "60" == str_code[0:2] or "000" == str_code[
                     0:3] or "001" == str_code[0:3] or "002" == str_code[
                         0:3] or "300" == str_code[0:3]:
                 self.quote_data = msg.data
                 QApplication.postEvent(
                     self,
                     QEvent(define.DEF_EVENT_TRADER_STK_APE_UPDATE_QUOTE
                            ))  # postEvent异步,sendEvent同步
     except Exception as e:
         self.log_text = "%s:函数 OnQuoteStock 异常!%s" % (self.strategy, e)
         self.logger.SendMessage("E", 4, self.log_cate, self.log_text, "M")
Beispiel #25
0
 def __updateView(self, view: QGraphicsView, rect: QRectF) -> None:
     view.setSceneRect(rect)
     view.setFixedHeight(int(math.ceil(rect.height())))
     container = view.parent()
     if rect.isEmpty():
         container.setVisible(False)
         return
     # map the rect to (main) viewport coordinates
     viewrect = self.mapFromScene(rect).boundingRect()
     viewportrect = self.viewport().rect()
     visible = not (viewrect.top() >= viewportrect.top()
                    and viewrect.bottom() <= viewportrect.bottom())
     container.setVisible(visible)
     # force immediate layout of the container overlay
     QCoreApplication.sendEvent(container, QEvent(QEvent.LayoutRequest))
Beispiel #26
0
 def onEdit(self):
     """
     Opens and executes the edit form, which allows the user to edit the selected DropTarget
     """
     item = {
         "index": self.index,
         "type": self.type,
         "name": self.name,
         "path": self.filepath,
         "icon": self.iconpath,
         "desc": self.desc,
     }
     form = EditItemForm(item, self)
     form.setModal(True)
     form.exec_()
     utils.propagateEvent(self, QEvent(events.RELOAD_WIDGETS))
Beispiel #27
0
    def closeSecondaryEvent(self, event):
        """Close the main window.
        """
        document = self.current_document()
        if document.isModifiedStrict():
            if self.ask_save_changes() == QDialog.Rejected:
                # Reject the event
                event.ignore()
                return

        old_scheme = document.scheme()

        # Set an empty scheme to clear the document
        document.setScheme(config.workflow_constructor(parent=self))

        QApplication.sendEvent(old_scheme, QEvent(QEvent.Close))

        old_scheme.deleteLater()

        config.save_config()

        geometry = self.saveGeometry()
        state = self.saveState(version=self.SETTINGS_VERSION)
        settings = QSettings()
        settings.beginGroup("mainwindow")
        settings.setValue("geometry", geometry)
        settings.setValue("state", state)
        settings.setValue("canvasdock/expanded", self.dock_widget.expanded())
        settings.setValue("scheme-margins-enabled",
                          self.scheme_margins_enabled)

        settings.setValue("last-scheme-dir", self.last_scheme_dir)
        settings.setValue("widgettoolbox/state",
                          self.widgets_tool_box.saveState())

        settings.setValue("quick-help/visible",
                          self.canvas_tool_dock.quickHelpVisible())

        settings.endGroup()

        event.accept()
Beispiel #28
0
def test_event_detection_state_default_region_count_equals_turns_in_full_turn(
    database_fixture,
):
    state_machine = StateMachine(database=database_fixture)
    state_machine.document, *_ = pytest.helpers.add_document_and_foreign_keys(
        database_fixture
    )
    state = state_machine.s3
    sensor_info = state.document.get_related_sensor_info(
        database=state_machine.database
    )
    # generate and enter data
    n = 10
    state.document.insert_time_series(
        state_machine.database, list(range(n)), list(range(n))
    )
    # trigger entry with dummy event
    event = QEvent(QEvent.None_)
    state.onEntry(event)
    app.processEvents()
    assert state.region_count() == int(sensor_info.turns_in_full_turn)
Beispiel #29
0
    def onCreateFileAction(self):
        """
        Create a new FileTarget.
        """
        context, _filter = QFileDialog.getOpenFileName(self, "Open file",
                                                       expanduser("~"))
        context = str(context)
        if not context:
            return 1, "Missing argument"
        logging.info("Create file target: %s", context)
        name = os.path.basename(context)
        name, ok = QInputDialog.getText(
            self,
            "Enter the name for the new action",
            "Action name:",
            QLineEdit.Normal,
            name,
        )
        if ok and name:
            if not isfile(context):
                QMessageBox.critical(self, "Error",
                                     "Target action must be a local file.",
                                     QMessageBox.Ok)
                return 1, "Target action must be a local file"

            icon_filepath, _filter = QFileDialog.getOpenFileName(
                self, "Choose Icon", config.ASSETS_DIR)
            if not icon_filepath:
                icon_filepath = join(config.ASSETS_DIR, "downloads.png")
            settings.pushItem({
                "type": "file",
                "name": name,
                "desc": name,
                "path": context,
                "icon": icon_filepath,
            })
            utils.propagateEvent(self, QEvent(events.RELOAD_WIDGETS))
            return 0, context
Beispiel #30
0
 def mousePressEvent(self, event):
     if event.button() == Qt.LeftButton:
         self.dragPosition = event.globalPos() - self.frameGeometry(
         ).topLeft()
         QtWidgets.QApplication.postEvent(self, QEvent(174))
         event.accept()