Example #1
0
class DateDialog(QDialog):
    def __init__(self, parent=None):
        super(DateDialog, self).__init__(parent)
        self.setWindowTitle("DateDialog")

        layout = QVBoxLayout(self)
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())

        layout.addWidget(self.datetime)

        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)

        layout.addWidget(buttons)

    def dateTime(self):
        return self.datetime.dateTime()

    @staticmethod
    def getDateTime(parent=None):
        dialog = DateDialog(parent)
        result = dialog.exec()
        date = dialog.dateTime()
        return date.date(), date.time(), result == QDialog.Accepted
Example #2
0
def group4(window):
    groupbox = QGroupBox("Group 3")
    groupbox.setCheckable(True)
    groupbox.setChecked(True)

    input = QLineEdit("firmanslur", window)
    input.setEchoMode(QLineEdit.Password)

    spin = QSpinBox(window)
    spin.setValue(50)

    tanggal = QDateTimeEdit(window)
    tanggal.setDateTime(QDateTime.currentDateTime())

    slider = QSlider(Qt.Horizontal, window)
    slider.setValue(50)

    scrollBar = QScrollBar(Qt.Horizontal, window)
    scrollBar.setValue(60)

    dial = QDial(window)
    dial.setValue(30)
    dial.setNotchesVisible(True)

    layout = QGridLayout()
    layout.addWidget(input, 0, 0, 1, 2)
    layout.addWidget(spin, 1, 0, 1, 2)
    layout.addWidget(tanggal, 2, 0, 1, 2)
    layout.addWidget(slider, 3, 0)
    layout.addWidget(scrollBar, 4, 0)
    layout.addWidget(dial, 3, 1, 2, 1)
    layout.setRowStretch(5, 1)
    groupbox.setLayout(layout)
    return groupbox
Example #3
0
    def initUI(self):
        lbl = QLabel('QTimeEdit')

        datetimeedit = QDateTimeEdit(self)
        datetimeedit.setDateTime(QDateTime.currentDateTime())
        datetimeedit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00),
                                      QDateTime(2100, 1, 1, 00, 00, 00))
        # QDateTimeEdit 클래스를 이용해서 날짜, 시간 편집 위젯(datetimeedit)을
        # 하나 만들어줍니다.
        #
        # setDateTime 메서드에 QDateTime.currentDateTime()을
        # 입력해서 프로그램이 실행될 때 현재 날짜와 시간으로 표시되도록 합니다.
        #
        # setDateTimeRange를 이용하면 사용자가 선택할 수 있는 시간의 범위를 제한할 수 있습니다.
        datetimeedit.setDisplayFormat('yyyy.MM.dd hh:mm:ss')
        # setDisplayFormat 메서드를 이용해서 시간이 'yyyy.MM.dd hh:mm:ss'의
        # 형식으로 표시되도록 설정했습니다.

        vbox = QVBoxLayout()
        vbox.addWidget(lbl)
        vbox.addWidget(datetimeedit)
        vbox.addStretch()
        # 수직 박스 레이아웃을 이용해서 라벨과 날짜,
        # 시간 편집 위젯을 수직으로 배치하고, 전체 위젯의 레이아웃으로 설정합니다.

        self.setLayout(vbox)

        self.setWindowTitle('QDateTimeEdit')
        self.setGeometry(300, 300, 300, 200)
        self.show()
Example #4
0
class Dialog(QDialog):
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        layout = QVBoxLayout(self)
        self.label = QLabel(self)
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())
        self.label.setText("请选择日期")
        layout.addWidget(self.label)
        layout.addWidget(self.datetime)

        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)  #点击ok,隐士存在该方法
        buttons.rejected.connect(self.reject)  #点击cancel,该方法默认隐士存在
        layout.addWidget(buttons)

    #该方法在父类方法中调用,直接打开了子窗体,返回值则用于向父窗体数据的传递
    @staticmethod
    def getResult(self, parent=None):
        dialog = Dialog(parent)
        result = dialog.exec_()
        d = dialog.datetime.dateTime()
        return (d.date(), d.time(), result)
Example #5
0
class Dialog(QDialog):
    #自定义消息
    dialogSignel = pyqtSignal(int, str)

    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
        layout = QVBoxLayout(self)
        self.label = QLabel(self)
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())
        self.label.setText("请选择日期")
        layout.addWidget(self.label)
        layout.addWidget(self.datetime)

        buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)  #点击ok
        buttons.rejected.connect(self.reject)  #点击cancel
        layout.addWidget(buttons)

    def accept(self):  #点击ok是发送内置信号
        print("accept")
        self.dialogSignel.emit(0, self.datetime.text())
        self.destroy()

    def reject(self):  #点击cancel时,发送自定义信号
        print('reject')
        self.dialogSignel.emit(1, "清空")
        self.destroy()
Example #6
0
    def createBottomRightGroupBox(self):
        self.bottomRightGroupBox = QGroupBox("Group 3")
        self.bottomRightGroupBox.setCheckable(True)
        self.bottomRightGroupBox.setChecked(True)

        lineEdit = QLineEdit('s3cRe7')
        lineEdit.setEchoMode(QLineEdit.Password)

        spinBox = QSpinBox(self.bottomRightGroupBox)
        spinBox.setValue(50)

        dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
        dateTimeEdit.setDateTime(QDateTime.currentDateTime())

        slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
        slider.setValue(40)

        scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
        scrollBar.setValue(60)

        dial = QDial(self.bottomRightGroupBox)
        dial.setValue(30)
        dial.setNotchesVisible(True)

        layout = QGridLayout()
        layout.addWidget(lineEdit, 0, 0, 1, 2)
        layout.addWidget(spinBox, 1, 0, 1, 2)
        layout.addWidget(dateTimeEdit, 2, 0, 1, 2)
        layout.addWidget(slider, 3, 0)
        layout.addWidget(scrollBar, 4, 0)
        layout.addWidget(dial, 3, 1, 2, 1)
        layout.setRowStretch(5, 1)
        self.bottomRightGroupBox.setLayout(layout)
Example #7
0
    def createEditor(self, parent, option, index):
        date_edit = QDateTimeEdit(parent)
        date_edit.setDisplayFormat("yyyy/MM/dd HH:mm")
        date_edit.setDateTime(QDateTime.currentDateTime())

        date_edit.setCalendarPopup(True)
        return date_edit
Example #8
0
    def createBottomRightGroupBox(self):
        self.bottomRightGroupBox = QGroupBox("Group 3")
        self.bottomRightGroupBox.setCheckable(True)
        self.bottomRightGroupBox.setChecked(True)

        lineEdit = QLineEdit('s3cRe7')
        lineEdit.setEchoMode(QLineEdit.Password)

        spinBox = QSpinBox(self.bottomRightGroupBox)
        spinBox.setValue(50)

        dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
        dateTimeEdit.setDateTime(QDateTime.currentDateTime())

        slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
        slider.setValue(40)

        scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
        scrollBar.setValue(60)

        dial = QDial(self.bottomRightGroupBox)
        dial.setValue(30)
        dial.setNotchesVisible(True)

        layout = QGridLayout()
        layout.addWidget(lineEdit, 0, 0, 1, 2)
        layout.addWidget(spinBox, 1, 0, 1, 2)
        layout.addWidget(dateTimeEdit, 2, 0, 1, 2)
        layout.addWidget(slider, 3, 0)
        layout.addWidget(scrollBar, 4, 0)
        layout.addWidget(dial, 3, 1, 2, 1)
        layout.setRowStretch(5, 1)
        self.bottomRightGroupBox.setLayout(layout)
class DateDialog(QDialog):
    def __init__(self, parent=None):
        super(DateDialog, self).__init__(parent)

        layout = QVBoxLayout(self)

        # nice widget for editing the date
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())
        layout.addWidget(self.datetime)

        # OK and Cancel buttons
        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
            Qt.Horizontal, self)
        layout.addWidget(self.buttons)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

    # get current date and time from the dialog
    def dateTime(self):
        return self.datetime.dateTime()

    # static method to create the dialog and return (date, time, accepted)
    @staticmethod
    def getDateTime(parent=None):
        dialog = DateDialog(parent)
        result = dialog.exec_()
        date = dialog.dateTime()
        return (date.date(), date.time(), result == QDialog.Accepted)
Example #10
0
class SliceWidget(QWidget):
    """Custom widget to slice data"""
    # Signals
    sliceTimes = pyqtSignal(str, str)

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

        self.initUI()

    def initUI(self):

        # Labels
        sliceLabel = QLabel("Slicing")
        startLabel = QLabel("Start: ")
        endLabel = QLabel("End: ")

        # DateTimeEdit
        self.startDateTimeEdit = QDateTimeEdit()
        self.endDateTimeEdit = QDateTimeEdit()

        # Buttons
        applyButton = QPushButton("Apply")
        applyButton.clicked.connect(self.sendTimes)
        hideButton = QPushButton("Hide")
        hideButton.clicked.connect(self.hide)

        # Layouts
        # - Horizontal for start
        hStart = QHBoxLayout()
        hStart.addWidget(startLabel)
        hStart.addWidget(self.startDateTimeEdit)
        # - Horizontal for end
        hEnd = QHBoxLayout()
        hEnd.addWidget(endLabel)
        hEnd.addWidget(self.endDateTimeEdit)

        # - Vertical for self
        vWidget = QVBoxLayout()
        vWidget.addWidget(sliceLabel)
        vWidget.addLayout(hStart)
        vWidget.addLayout(hEnd)
        vWidget.addWidget(applyButton)
        vWidget.addWidget(hideButton)
        self.setLayout(vWidget)

    def sendTimes(self):
        self.sliceTimes.emit(self.startDateTimeEdit.text(),
                             self.endDateTimeEdit.text())

    def refresh(self, start, end):

        self.startDateTimeEdit.setMinimumDateTime(start)
        self.startDateTimeEdit.setMaximumDateTime(end)
        self.startDateTimeEdit.setDateTime(start)
        self.endDateTimeEdit.setMinimumDateTime(start)
        self.endDateTimeEdit.setMaximumDateTime(end)
        self.endDateTimeEdit.setDateTime(end)
Example #11
0
    def createBottomRightGroupBox(self):
        self.bottomRightGroupBox = QGroupBox("Group 3")
        self.bottomRightGroupBox.setCheckable(True)
        self.bottomRightGroupBox.setChecked(True)

        lineEdit = QLineEdit('4.0')
        lineEdit.setEchoMode(QLineEdit.Password)
        styleLabelLine = QLabel("&GPA")
        styleLabelLine.setBuddy(lineEdit)

        lineEdit1 = QLineEdit('2')
        styleLabelLine1 = QLabel("&SCI paper")
        styleLabelLine1.setBuddy(lineEdit1)

        spinBox = QSpinBox(self.bottomRightGroupBox)
        spinBox.setValue(10)
        styleLabelLine2 = QLabel("&Years")
        styleLabelLine2.setBuddy(spinBox)

        # connect button to function on_click
        #self.lineEdit.clicked.connect(self.on_click)
        #self.show()

        dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
        dateTimeEdit.setDateTime(QDateTime.currentDateTime())

        styleLabelLine3 = QLabel("&Semester")
        styleLabelLine3.setBuddy(dateTimeEdit)

        #slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
        #slider.setValue(40)

        #scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
        #scrollBar.setValue(60)

        #dial = QDial(self.bottomRightGroupBox)
        #dial.setValue(30)
        #dial.setNotchesVisible(True)

        layout = QGridLayout()
        layout.addWidget(styleLabelLine, 0, 0, 1, 2)
        layout.addWidget(lineEdit, 0, 1, 1, 2)

        layout.addWidget(styleLabelLine1, 1, 0, 1, 2)
        layout.addWidget(lineEdit1, 1, 1, 1, 2)

        layout.addWidget(styleLabelLine2, 2, 0, 1, 2)
        layout.addWidget(spinBox, 2, 1, 1, 2)

        layout.addWidget(styleLabelLine3, 3, 0, 1, 2)
        layout.addWidget(dateTimeEdit, 3, 1, 1, 2)
        #layout.addWidget(slider, 3, 0)
        #layout.addWidget(scrollBar, 4, 0)
        #layout.addWidget(dial, 3, 1, 2, 1)
        #layout.setRowStretch(5, 1)
        self.bottomRightGroupBox.setLayout(layout)
Example #12
0
class MainWidget(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        vlayout = QVBoxLayout()
        grid = QGridLayout()
        label1 = QLabel('文件路径')
        self.lineEdit = QLineEdit()
        label2 = QLabel('时间点')
        self.dateEdit = QDateTimeEdit()
        self.dateEdit.setDisplayFormat('yyyy-MM-dd hh:mm:ss')
        grid.addWidget(label1, 0, 0)
        grid.addWidget(
            self.lineEdit,
            0,
            1,
        )
        grid.addWidget(label2, 1, 0)
        grid.addWidget(self.dateEdit, 1, 1)
        vlayout.addLayout(grid)
        vlayout.addStretch(1)
        self.setLayout(vlayout)

    def onClipboradChanged(self):
        clipboard = QApplication.clipboard()
        text = clipboard.text()
        if text:
            content = str(text)
            print('onClipboradChanged---' + content + ' len = ' +
                  str(len(content)))
            if content.startswith('file:///'):
                path = content.replace('file:///', '')
                if not os.path.exists(path):
                    return
                name = Utils.fileName(path)
                self.lineEdit.setText(path)
                if Utils.isAllowConvert2Time(name):
                    self.updateDateTimeEdit(filename=name)
                    pass
            elif len(content) < 50:
                self.updateDateTimeEdit(content=content)

    def updateDateTimeEdit(self, filename='', content=''):
        if filename:
            times = Utils.extractTimeFromFile(filename)
        elif content:
            times = Utils.extractTime(content)
        if times == -1:
            return
        timestr = Utils.convertSeconds2TimeStr(times)
        print(timestr)
        self.dateEdit.setDateTime(
            QDateTime.fromString(timestr, 'yyyy-MM-dd hh:mm:ss'))
        pass
Example #13
0
 def group_datetime_spinbox(self):
     group2 = QGroupBox('QDateTimeEdit')
     lbl = QLabel('QDateTimeEdit')
     date_time_edit = QDateTimeEdit(self)
     date_time_edit.setDateTime(QDateTime.currentDateTime())
     date_time_edit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00),
                                     QDateTime(2100, 1, 1, 00, 00, 00))
     date_time_edit.setDisplayFormat('yyyy-MM-dd hh:mm:ss')
     date_time_edit.dateTimeChanged.connect(self.datetime_value_change)
     self.lbl5 = QLabel(
         date_time_edit.dateTime().toString('yyyy-MM-dd hh:mm:ss'))
     layout_group5 = QHBoxLayout()
     layout_group5.addWidget(lbl)
     layout_group5.addWidget(date_time_edit)
     layout_group5.addWidget(self.lbl5)
     return layout_group5
Example #14
0
class DateTimeFilterPage(QWidget):
    def __init__(self, parent=None):
        super(DateTimeFilterPage, self).__init__(parent)

        self.fromEdit = QDateTimeEdit()
        self.toEdit = QDateTimeEdit()

        groupLayout = QFormLayout()
        groupLayout.addRow("Od:", self.fromEdit)
        groupLayout.addRow("Do:", self.toEdit)

        self.group = QGroupBox("Datum a čas")
        self.group.setCheckable(True)
        self.group.setChecked(False)
        self.group.setLayout(groupLayout)

        layout = QVBoxLayout()
        layout.addWidget(self.group)
        layout.addStretch(1)

        self.setLayout(layout)

    def initControls(self, filter_):
        self.group.setChecked(False)

        for key in ['start_datetime', 'end_datetime']:
            if key in filter_:
                self.group.setChecked(True)
                break

        start = filter_.get('start_datetime', datetime.utcnow())
        start = calendar.timegm(start.timetuple())
        end = filter_.get('end_datetime', datetime.utcnow())
        end = calendar.timegm(end.timetuple())
        self.fromEdit.setDateTime(QDateTime.fromTime_t(start, TZ))
        self.toEdit.setDateTime(QDateTime.fromTime_t(end, TZ))

    def getFilter(self):
        filter_ = {}

        if self.group.isChecked():
            start = self.fromEdit.dateTime().toTime_t()
            end = self.toEdit.dateTime().toTime_t()
            filter_['start_datetime'] = datetime.utcfromtimestamp(start)
            filter_['end_datetime'] = datetime.utcfromtimestamp(end)

        return filter_
Example #15
0
    def initUI(self):
        lb = QLabel('QTimeEdit :')

        dte = QDateTimeEdit(self)
        dte.setDateTime(QDateTime.currentDateTime())
        dte.setDateTimeRange(
                    QDateTime(1900, 1, 1, 00, 00, 00),
                    QDateTime(2100, 1, 1, 00, 00, 00),
                )
        dte.setDisplayFormat('yyyy.MM.dd hh:mm:ss')

        vbox = QVBoxLayout()
        vbox.addWidget(lb)
        vbox.addWidget(dte)
        vbox.addStretch()

        self.setLayout(vbox)
    def createBottomRightGroupBox(self):
        '''Create a checkable group widget useful in the case of form login etc'''
        self.bottomRightGroupBox = QGroupBox("Group 3")
        self.bottomRightGroupBox.setCheckable(
            True)  # sets the state aware mode
        self.bottomRightGroupBox.setChecked(
            True)  # sets the default state to active
        #
        # create the required widgets
        # a lineEdit Widget for password entry. Activate the security by setEchoMode()
        # a spinBox Widget which lets the field change using scroll
        # a Date Time Edit Widget
        # a Slider Widget responsive to scroll as well as press and move
        # a Scroll Widget responsive to scroll as well as press and move
        # a Dial Widget responsive to scroll as well as press and move
        #
        lineEdit = QLineEdit('s3cRe7')
        lineEdit.setEchoMode(QLineEdit.Password)

        spinBox = QSpinBox(self.bottomRightGroupBox)
        spinBox.setValue(25)

        dateTimeEdit = QDateTimeEdit(self.bottomRightGroupBox)
        dateTimeEdit.setDateTime(QDateTime.currentDateTime())

        slider = QSlider(Qt.Horizontal, self.bottomRightGroupBox)
        slider.setValue(40)

        scrollBar = QScrollBar(Qt.Horizontal, self.bottomRightGroupBox)
        scrollBar.setValue(60)

        dial = QDial(self.bottomRightGroupBox)
        dial.setValue(30)
        dial.setNotchesVisible(True)
        #
        # create the internal layout of the group Widget
        #
        layout = QGridLayout()
        layout.addWidget(lineEdit, 0, 0, 1, 3)
        layout.addWidget(spinBox, 1, 0, 1, 2)
        layout.addWidget(dateTimeEdit, 2, 0, 1, 2)
        layout.addWidget(slider, 3, 0)
        layout.addWidget(scrollBar, 4, 0)
        layout.addWidget(dial, 3, 1, 2, 2)
        layout.setRowStretch(50, 1)  # ?? whatdoes RowStretch do?
        self.bottomRightGroupBox.setLayout(layout)
Example #17
0
    def importEvents(self, data):
        self.setRowCount(0)
        TimeStampsIndex = 0
        for key in data:
            self.rowNumb = self.rowCount()
            self.setRowCount(self.rowNumb + len(data[key]))

            timeStamp = QDateTimeEdit()
            timeStamp.setDisplayFormat("dd.MM.yyyy")
            timeStamp.setReadOnly(True)
            timeStampCell = QDateTime.currentDateTime()
            timeStampCell = QDateTime.fromString(key, "dd.MM.yyyy")
            timeStamp.setDateTime(timeStampCell)
            self.setCellWidget(TimeStampsIndex, 0, timeStamp)
            if len(data[key]) > 1:
                self.setSpan(TimeStampsIndex, 0, len(data[key]) , 1)

            for row in range(len(data[key])):
                cell_0 = QTableWidgetItem('')
                cell_0.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                cell_0.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled )

                cell_1 = QTableWidgetItem('')
                cell_1.setTextAlignment(Qt.AlignHCenter | Qt.AlignVCenter)
                cell_1.setFlags( Qt.ItemIsSelectable | Qt.ItemIsEnabled )

                self.setItem(TimeStampsIndex + row, 1, cell_0)
                self.setItem(TimeStampsIndex + row, 2, cell_1)

                self.item(TimeStampsIndex + row, 1).setText(self._IncomeSourceCategory[data[key][row][0]['cell_0']])
                try:
                    if len(data[key][row][1]) == 2:
                        self.item(TimeStampsIndex + row, 2).setText("%.2f" % round(float(data[key][row][1]['cell_1.1']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.2']])
                    elif len(data[key][row][1]) == 4:
                        self.item(TimeStampsIndex + row, 2).setText("%.2f" % round(float(data[key][row][1]['cell_1.1']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.2']] + " -- კონვერტირდა --> " + "%.2f" % round(float(data[key][row][1]['cell_1.3']), 2) + self._CurrencyIndex[data[key][row][1]['cell_1.4']])
                except ValueError:
                    pass
            TimeStampsIndex = TimeStampsIndex + len(data[key])

        self.horizontalHeader().setSectionResizeMode(0, QHeaderView.ResizeToContents)
        self.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
        self.horizontalHeader().setSectionResizeMode(2, QHeaderView.Stretch)
        self.scrollToBottom()
Example #18
0
    def initUI(self):
        lbl = QLabel('QTimeEdit')

        datetimeedit = QDateTimeEdit(self)
        datetimeedit.setDateTime(QDateTime.currentDateTime())
        datetimeedit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00),
                                      QDateTime(2100, 1, 1, 00, 00, 00))
        datetimeedit.setDisplayFormat('yyyy.MM.dd hh:mm:ss')

        vbox = QVBoxLayout()
        vbox.addWidget(lbl)
        vbox.addWidget(datetimeedit)
        vbox.addStretch()

        self.setLayout(vbox)

        self.setWindowTitle('QDateTimeEdit')
        self.setGeometry(300, 300, 300, 200)
        self.show()
class filterPopup(QDialog):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.filterConfiguration = QLabel("Filter Configuration",self)
        self.filterConfiguration.setFont(QtGui.QFont("Roboto",12, QtGui.QFont.Bold))

        self.creatorLabel = QLabel("Creator", self)
        self.creatorLabel.setFont(QtGui.QFont("Roboto",12, QtGui.QFont.Bold))

        self.eventType = QLabel("Event Type", self)
        self.eventType.setFont(QtGui.QFont("Roboto",12, QtGui.QFont.Bold))

        self.keyWordSearch = QLineEdit(self) #Key Word text
        self.redBox = QCheckBox(self)     #Red Check Box
        self.blueBox = QCheckBox(self)    #Blue Check Box
        self.whiteBox = QCheckBox(self)   #White Check Box
        self.redBox2 = QCheckBox(self)     #Red Check Box
        self.blueBox2 = QCheckBox(self)    #Blue Check Box
        self.whiteBox2 = QCheckBox(self)   #White Check Box
        self.startTime = QDateTimeEdit(self)  #Start time text
        self.endTime = QDateTimeEdit(self)    #End Time text
        self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self)

        self.formGroupBox = QGroupBox("ihjnrsdijn")
        layout = QFormLayout(self)
        layout.addRow(self.filterConfiguration)
        layout.addRow("Keyword Search:", self.keyWordSearch)
        layout.addRow(self.creatorLabel)
        layout.addRow("Red", self.redBox)
        layout.addRow("Blue", self.blueBox)
        layout.addRow("White", self.whiteBox)
        layout.addRow(self.eventType)
        layout.addRow("Red", self.redBox2)
        layout.addRow("Blue", self.blueBox2)
        layout.addRow("White", self.whiteBox2)
        layout.addRow("Start TimeStamp:", self.startTime)
        layout.addRow("End TimeStamp:", self.endTime)
        layout.addWidget(self.buttonBox)

    def setDT(self, startDT = "2000-01-01T00:00:00", endDT = "2000-01-01T00:00:00",):
        self.startTime.setDateTime(QtCore.QDateTime.fromString(startDT, "yyyy-MM-ddThh:mm:ss"))
        self.endTime.setDateTime(QtCore.QDateTime.fromString(endDT, "yyyy-MM-ddThh:mm:ss"))
Example #20
0
class DatetimeEditField(DataEditField):
    """
    Class for editing datetime fields.
    """
    def __init__(self, parent, title, help_text):
        self.field = QDateTimeEdit(datetime.now())
        self.field.setCalendarPopup(True)
        self.field.setDisplayFormat("dd-MM-yyyy hh:mm:ss")

        DataEditField.__init__(self, parent, title, help_text, self.field)

    def clearField(self):
        """
        Set field to current datetime
        """
        self.field.setDateTime(datetime.now())

    def getValue(self):
        """
        Get value of DateTimeEditField
        """
        return qDateTime2Datetime(self.field.dateTime())
class DateDialog(QDialog):
    def __init__(self, parent=None):
        super(DateDialog, self).__init__(parent)

        layout = QVBoxLayout(self)

        # info text
        self.label = QLabel(
            text='The file appears to contain relative dates.\n'
            'Please specify a reference date.')
        layout.addWidget(self.label)

        # nice widget for editing the date
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDisplayFormat('yyyy-MM-dd hh:mm:ss')
        self.datetime.setDateTime(QDateTime.currentDateTime())
        layout.addWidget(self.datetime)

        # OK and Cancel buttons
        self.buttons = QDialogButtonBox(QDialogButtonBox.Ok
                                        | QDialogButtonBox.Cancel)
        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

        layout.addWidget(self.buttons)
        self.setLayout(layout)

    # get current date and time from the dialog
    def date_time(self):
        return self.datetime.dateTime()

    # static method to create the dialog and return (date, time, accepted)
    @staticmethod
    def get_date_time(parent=None):
        dialog = DateDialog(parent)
        result = dialog.exec_()
        date = dialog.date_time()
        return date.toPyDateTime(), result == QDialog.Accepted
Example #22
0
class DateDialog(QDialog):
    def __init__(self, parent=None):
        super(DateDialog, self).__init__(parent)

        layout = QVBoxLayout(self)

        # nice widget for editing the date
        self.datetime = QDateTimeEdit(self)
        self.datetime.setCalendarPopup(True)
        self.datetime.setDateTime(QDateTime.currentDateTime())
        layout.addWidget(self.datetime)

        # OK and Cancel buttons
        self.buttons = QDialogButtonBox(
            QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        layout.addWidget(self.buttons)

        self.buttons.accepted.connect(self.accept)
        self.buttons.rejected.connect(self.reject)

    # get current date and time from the dialog
    def dateTime(self):
        return self.datetime.dateTime()
class DateDialog(QDialog):
    """对话窗口"""
    def __init__(self, parent=None):
        super().__init__(parent=parent)
        self.setWindowTitle("多窗口利用控件属性传递参数")
        self.resize(200, 100)

        self.datetimedit = QDateTimeEdit(parent=self)
        self.datetimedit.setCalendarPopup(True)
        self.datetimedit.setMinimumSize(100, 20)
        self.datetimedit.setDateTime(QDateTime.currentDateTime())

        buttons = QDialogButtonBox(QDialogButtonBox.Ok
                                   | QDialogButtonBox.Cancel,
                                   Qt.Horizontal,
                                   parent=self)
        # 两个按钮, 分别连接dialog.accept()和dialog.reject()
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)

        v_layout = QVBoxLayout()
        v_layout.addWidget(self.datetimedit)
        v_layout.addWidget(buttons)
        self.setLayout(v_layout)

    def date_time(self):
        """从对话框中获取当前日期和时间"""
        return self.datetimedit.dateTime()

    @staticmethod
    def get_date_time(parent=None):
        """静态方法, 创建一个自己, 返回时间"""
        dialog = DateDialog(parent)
        result = dialog.exec()
        date = dialog.date_time()
        return date.date(), date.time(), result == QDialog.Accepted
Example #24
0
class NewDateDialog(QDialog):
    Signal_OneParameter = pyqtSignal(str)

    def __init__(self, parent=None):
        super(NewDateDialog, self).__init__(parent)
        self.setWindowTitle('子窗口:用来发射信号')

        # 在布局中添加部件
        layout = QVBoxLayout(self)

        self.label = QLabel(self)
        self.label.setText('前者发射内置信号\n后者发射自定义信号')

        self.datetime_inner = QDateTimeEdit(self)
        self.datetime_inner.setCalendarPopup(True)
        self.datetime_inner.setDateTime(QDateTime.currentDateTime())

        self.datetime_emit = QDateTimeEdit(self)
        self.datetime_emit.setCalendarPopup(True)
        self.datetime_emit.setDateTime(QDateTime.currentDateTime())

        layout.addWidget(self.label)
        layout.addWidget(self.datetime_inner)
        layout.addWidget(self.datetime_emit)

        # 使用两个button(ok和cancel)分别连接accept()和reject()槽函数
        buttons = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self)
        buttons.accepted.connect(self.accept)
        buttons.rejected.connect(self.reject)
        layout.addWidget(buttons)

        self.datetime_emit.dateTimeChanged.connect(self.emit_signal)

    def emit_signal(self):
        date_str = self.datetime_emit.dateTime().toString()
        self.Signal_OneParameter.emit(date_str)
class Window(QWidget):

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

        # Make widgets #################

        self.edit1 = QDateTimeEdit()
        self.edit2 = QDateTimeEdit()
        self.edit3 = QDateTimeEdit()

        self.edit1.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit2.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit3.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))

        self.edit1.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit2.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit3.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))

        self.edit1.setDateTime(datetime.datetime.now())
        self.edit2.setDateTime(datetime.datetime.now())
        self.edit3.setDateTime(datetime.datetime.now())

        #self.edit1.setCalendarPopup(True)
        #self.edit2.setCalendarPopup(True)
        #self.edit3.setCalendarPopup(True)

        # Format: see http://doc.qt.io/qt-5/qdatetime.html#toString-2
        self.edit1.setDisplayFormat("yyyy-MM-dd HH:mm")
        self.edit2.setDisplayFormat("dd/MM/yyyy HH:mm:ss t")
        self.edit3.setDisplayFormat("dddd d MMMM yyyy h m AP")

        self.btn = QPushButton("Print")

        # Set button slot ##############

        self.btn.clicked.connect(self.printText)

        # Set the layout ###############

        vbox = QVBoxLayout()

        vbox.addWidget(self.edit1)
        vbox.addWidget(self.edit2)
        vbox.addWidget(self.edit3)

        vbox.addWidget(self.btn)

        self.setLayout(vbox)

    def printText(self):
        print(self.edit1.text())
        print(self.edit2.text())
        print(self.edit3.text())
class Window(QWidget):

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

        # Make widgets #################

        self.edit1 = QDateTimeEdit()
        self.edit2 = QDateTimeEdit()
        self.edit3 = QDateTimeEdit()

        self.edit1.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit2.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))
        self.edit3.setMinimumDate(datetime.datetime(year=2017, month=9, day=1, hour=8, minute=30, second=30))

        self.edit1.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit2.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))
        self.edit3.setMaximumDate(datetime.datetime(year=2020, month=9, day=1, hour=18, minute=30, second=30))

        self.edit1.setDateTime(datetime.datetime.now())
        self.edit2.setDateTime(datetime.datetime.now())
        self.edit3.setDateTime(datetime.datetime.now())

        self.edit1.setCalendarPopup(True)
        self.edit2.setCalendarPopup(True)
        self.edit3.setCalendarPopup(True)

        # Format: see http://doc.qt.io/qt-5/qdatetime.html#toString-2
        self.edit1.setDisplayFormat("yyyy-MM-dd HH:mm")
        self.edit2.setDisplayFormat("dd/MM/yyyy HH:mm:ss t")
        self.edit3.setDisplayFormat("dddd d MMMM yyyy h m AP")

        self.btn = QPushButton("Print")

        # Set button slot ##############

        self.btn.clicked.connect(self.printText)

        # Set the layout ###############

        vbox = QVBoxLayout()

        vbox.addWidget(self.edit1)
        vbox.addWidget(self.edit2)
        vbox.addWidget(self.edit3)

        vbox.addWidget(self.btn)

        self.setLayout(vbox)

    def printText(self):
        print(self.edit1.text())
        print(self.edit2.text())
        print(self.edit3.text())
Example #27
0
class Ui_MainWindow(QMainWindow):

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

    def initUI(self):

        self.transprot_mass =[]
        self.netprot_mass =[]
        self.filtering_is_on = 0

        grid = QGridLayout()
        self.setLayout(grid)

        self.IP_list = IP_list(self)
        self.TransProt_list = TransProt_list(self)
        self.NetProt_list = NetProt_list(self)
        self.setWindowTitle('Гамма')
        self.setWindowIcon(QIcon('допочки\Gamma_200x200.png'))
        self.resize(740, 830)
        self.to_center()
        self.centralwidget = QWidget(self)
        self.tabWidget = QTabWidget(self.centralwidget)
        self.tabWidget.setGeometry(QRect(20, 20, 700, 750))
        self.tab = QWidget()

        grid.addWidget(self.tab)

        self.cb_time = QCheckBox(self.tab)
        self.cb_time.setGeometry(QRect(360, 130, 120, 20))
        self.cb_time.setText("Фильтр по времени")
        self.cb_prot = QCheckBox(self.tab)
        self.cb_prot.setGeometry(QRect(20, 130, 140, 20))
        self.cb_prot.setText("Фильтр по протоколам")
        self.cb_addr = QCheckBox(self.tab)
        self.cb_addr.setGeometry(QRect(360, 290, 130, 20))
        self.cb_addr.setText("Фильтр по IP-адресам")

        self.dt_beg = QDateTimeEdit(self.tab)
        self.dt_beg.setGeometry(QRect(360, 210, 150, 20))
        self.dt_beg.setDateTime(QDateTime.currentDateTime())
        self.dt_beg.setDisplayFormat("dd.MM.yyyy H:mm:ss.zzz")
        self.dt_beg.setCalendarPopup(True)
        self.dt_beg.setToolTip('Выбрать начальное время (>=)')
        self.dt_beg.setEnabled(False)

        self.dt_end = QDateTimeEdit(self.tab)
        self.dt_end.setGeometry(QRect(520, 210, 150, 20))
        self.dt_end.setDateTime(QDateTime.currentDateTime())
        self.dt_end.setDisplayFormat("dd.MM.yyyy H:mm:ss.zzz")
        self.dt_end.setCalendarPopup(True)
        self.dt_end.setToolTip('Выбрать конечное время (<)')
        self.dt_end.setEnabled(False)

        self.dt_beg.dateChanged.connect(lambda dc: self.date_changed(1))
        self.dt_end.dateChanged.connect(lambda dc: self.date_changed(2))

        #self.l_input_dir = QLabel(self.tab)
        #self.l_input_dir.setGeometry(QRect(102, 50, 180, 15))
        #self.l_input_dir.setText("Выберите директорию с файлами")
        #self.l_or = QLabel(self.tab)
        #self.l_or.setGeometry(QRect(340, 50, 21, 16))
        #self.l_or.setText("ИЛИ")
        self.l_input_file = QLabel(self.tab)
        self.l_input_file.setGeometry(QRect(300, 50, 90, 15))
        self.l_input_file.setText("Выберите файлы")
        self.l_transpr = QLabel(self.tab)
        self.l_transpr.setGeometry(QRect(50, 190, 180, 16))
        self.l_transpr.setEnabled(False)
        self.l_transpr.setText("Протоколы Транспортного уровня")
        self.l_netpr = QLabel(self.tab)
        self.l_netpr.setGeometry(QRect(50, 290, 180, 16))
        self.l_netpr.setEnabled(False)
        self.l_netpr.setText("Протоколы Сетевого уровня")
        self.l_beg = QLabel(self.tab)
        self.l_beg.setGeometry(QRect(390, 190, 60, 16))
        self.l_beg.setEnabled(False)
        self.l_beg.setText("Начиная с..")
        self.l_end = QLabel(self.tab)
        self.l_end.setGeometry(QRect(560, 190, 80, 16))
        self.l_end.setEnabled(False)
        self.l_end.setText("Оканчивая до..")
        self.l_name = QLabel(self.tab)
        self.l_name.setGeometry(QRect(300, 450, 96, 16))
        self.l_name.setText("Как назвать файл?")
        self.l_filt = QLabel(self.tab)
        self.l_filt.setGeometry(QRect(300, 10, 91, 16))
        self.l_filt.setText("Выборка пакетов")

        self.line = QFrame(self.tab)
        self.line.setGeometry(QRect(0, 110, 690, 15))
        self.line.setFrameShape(QFrame.HLine)
        self.line.setFrameShadow(QFrame.Sunken)
        self.line_2 = QFrame(self.tab)
        self.line_2.setGeometry(QRect(340, 120, 15, 300))
        self.line_2.setFrameShape(QFrame.VLine)
        self.line_2.setFrameShadow(QFrame.Sunken)
        self.line_3 = QFrame(self.tab)
        self.line_3.setGeometry(QRect(0, 420, 690, 15))
        self.line_3.setFrameShape(QFrame.HLine)
        self.line_3.setFrameShadow(QFrame.Sunken)

        #self.le_dir = QLineEdit(self.tab)
        #self.le_dir.setGeometry(QRect(110, 80, 211, 20))
        #self.le_dir.setEnabled(False)
        #self.le_dir.setReadOnly(True)
        self.le_file = QLineEdit(self.tab)
        self.le_file.setGeometry(QRect(250, 80, 211, 20))
        #self.le_file.setEnabled(False)
        self.le_file.setReadOnly(True)
        self.le_name = QLineEdit(self.tab)
        self.le_name.setGeometry(QRect(250, 480, 231, 20))

        self.pt_transpr = QPlainTextEdit(self.tab)
        self.pt_transpr.setGeometry(QRect(50, 210, 271, 71))
        self.pt_transpr.setEnabled(False)
        self.pt_transpr.setReadOnly(True)
        self.pt_netpr = QPlainTextEdit(self.tab)
        self.pt_netpr.setGeometry(QRect(50, 320, 271, 71))
        self.pt_netpr.setEnabled(False)
        self.pt_netpr.setReadOnly(True)

        self.pt_addr = QPlainTextEdit(self.tab)
        self.pt_addr.setGeometry(QRect(390, 320, 271, 71))
        self.pt_addr.setEnabled(False)
        self.pt_log = QPlainTextEdit(self.tab)
        self.pt_log.setGeometry(QRect(20, 610, 651, 101))
        self.pt_log.setReadOnly(True)

        self.progressBar = QProgressBar(self.tab)
        self.progressBar.setGeometry(QRect(20, 580, 651, 20))
        self.progressBar.setFormat("%v" + "%")
        self.progressBar.setMaximum(100)
        self.progressBar.setValue(0)

        #self.pb_dir = QPushButton(self.tab)
        #self.pb_dir.setGeometry(QRect(80, 80, 21, 20))
        #self.pb_dir.setIcon(QIcon('допочки\_folder.png'))
        #self.pb_dir.clicked.connect(lambda gd: self.get_directory(1))
        self.pb_file = QPushButton(self.tab)
        self.pb_file.setGeometry(QRect(220, 80, 21, 20))
        self.pb_file.setIcon(QIcon('допочки\_folder.png'))
        self.pb_file.clicked.connect(lambda gf: self.get_files(1))
        self.pb_time = QPushButton(self.tab)
        self.pb_time.setGeometry(QRect(480, 240, 71, 20))
        self.pb_time.setToolTip('Добавить ещё временной отрезок')
        self.pb_time.setEnabled(False)
        self.pb_time.setText("Ещё!")

        self.pb_transpr = QPushButton(self.tab)
        self.pb_transpr.setGeometry(QRect(20, 210, 21, 20))
        self.pb_transpr.setToolTip('Выбрать протоколы Транспортного уровня')
        self.pb_transpr.setIcon(QIcon('допочки\_blank.png'))
        self.pb_transpr.setEnabled(False)
        self.pb_transpr.clicked.connect(self.TransProt_list.exec)

        self.pb_netpr = QPushButton(self.tab)
        self.pb_netpr.setGeometry(QRect(20, 320, 21, 20))
        self.pb_netpr.setToolTip('Выбрать протоколы Сетевого уровня')
        self.pb_netpr.setIcon(QIcon('допочки\_blank.png'))
        self.pb_netpr.setEnabled(False)
        self.pb_netpr.clicked.connect(self.NetProt_list.exec)
        self.pb_addr = QPushButton(self.tab)
        self.pb_addr.setGeometry(QRect(530, 290, 132, 20))
        self.pb_addr.setText('Редактировать список')
        self.pb_addr.setEnabled(False)
        self.pb_addr.clicked.connect(self.IP_list.exec)
        self.pb_name = QPushButton(self.tab)
        self.pb_name.setGeometry(QRect(220, 480, 21, 20))
        self.pb_name.setIcon(QIcon('допочки\_folder.png'))
        self.pb_name.clicked.connect(lambda ed: self.extract_to_directory(1))
        self.pb_start = QPushButton(self.tab)
        self.pb_start.setGeometry(QRect(220, 510, 261, 41))
        self.pb_start.setText("Начать выборку")
        self.pb_start.clicked.connect(self.do_it_motherFucker)

        #self.radiobutton = QRadioButton(self.tab)
        #self.radiobutton.setGeometry(QRect(84, 48, 20, 20))
        #self.radiobutton_2 = QRadioButton(self.tab)
        #self.radiobutton_2.setGeometry(QRect(424, 48, 20, 20))

        #self.radiobutton.raise_()
        #self.radiobutton_2.raise_()
        self.cb_time.raise_()
        self.cb_prot.raise_()
        self.cb_addr.raise_()
        self.dt_beg.raise_()
        self.dt_end.raise_()
        #self.l_input_dir.raise_()
        #self.l_or.raise_()
        self.l_input_file.raise_()
        self.l_transpr.raise_()
        self.l_netpr.raise_()
        self.l_beg.raise_()
        self.l_end.raise_()
        self.l_name.raise_()
        self.l_filt.raise_()
        self.line.raise_()
        self.line_2.raise_()
        self.line_3.raise_()
        #self.le_dir.raise_()
        self.le_file.raise_()
        self.le_name.raise_()
        self.pt_transpr.raise_()
        self.pt_netpr.raise_()
        self.pt_addr.raise_()
        self.pt_log.raise_()
        self.progressBar.raise_()
        #self.pb_dir.raise_()
        self.pb_file.raise_()
        self.pb_time.raise_()
        self.pb_transpr.raise_()
        self.pb_netpr.raise_()
        self.pb_addr.raise_()
        self.pb_name.raise_()
        self.pb_start.raise_()
        self.setCentralWidget(self.centralwidget)
        self.statusbar = QStatusBar(self)
        self.setStatusBar(self.statusbar)
        self.tabWidget.addTab(self.tab, "")

        self.cb_time.clicked['bool'].connect(self.dt_beg.setEnabled)
        self.cb_time.clicked['bool'].connect(self.dt_end.setEnabled)
        self.cb_time.clicked['bool'].connect(self.l_beg.setEnabled)
        self.cb_time.clicked['bool'].connect(self.l_end.setEnabled)
        self.cb_prot.clicked['bool'].connect(self.l_transpr.setEnabled)
        self.cb_prot.clicked['bool'].connect(self.l_netpr.setEnabled)
        self.cb_prot.clicked['bool'].connect(self.pt_transpr.setEnabled)
        self.cb_prot.clicked['bool'].connect(self.pt_netpr.setEnabled)
        self.cb_prot.clicked['bool'].connect(self.pb_transpr.setEnabled)
        self.cb_prot.clicked['bool'].connect(self.pb_netpr.setEnabled)
        self.cb_addr.clicked['bool'].connect(self.pt_addr.setEnabled)
        self.cb_addr.clicked['bool'].connect(self.pb_addr.setEnabled)



        #####------------------------------2_TAB



        self.tab_2 = QWidget()
        self.tabWidget.addTab(self.tab_2, "")
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), ("II работа с файлами"))

        self.l_merge = QLabel(self.tab_2)
        self.l_merge.setGeometry(QRect(300, 10, 180, 16))
        self.l_merge.setText("Объединение файлов")

        self.l_arch = QLabel(self.tab_2)
        self.l_arch.setGeometry(QRect(300, 250, 180, 16))
        self.l_arch.setText("Архивирование файлов")

        #self.radiobutton_3 = QRadioButton(self.tab_2)
        #self.radiobutton_3.setGeometry(QRect(84, 48, 20, 20))
        #self.radiobutton_4 = QRadioButton(self.tab_2)
        #self.radiobutton_4.setGeometry(QRect(424, 48, 20, 20))

        #self.l_input_dir2 = QLabel(self.tab_2)
        #self.l_input_dir2.setGeometry(QRect(102, 50, 180, 15))
        #self.l_input_dir2.setText("Выберите директорию с файлами")
        #self.l_or2 = QLabel(self.tab_2)
        #self.l_or2.setGeometry(QRect(340, 50, 21, 16))
        #self.l_or2.setText("ИЛИ")
        self.l_input_file2 = QLabel(self.tab_2)
        self.l_input_file2.setGeometry(QRect(102, 50, 180, 15))#442, 50, 90, 15))
        self.l_input_file2.setText("Выберите файлы")
        self.l_name2 = QLabel(self.tab_2)
        self.l_name2.setGeometry(QRect(442, 50, 180, 15))#280, 140, 180, 16))
        self.l_name2.setText("Куда сохранить результат?")
        self.l_ciph2 = QLabel(self.tab_2)
        self.l_ciph2.setGeometry(QRect(84, 298, 180, 15))
        self.l_ciph2.setText("Убрать шифрованный трафик")
        self.l_arch2 = QLabel(self.tab_2)
        self.l_arch2.setGeometry(QRect(424, 298, 180, 15))
        self.l_arch2.setText("Заархивировать файлы")


        #self.le_dir2 = QLineEdit(self.tab_2)
        #self.le_dir2.setGeometry(QRect(110, 80, 211, 20))
        #self.le_dir2.setEnabled(False)
        self.le_file2 = QLineEdit(self.tab_2)
        self.le_file2.setGeometry(QRect(110, 80, 211, 20))#450, 80, 211, 20))
        self.le_file2.setReadOnly(True)
        self.le_name2 = QLineEdit(self.tab_2)
        self.le_name2.setGeometry(QRect(450, 80, 211, 20))#260, 170, 180, 20))

        #self.pb_dir2 = QPushButton(self.tab_2)
        #self.pb_dir2.setGeometry(QRect(80, 80, 21, 20))
        #self.pb_dir2.setIcon(QIcon('допочки\_folder.png'))
        #self.pb_dir2.clicked.connect(lambda gd: self.get_directory(2))
        self.pb_file2 = QPushButton(self.tab_2)
        self.pb_file2.setGeometry(QRect(80, 80, 21, 20))#420, 80, 21, 20))
        self.pb_file2.setIcon(QIcon('допочки\_folder.png'))
        self.pb_file2.clicked.connect(lambda gf: self.get_files(2))
        self.pb_name2 = QPushButton(self.tab_2)
        self.pb_name2.setGeometry(QRect(420, 80, 21, 20))#230, 170, 21, 20))
        self.pb_name2.setIcon(QIcon('допочки\_folder.png'))
        self.pb_name2.clicked.connect(lambda ed: self.extract_to_directory(2))
        self.pb_merge = QPushButton(self.tab_2)
        self.pb_merge.setGeometry(QRect(270, 170, 160, 20))
        self.pb_merge.setText("Объединить")
        self.pb_merge.clicked.connect(self.merge_it_motherFucker)

        self.line_4 = QFrame(self.tab_2)
        self.line_4.setGeometry(QRect(0, 280, 690, 15))
        self.line_4.setFrameShape(QFrame.HLine)
        self.line_4.setFrameShadow(QFrame.Sunken)
        self.line_5 = QFrame(self.tab_2)
        self.line_5.setGeometry(QRect(0, 580, 690, 15))
        self.line_5.setFrameShape(QFrame.HLine)
        self.line_5.setFrameShadow(QFrame.Sunken)

        self.pt_log2 = QPlainTextEdit(self.tab_2)
        self.pt_log2.setGeometry(QRect(20, 610, 651, 101))
        self.pt_log2.setReadOnly(True)

        self.graphicsView = QGraphicsView(self.tab_2)
        self.graphicsView.setGeometry(QRect(0, 330, 714, 277))
        self.scene = QGraphicsScene()
        self.graphicsView.setScene(self.scene)
        self.scene.addPixmap(QPixmap('допочки\_in_working_3.png'))

        self.l_merge.raise_()
        self.l_arch.raise_()
        #self.l_input_dir2.raise_()
        #self.l_or2.raise_()
        self.l_input_file2.raise_()
        self.l_name2.raise_()
        #self.radiobutton_3.raise_()
        #self.radiobutton_4.raise_()
        #self.pb_dir2.raise_()
        self.pb_file2.raise_()
        self.pb_name2.raise_()
        #self.le_dir2.raise_()
        self.le_file2.raise_()
        self.le_name2.raise_()
        self.line_4.raise_()
        self.line_5.raise_()
        self.pt_log2.raise_()



        #####------------------------------2_TAB

        #####------------------------------3_TAB

        self.tab_3 = QWidget()
        self.tabWidget.addTab(self.tab_3, "")
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), ("III Проверка на аномальную активность"))
        self.tab_3.setEnabled(False)

        self.l_filt3 = QLabel(self.tab_3)
        self.l_filt3.setGeometry(QRect(300, 10, 91, 16))
        self.l_filt3.setText("Выборка пакетов")

        self.l_input_file3 = QLabel(self.tab_3)
        self.l_input_file3.setGeometry(QRect(300, 50, 90, 15))
        self.l_input_file3.setText("Выберите файлы")

        self.pb_file3 = QPushButton(self.tab_3)
        self.pb_file3.setGeometry(QRect(220, 80, 21, 20))
        self.pb_file3.setIcon(QIcon('допочки\_folder.png'))
        self.pb_file3.clicked.connect(lambda gf: self.get_files(3))

        self.le_file3 = QLineEdit(self.tab_3)
        self.le_file3.setGeometry(QRect(250, 80, 211, 20))
        self.le_file3.setReadOnly(True)

        self.pb_graphy = QPushButton(self.tab_3)
        self.pb_graphy.setGeometry(QRect(270, 170, 160, 20))
        self.pb_graphy.setText("Построить граф")
        #self.pb_graphy.clicked.connect(self.graph_it)

        #self.label_6 = QLabel(self.tab_3)
        #self.pixmap = QPixmap('допочки\_in_working_1.png')
        #self.label_6.setPixmap(self.pixmap)

        self.l_filt3.raise_()
        self.l_input_file3.raise_()
        self.pb_file3.raise_()
        self.le_file3.raise_()


        #####------------------------------3_TAB

        #####----------------------------IN_WORK



        self.tab_4 = QWidget()
        self.tabWidget.addTab(self.tab_4, "")
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), ("...IV visualization..."))
        self.tab_4.setEnabled(False)


        self.label_7 = QLabel(self.tab_4)
        self.pixmap_2 = QPixmap('допочки\_in_working_2.png')
        self.label_7.setPixmap(self.pixmap_2)

        #####----------------------------IN_WORK





        self.tabWidget.setCurrentIndex(0)
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), ("I выборка пакетов"))
        QMetaObject.connectSlotsByName(self)

        self.show()

    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Ща закроется всё', "Ты чо, реально хочешь выйти?",
                                     QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
        if reply == QMessageBox.Yes:
            event.accept()
        else:
            event.ignore()

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


    def get_directory(self, gd):
        if gd == 1:
            result = QFileDialog.getExistingDirectory()
            #self.le_dir.setText(result)
            self.le_file.setDisabled(True)
            #self.le_dir.setEnabled(True)
            #self.radiobutton_2.setChecked(False)
            #self.radiobutton.setChecked(True)
        else:
            result = QFileDialog.getExistingDirectory()
            #self.le_dir2.setText(result)
            self.le_file2.setDisabled(True)
            #self.le_dir2.setEnabled(True)
            #self.radiobutton_4.setChecked(False)
            #self.radiobutton_3.setChecked(True)

    def get_files(self, gf):
        if gf == 1:
            result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)")
            #self.le_dir.setDisabled(True)
            self.le_file.setEnabled(True)
            #self.radiobutton.setChecked(False)
            #self.radiobutton_2.setChecked(True)
            if len(result):
                self.le_file.setText(", ".join(result))
        elif gf == 3:
            result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)")
            #self.le_dir.setDisabled(True)
            self.le_file3.setEnabled(True)
            #self.radiobutton.setChecked(False)
            #self.radiobutton_2.setChecked(True)
            if len(result):
                self.le_file3.setText(", ".join(result))
        else:
            result, bullshit = QFileDialog.getOpenFileNames(self, "Выберите pcap-файлы", getcwd(), "files (*.pcap *.pcapng)")
            #self.le_dir2.setDisabled(True)
            self.le_file2.setEnabled(True)
            #self.radiobutton_3.setChecked(False)
            #self.radiobutton_4.setChecked(True)
            if len(result):
                self.le_file2.setText(", ".join(result))

    def date_changed(self, dc):
        if dc == 1:
            self.dt_end.setMinimumDateTime(QDateTime(self.dt_beg.dateTime()))
        else:
            self.dt_beg.setMaximumDateTime(QDateTime(self.dt_end.dateTime()))

    def extract_to_directory(self, ed):
        if ed == 1:
            result, bullshit =QFileDialog.getSaveFileName(self, "Сохранить файл", getcwd(), "files (*.pcap *.pcapng)")
            self.le_name.setText(result)
        else:
            result, bullshit =QFileDialog.getSaveFileName(self, "Сохранить файл", getcwd(), "files (*.pcap *.pcapng)")
            self.le_name2.setText(result)


    def do_it_motherFucker(self):
        if self.filtering_is_on == 0:
            #if ((not self.radiobutton.isChecked() and not self.radiobutton_2.isChecked())\
            #    or (self.radiobutton.isChecked() and self.le_dir.text() == '')\
            #        or (self.radiobutton_2.isChecked() and self.le_file.text() == ''))\
            #            and self.le_name.text() == '':
            if self.le_file.text() == '' and self.le_name.text() == '':
                self.pt_log.appendPlainText("  " + "Какие файлы обработать? Куда сохранить? Такая неопределённость..")
            #elif (not self.radiobutton.isChecked() and not self.radiobutton_2.isChecked()) or (self.radiobutton.isChecked() and self.le_dir.text() == '') or (self.radiobutton_2.isChecked() and self.le_file.text() == ''):
            elif self.le_file.text() == '':
                self.pt_log.appendPlainText("  " + "Какие файлы обработать?")
            elif self.le_name.text() == '':
                self.pt_log.appendPlainText("  " + "Куда сохранить?")
            else:
                self.filtering_is_on = 1  # эти пиздецы в идеале нужно заменить на что-нибудь адекватное
                self.count_for_pr_b = 0 # эти пиздецы в идеале нужно заменить на что-нибудь адекватное
                self.progressBar.setValue(0)
                self.pb_start.setText("Остановить выборку")

                #my_directory = self.le_dir.text()
                pcap_files_in = self.le_file.text()
                pcap_file_out = self.le_name.text()
                per_quest = 0
                per_beg = ''
                per_end = ''
                prot_quest = 0
                net_prot = 0
                trans_prot = 0
                appl_prot = 0 ##
                ip_quest = 0
                netprot_mass = []
                transprot_mass = []
                addr_mass = []

                if (pcap_file_out.endswith(".pcap") or pcap_file_out.endswith(".pcapng")) == False:
                    pcap_file_out = pcap_file_out + ".pcap"

                self.pt_log.appendPlainText("Сохранить в:")
                self.pt_log.appendPlainText("  " + pcap_file_out)

                #if self.radiobutton.isChecked():
                #    onlyfiles = [my_directory + '/' + f for f in listdir(my_directory) if
                #                 f.endswith(".pcap") or f.endswith(".pcapng") and isfile(join(my_directory, f))]
                #    self.for_pr_b = len(onlyfiles)
#
                #    self.pt_log.appendPlainText("Выбрана директория:")
                #    self.pt_log.appendPlainText("  " + self.le_dir.text())
                #    self.pt_log.appendPlainText("С pcap-файлами:")
                #    for file in onlyfiles:
                #        bullshit, fname = file.rsplit('/', 1)
                #        self.pt_log.appendPlainText("  " + fname)

                #elif self.radiobutton_2.isChecked():
                onlyfiles = pcap_files_in.split(', ')
                self.for_pr_b = len(onlyfiles)

                self.pt_log.appendPlainText("Выбраны pcap-файлы:")
                for file in onlyfiles:
                    self.pt_log.appendPlainText("  " + (file))

                if self.cb_addr.isChecked() and self.pt_addr.toPlainText() != '':
                    ip_quest = 1
                    addr_mass = self.pt_addr.toPlainText().splitlines()

                if self.cb_time.isChecked():
                    per_quest = 1
                    per_beg = self.dt_beg.dateTime()
                    per_end = self.dt_end.dateTime()

                if self.cb_prot.isChecked():
                    prot_quest = 1
                    transprot_mass = self.transprot_mass
                    netprot_mass = self.netprot_mass

                if self.pt_transpr.toPlainText() != '':
                    trans_prot = 1
                if self.pt_netpr.toPlainText() != '':
                    net_prot = 1

                #self.radiobutton.setDisabled(True)
                #self.radiobutton_2.setDisabled(True)
                #self.l_input_dir.setDisabled(True)
                #self.l_or.setDisabled(True)
                self.l_input_file.setDisabled(True)
                #self.pb_dir.setDisabled(True)
                self.pb_file.setDisabled(True)
                #self.le_dir.setDisabled(True)
                self.le_file.setDisabled(True)
                self.cb_time.setDisabled(True)
                self.cb_prot.setDisabled(True)
                self.cb_addr.setDisabled(True)
                self.l_transpr.setDisabled(True)
                self.l_netpr.setDisabled(True)
                self.l_beg.setDisabled(True)
                self.l_end.setDisabled(True)
                self.l_name.setDisabled(True)
                self.l_filt.setDisabled(True)
                self.le_name.setDisabled(True)
                self.dt_beg.setDisabled(True)
                self.dt_end.setDisabled(True)
                self.pt_transpr.setDisabled(True)
                self.pt_netpr.setDisabled(True)
                self.pt_addr.setDisabled(True)
                self.pb_time.setDisabled(True)
                self.pb_transpr.setDisabled(True)
                self.pb_netpr.setDisabled(True)
                self.pb_addr.setDisabled(True)
                self.pb_name.setDisabled(True)

                self.worker = WorkerThread(onlyfiles, pcap_file_out, per_quest, per_beg, per_end, prot_quest, net_prot,
                                           netprot_mass, trans_prot, transprot_mass, appl_prot, ip_quest, addr_mass)
                self.worker.callback_received.connect(self.append_to_log)
                self.worker.start()
                self.pt_log.appendPlainText("")
                self.pt_log.appendPlainText("В работе:")
        elif self.filtering_is_on == 1:
            self.worker.terminate()
            self.pt_log.appendPlainText("")
            self.pt_log.appendPlainText("Работа прервана")
            self.pt_log.appendPlainText("")
            self.pt_log.appendPlainText("")
            self.go_to_starting_set()

    def append_to_log(self, x):
        self.count_for_pr_b += 1
        self.pt_log.appendPlainText("")
        self.pt_log.appendPlainText(x)
        self.progressBar.setValue(self.count_for_pr_b * 100 / (self.for_pr_b + 1))

        if self.progressBar.value() == 100:
            self.pt_log.appendPlainText("")
            self.pt_log.appendPlainText("")
            self.go_to_starting_set()

    def go_to_starting_set(self):
        self.filtering_is_on = 0
        self.pb_start.setText("Начать выборку")

        #self.radiobutton.setDisabled(False)
        #self.radiobutton_2.setDisabled(False)
        #self.l_input_dir.setDisabled(False)
        #self.l_or.setDisabled(False)
        self.l_input_file.setDisabled(False)
        #self.pb_dir.setDisabled(False)
        self.pb_file.setDisabled(False)
        #self.le_dir.setDisabled(False)
        self.le_file.setDisabled(False)
        self.cb_time.setDisabled(False)
        self.cb_prot.setDisabled(False)
        self.cb_addr.setDisabled(False)
        self.l_name.setDisabled(False)
        self.l_filt.setDisabled(False)
        self.le_name.setDisabled(False)
        self.pb_name.setDisabled(False)

        if self.cb_time.isChecked():
            self.dt_beg.setEnabled(True)
            self.dt_end.setEnabled(True)
            self.l_beg.setEnabled(True)
            self.l_end.setEnabled(True)

        if self.cb_prot.isChecked():
            self.l_transpr.setEnabled(True)
            self.l_netpr.setEnabled(True)
            self.pt_transpr.setEnabled(True)
            self.pt_netpr.setEnabled(True)
            self.pb_transpr.setEnabled(True)
            self.pb_netpr.setEnabled(True)

        if self.cb_addr.isChecked():
            self.pt_addr.setEnabled(True)
            self.pb_addr.setEnabled(True)

    def merge_it_motherFucker(self):
        #if self.radiobutton_3.isChecked():
        #    self.pt_log2.appendPlainText("Выбрана директория с pcap-файлами:")
        #    self.pt_log2.appendPlainText("  " + self.le_dir2.text())
        #    self.pt_log2.appendPlainText('Просматриваем "{}"...'.format(self.le_dir2.text()))
        #    onlyfiles = [self.le_dir2.text() + '/' + f for f in listdir(self.le_dir2.text()) if
        #                 f.endswith(".pcap") or f.endswith(".pcapng") and isfile(join(self.le_dir2.text(), f))]
        #    self.pt_log2.appendPlainText(str(onlyfiles))

        #elif self.radiobutton_4.isChecked():
        self.pt_log2.appendPlainText("Выбраны pcap-файлы:")
        self.pt_log2.appendPlainText("  " + self.le_file2.text())
        onlyfiles = self.le_file2.text().split(', ')
        self.pt_log2.appendPlainText('Работаем с "{}"...'.format(onlyfiles))

        merge_file_out = self.le_name2.text()
        if (merge_file_out.endswith(".pcap") or merge_file_out.endswith(".pcapng")) == False:
            merge_file_out = merge_file_out + ".pcap"

        self.pt_log2.appendPlainText("Сохранить в:")
        self.pt_log2.appendPlainText("  " + merge_file_out)
        self.pt_log2.appendPlainText("")

        merge.mergecap(onlyfiles, merge_file_out)
Example #28
0
class MainWidget(QWidget):
    '''
    The MainWidget class is the home screen of the app and allows the user to input parameters for analysis.

    Attributes:
        output_path (str): the output path selected by the user
        file (str): the file path selected by the user
        ad_number (int): the integer selected by the user for the averaging duration
        ad_unit (int): the unit of time selected by the user for the averaging duration
        time_selected (bool): whether or not the user has selected a specific time range
        VALID_FILES (list of str): the list of valid file types accepted
        AD_UNITS (list of str): the list of time units selectable by the user
        time_selectors (QWidget): a widget containing the time range inputs
        layout (QVBoxLayout): a vertical layout for the screen
    '''
    def __init__(self):
        super().__init__()
        # initialize variables
        self.output_path = None
        self.file = None
        self.ad_number = None
        self.ad_unit = None
        self.time_selected = False

        # single definition point for hardcoded values (valid file types and averaging duration units)
        self.VALID_FILES = ["xlsx", "xls", "csv"]
        self.AD_UNITS = ["Minutes", "Hours", "Days", "Weeks", "Months", "Years"]

        # create static UI elements
        title_label = QLabel("CDC Air Quality Analysis")
        title_label.setObjectName("title")
        file_select_layout = self.file_select_layout()
        output_path_layout = self.output_path_layout()
        averaging_duration_layout = self.averaging_duration_layout()
        time_range_layout = self.time_range_layout()
        self.time_selectors = self.create_time_selectors()

        # create process button and connect to function
        process_file = QPushButton("Process File")
        process_file.clicked.connect(self.begin_process)

        # define the layout of the screen
        self.layout = QVBoxLayout()
        self.layout.addWidget(title_label)
        self.layout.addLayout(file_select_layout)
        self.layout.addLayout(output_path_layout)
        self.layout.addLayout(averaging_duration_layout)
        self.layout.addLayout(time_range_layout)
        self.layout.addWidget(self.time_selectors)
        self.layout.addWidget(process_file)
        self.setLayout(self.layout)

    # define UI elements and layout for the file select input
    def file_select_layout(self):
        instruction_label = QLabel("Select Data File:")
        instruction_label.setObjectName("instruction")

        self.file_name = QLabel("No File Selected")
        self.file_name.setObjectName("fileName")
        self.file_name.setFixedWidth(200)

        button = QPushButton("Browse")
        button.setFixedWidth(100)
        button.clicked.connect(partial(self.get_file, self.file_name))

        layout = QHBoxLayout()
        layout.addWidget(instruction_label)
        layout.addWidget(self.file_name)
        layout.addWidget(button)
        layout.setContentsMargins(6, 10, 6, 8)

        return layout

    # define UI elements and layout for the output path select input
    def output_path_layout(self):
        instruction_label = QLabel("Select Output Path:")
        instruction_label.setObjectName("instruction")

        self.output_select = QLabel("No Path Selected")
        self.output_select.setObjectName("fileName")
        self.output_select.setFixedWidth(200)

        button = QPushButton("Browse")
        button.setFixedWidth(100)
        button.clicked.connect(partial(self.get_output, self.output_select))

        layout = QHBoxLayout()
        layout.addWidget(instruction_label)
        layout.addWidget(self.output_select)
        layout.addWidget(button)
        layout.setContentsMargins(6, 10, 6, 8)

        return layout

    # define UI elements and layout for averaging duration input
    def averaging_duration_layout(self):
        instruction_label = QLabel("Select Averaging Duration:")
        instruction_label.setObjectName("instruction")

        self.ad_number_input = QLineEdit(self)
        self.ad_number_input.setPlaceholderText("Input an Integer")
        self.ad_number_input.setFixedWidth(125)
        self.ad_number_input.setFixedHeight(25)

        # define dropdown menu (known as a ComboBox)
        self.ad_unit = self.AD_UNITS[0] # default
        comboBox = QComboBox(self)
        comboBox.setFixedWidth(100)
        for item in self.AD_UNITS:
            comboBox.addItem(item)
        comboBox.currentIndexChanged.connect(partial(self.selection_change, comboBox))

        layout = QHBoxLayout()
        layout.addWidget(instruction_label)
        layout.addWidget(self.ad_number_input)
        layout.addWidget(comboBox)
        layout.setContentsMargins(6, 8, 6, 8)

        return layout

    # called whenever the user makes a new selection from the averaging duration dropdown
    def selection_change(self, cb):
        self.ad_unit = cb.currentText()

    # define UI elements and layout for the time range input
    def time_range_layout(self):
        instruction_label = QLabel("Use Time Range?")
        instruction_label.setObjectName("instruction")

        # time range is optional, so these radio buttons formalize that choice
        yes_rb = QRadioButton("Yes")
        no_rb = QRadioButton("No")
        no_rb.setChecked(True)

        yes_rb.toggled.connect(partial(self.rb_state, yes_rb))
        no_rb.toggled.connect(partial(self.rb_state, no_rb))

        layout = QHBoxLayout()
        layout.addWidget(instruction_label)
        layout.addWidget(yes_rb)
        layout.addWidget(no_rb)
        layout.setContentsMargins(6,8,6,8)
        layout.insertSpacing(1, 85)
        layout.insertSpacing(3, 80)

        return layout

    # define UI elements and layout for the time range selectors
    def create_time_selectors(self):
        instruction_label = QLabel("Start Time:")
        instruction_label.setObjectName("instruction")

        self.start = QDateTimeEdit(self)
        self.start.setCalendarPopup(True)
        self.start.setDateTime(QDateTime.currentDateTime())

        instruction2_label = QLabel("End Time:")
        instruction2_label.setObjectName("instruction")

        self.end = QDateTimeEdit(self)
        self.end.setCalendarPopup(True)
        self.end.setDateTime(QDateTime.currentDateTime())

        layout = QHBoxLayout()
        layout.setContentsMargins(6, 8, 6, 10)
        layout.addWidget(instruction_label)
        layout.addWidget(self.start)
        layout.addWidget(instruction2_label)
        layout.addWidget(self.end)

        # define a new widget so we can enable and disable it based on the radio button input
        widget = QWidget()
        widget.setLayout(layout)
        widget.setFixedHeight(50)
        widget.setEnabled(False)

        return widget

    # called when the user clicks the select file button
    def get_file(self, label):
        # get valid file types from array
        valid_files = ""
        for ext in self.VALID_FILES:
            valid_files += "*." + ext + " "

        # open file explorer dialog prefilled with valid file types
        file_name, _ = QFileDialog.getOpenFileName(self, "Select Data Files", "",
                                                        "Data Files (" + valid_files.strip() +");;All Files (*)")
        # if user closes dialog without selecting a file path, it will return None
        if file_name:
            self.file = file_name.split("/")[-1]
            self.file_path = file_name
            label.setText(self.file)

    # called when the user clicks the select output path button
    def get_output(self, label):
        path = QFileDialog.getExistingDirectory(self, "Choose an Output Directory", options=QFileDialog.ShowDirsOnly)
        if path:
            self.output_path = path
            split_path = path.split("/")
            if len(split_path) >= 2:
                label.setText(split_path[-2] + "/" + split_path[-1])
            else:
                label.setText(self.output_path)

    # change the state of the radio buttons and toggle the time range widget
    def rb_state(self, clicked):
        if clicked.text() == "Yes" and clicked.isChecked() == True:
            self.time_selectors.setEnabled(True)
            self.time_selected = True
        elif clicked.text() == "No" and clicked.isChecked() == True:
            self.time_selectors.setEnabled(False)
            self.time_selected = False

    # perform input validation and begin processing
    def begin_process(self):
        main_window = self.parentWidget().parentWidget()
        # check that a file has been selected
        if not self.file:
            main_window.raise_error("Input Error",
                                    "No File Selected",
                                    "Please select a file for analysis.")
            return

        extension = self.file.split(".")[-1]
        # check that the file selected is a valid file type
        if not extension in self.VALID_FILES:
            main_window.raise_error("Input Error",
                                    "Invalid File Type Selected",
                                    "Valid file types include " + ", ".join(self.VALID_FILES) + ".")
            return

        # check that the user has inputted a number and unit for averaging duration
        self.ad_number = self.ad_number_input.text()
        if not self.ad_number or not self.ad_unit:
            main_window.raise_error("Input Error",
                                    "Invalid Averaging Duration Selected",
                                    "Please input an integer and unit for the averaging duration.")
            return

        # check that the ad_num input is actually a number
        try:
            self.ad_number = int(self.ad_number)
        except ValueError:
            main_window.raise_error("Input Error",
                                    "Invalid Averaging Duration Selected",
                                    "Averaging duration must be a whole number.")
            return

        # check that the ad_num input is actually an integer
        # we want the user to be made aware that it must be an integer
        if not round(self.ad_number) == self.ad_number:
            main_window.raise_error("Input Error",
                                    "Invalid Averaging Duration Selected",
                                    "Averaging duration must be a whole number.")
            return

        # if the user has chosen a time range, make sure that end time is not before start time
        if self.time_selected:
            start_time = self.start.dateTime()
            end_time = self.end.dateTime()
            if start_time > end_time:
                main_window.raise_error("Input Error",
                                        "Invalid Time Entered",
                                        "End Time cannot be greater than Start Time.")
                return
        else:
            start_time = None
            end_time = None

        # callback to main window to initiate process and change the screen
        main_window.start_analysis(
            self.file,
            self.file_path,
            self.output_path,
            self.ad_number,
            self.ad_unit,
            start_time,
            end_time
        )

    # reset and clear all inputs
    def reset(self):
        self.file = None
        self.file_name.setText("No File Selected")
        self.output_path = None
        self.output_select.setText("No Path Selected")
        self.ad_number = None
        self.ad_number_input.clear()
        self.start.setDateTime(QDateTime.currentDateTime())
        self.end.setDateTime(QDateTime.currentDateTime())
class StockMemoEditor(QDialog):
    def __init__(self,
                 sas: StockAnalysisSystem,
                 memo_record: RecordSet,
                 parent: QWidget = None):
        super(StockMemoEditor, self).__init__(parent)

        self.__sas = sas
        self.__memo_recordset = memo_record

        self.__current_stock = None
        self.__current_index = None
        self.__current_record: Record = None

        data_utility = self.__sas.get_data_hub_entry().get_data_utility(
        ) if self.__sas is not None else None
        self.__combo_stock = SecuritiesSelector(data_utility)
        self.__table_memo_index = EasyQTableWidget()

        self.__datetime_time = QDateTimeEdit(QDateTime().currentDateTime())
        self.__line_brief = QLineEdit()
        self.__text_record = QTextEdit()

        self.__button_new = QPushButton('新建')
        self.__button_apply = QPushButton('保存')

        self.init_ui()
        self.config_ui()

    def init_ui(self):
        root_layout = QHBoxLayout()
        self.setLayout(root_layout)

        group_box, group_layout = create_v_group_box('')
        group_layout.addWidget(self.__combo_stock, 1)
        group_layout.addWidget(self.__table_memo_index, 99)
        root_layout.addWidget(group_box, 4)

        group_box, group_layout = create_v_group_box('')
        group_layout.addLayout(
            horizon_layout(
                [QLabel('时间:'), self.__datetime_time, self.__button_new],
                [1, 99, 1]))
        group_layout.addLayout(
            horizon_layout([QLabel('摘要:'), self.__line_brief], [1, 99]))
        group_layout.addWidget(self.__text_record)
        group_layout.addLayout(
            horizon_layout([QLabel(''), self.__button_apply], [99, 1]))
        root_layout.addWidget(group_box, 6)

        self.setMinimumSize(500, 600)

    def config_ui(self):
        self.setWindowTitle('笔记编辑器')
        self.__datetime_time.setCalendarPopup(True)

        self.__combo_stock.setEditable(False)
        self.__combo_stock.currentIndexChanged.connect(
            self.on_combo_select_changed)

        self.__table_memo_index.insertColumn(0)
        self.__table_memo_index.insertColumn(0)
        self.__table_memo_index.setHorizontalHeaderLabels(['时间', '摘要'])
        self.__table_memo_index.setSelectionMode(
            QAbstractItemView.SingleSelection)
        self.__table_memo_index.setSelectionBehavior(
            QAbstractItemView.SelectRows)
        self.__table_memo_index.itemSelectionChanged.connect(
            self.on_table_selection_changed)
        self.__table_memo_index.horizontalHeader().setSectionResizeMode(
            QHeaderView.ResizeToContents)

        self.__button_new.clicked.connect(self.on_button_new)
        self.__button_apply.clicked.connect(self.on_button_apply)

        # self.setWindowFlags(
        #     QtCore.Qt.Window |
        #     QtCore.Qt.CustomizeWindowHint |
        #     QtCore.Qt.WindowTitleHint |
        #     QtCore.Qt.WindowCloseButtonHint |
        #     QtCore.Qt.WindowStaysOnTopHint
        # )

    def on_button_new(self):
        if self.__current_stock is None:
            QMessageBox.information(self, '错误', '请选择需要做笔记的股票', QMessageBox.Ok,
                                    QMessageBox.Ok)
        self.create_new_memo(None)

    def on_button_apply(self):
        _time = self.__datetime_time.dateTime().toPyDateTime()
        brief = self.__line_brief.text()
        content = self.__text_record.toPlainText()

        if not str_available(brief):
            QMessageBox.information(self, '错误', '请至少填写笔记摘要', QMessageBox.Ok,
                                    QMessageBox.Ok)
            return

        if self.__current_index is not None:
            ret = self.__current_record.update_record(self.__current_index,
                                                      _time, brief, content,
                                                      True)
        else:
            ret, index = self.__current_record.add_record(
                _time, brief, content, 'memo', True)
            self.__current_index = index
        if ret:
            self.__reload_stock_memo()

    def on_combo_select_changed(self):
        input_securities = self.__combo_stock.get_input_securities()
        self.__load_stock_memo(input_securities)

    def on_table_selection_changed(self):
        if self.__current_record is None:
            return
        sel_index = self.__table_memo_index.GetCurrentIndex()
        if sel_index < 0:
            return
        sel_item = self.__table_memo_index.item(sel_index, 0)
        if item is None:
            return
        df_index = sel_item.data(Qt.UserRole)
        self.__load_memo_by_index(df_index)

    def select_stock(self, stock_identity: str):
        index = self.__combo_stock.findData(stock_identity)
        if index != -1:
            print('Select combox index: %s' % index)
            self.__combo_stock.setCurrentIndex(index)
        else:
            print('No index in combox for %s' % stock_identity)
            self.__combo_stock.setCurrentIndex(-1)
            self.__load_stock_memo(stock_identity)

    def select_memo_by_time(self, _time: datetime.datetime):
        if self.__current_record is None or self.__current_record.is_empty():
            self.create_new_memo(_time)
            return

        df = self.__current_record.get_records('memo')
        time_serial = df['time'].dt.normalize()
        select_df = df[time_serial == _time.replace(
            hour=0, minute=0, second=0, microsecond=0)]

        select_index = None
        for index, row in select_df.iterrows():
            select_index = index
            break

        if select_index is not None:
            self.select_memo_by_index(select_index)
        else:
            self.create_new_memo(_time)

    def select_memo_by_index(self, index: int):
        for row in range(0, self.__table_memo_index.rowCount()):
            table_item = self.__table_memo_index.item(row, 0)
            row_index = table_item.data(Qt.UserRole)
            if row_index == index:
                self.__table_memo_index.selectRow(row)
                break

    def create_new_memo(self, _time: datetime.datetime):
        self.__table_memo_index.clearSelection()
        if _time is not None:
            self.__datetime_time.setDateTime(_time)
        self.__line_brief.setText('')
        self.__text_record.setText('')
        self.__current_index = None

    # -------------------------------------------------------------------

    def __load_stock_memo(self, stock_identity: str):
        print('Load stock memo for %s' % stock_identity)

        self.__table_memo_index.clear()
        self.__table_memo_index.setRowCount(0)
        self.__table_memo_index.setHorizontalHeaderLabels(['时间', '摘要'])

        self.__current_stock = stock_identity
        self.__current_record = None
        self.__current_index = None

        if self.__memo_recordset is None or \
                self.__current_stock is None or self.__current_stock == '':
            return

        self.__current_record = self.__memo_recordset.get_record(
            stock_identity)
        df = self.__current_record.get_records('memo')

        select_index = None
        for index, row in df.iterrows():
            if select_index is None:
                select_index = index
            self.__table_memo_index.AppendRow(
                [datetime2text(row['time']), row['brief']], index)
        self.select_memo_by_index(select_index)

    def __reload_stock_memo(self):
        self.__line_brief.setText('')
        self.__text_record.setText('')
        self.__table_memo_index.clear()
        self.__table_memo_index.setRowCount(0)
        self.__table_memo_index.setHorizontalHeaderLabels(['时间', '摘要'])

        if self.__current_record is None:
            print('Warning: Current record is None, cannot reload.')
            return
        df = self.__current_record.get_records('memo')

        select_index = self.__current_index
        for index, row in df.iterrows():
            if select_index is None:
                select_index = index
            self.__table_memo_index.AppendRow(
                [datetime2text(row['time']), row['brief']], index)
        self.select_memo_by_index(select_index)

    def __load_memo_by_index(self, index: int):
        self.__table_memo_index.clearSelection()
        if self.__current_record is None or index is None:
            return

        df = self.__current_record.get_records('memo')
        s = df.loc[index]
        if len(s) == 0:
            return
        self.__current_index = index

        _time = s['time']
        brief = s['brief']
        content = s['content']

        self.__datetime_time.setDateTime(to_py_datetime(_time))
        self.__line_brief.setText(brief)
        self.__text_record.setText(content)
Example #30
0
class MainWindow(QWidget):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.notifications_table = QTableWidget()
        self.notification_title = QLineEdit()
        self.notification_description = QLineEdit()
        self.notification_type = QComboBox()
        self.one_time_notification_details = QComboBox()
        self.notification_date_time = QDateTimeEdit()
        self.add_notification_button = QPushButton()
        self.notification_list = []
        self.initialize_data()
        self.init_ui()

    def init_ui(self):

        super(MainWindow,
              self).setWindowIcon(QIcon("./resources/icons/icon.png"))
        vertical_box = QVBoxLayout()
        self.setLayout(vertical_box)
        notifications_group = QGroupBox()
        notifications_group.setCheckable(False)
        notifications_group.setTitle("Upcoming notifications.")
        vertical_box.addWidget(notifications_group)
        vertical_table_box = QVBoxLayout()
        notifications_group.setLayout(vertical_table_box)
        vertical_table_box.addWidget(self.notifications_table)
        self.notifications_table.setColumnCount(6)
        self.notifications_table.setRowCount(3)
        self.notifications_table.setHorizontalHeaderLabels([
            'Title', 'Description', 'Notification type', 'Time',
            'Remaining time', 'Action'
        ])
        push_button = QPushButton("Przycisk")
        push_button.setStyleSheet("QPushButton{ background-color: #ff1234 }")
        self.notifications_table.setCellWidget(0, 5, push_button)
        add_notification_group = QGroupBox()
        add_notification_group.setTitle("Add new notification.")
        add_notification_group.setCheckable(False)
        vertical_box.addWidget(add_notification_group)
        add_notification_group_layout = QVBoxLayout()
        add_notification_group.setLayout(add_notification_group_layout)
        add_notification_first_line = QHBoxLayout()
        add_notification_second_line = QHBoxLayout()
        add_notification_third_line = QHBoxLayout()
        add_notification_fourth_line = QHBoxLayout()
        add_notification_group_layout.addLayout(add_notification_first_line)
        add_notification_group_layout.addLayout(add_notification_second_line)
        add_notification_group_layout.addLayout(add_notification_third_line)
        add_notification_group_layout.addLayout(add_notification_fourth_line)
        self.notification_date_time.setDateTime(QDateTime.currentDateTime())
        notification_type_items = [
            "One-time notification", "Cyclical notification"
        ]
        self.notification_type.addItems(notification_type_items)
        one_time_notification_details_types = [
            "At the exact time", "After a given time"
        ]
        self.one_time_notification_details.addItems(
            one_time_notification_details_types)
        cyclical_notification_details = QComboBox()
        add_notification_first_line.addWidget(QLabel("Title:"))
        add_notification_first_line.addWidget(self.notification_title)
        add_notification_first_line.addStretch()
        add_notification_first_line.addWidget(QLabel("Notification type:"))
        add_notification_first_line.addWidget(self.notification_type)
        add_notification_second_line.addWidget(QLabel("Description"))
        add_notification_second_line.addWidget(self.notification_description)
        add_notification_second_line.addStretch()
        add_notification_second_line.addWidget(QLabel("Notification details"))
        add_notification_second_line.addWidget(
            self.one_time_notification_details)
        add_notification_third_line.addStretch()
        add_notification_third_line.addWidget(QLabel("Pick a time: "))
        add_notification_third_line.addWidget(self.notification_date_time)
        self.add_notification_button.clicked.connect(self.handle_add_button)
        self.add_notification_button.setText("Add")
        add_notification_fourth_line.addStretch()
        add_notification_fourth_line.addWidget(self.add_notification_button)
        self.setGeometry(600, 300, 600, 300)
        self.setWindowTitle("Reminder")
        self.show()

    def save_data(self) -> None:
        pass

    def initialize_data(self) -> None:
        pass

    def handle_add_button(self) -> None:
        pass

    def handle_notification_type_changed(self) -> None:
        pass

    def handle_notification_details_changed(self) -> None:
        pass

    def handle_time_changed(self) -> None:
        pass
class StockMemoEditor(QDialog):
    def __init__(self, history: History):
        super(StockMemoEditor, self).__init__()

        self.__history = history
        self.__source = ''
        self.__current_record = None

        self.__label_uuid = QLabel()
        self.__label_source = QLabel()
        self.__text_record = QTextEdit()
        self.__datetime_time = QDateTimeEdit(QDateTime.currentDateTime())

        self.__button_apply = QPushButton('保存')
        self.__button_cancel = QPushButton('取消')

        self.init_ui()
        self.config_ui()

    def init_ui(self):
        root_layout = QVBoxLayout()
        self.setLayout(root_layout)

        group_box, group_layout = create_v_group_box('')
        group_layout.addWidget(self.__label_uuid)
        group_layout.addWidget(self.__label_source)
        group_layout.addWidget(self.__datetime_time)
        # group_layout.addLayout(horizon_layout([QLabel('笔记ID'), self.__label_uuid]))
        # group_layout.addLayout(horizon_layout([QLabel('笔记文件'), self.__label_source]))
        # group_layout.addLayout(horizon_layout([QLabel('记录时间'), self.__datetime_time]))

        root_layout.addWidget(group_box, 0)
        root_layout.addWidget(self.__text_record, 10)

        root_layout.addLayout(horizon_layout([self.__button_apply, self.__button_cancel]))

        self.setMinimumSize(500, 600)

    def config_ui(self):
        self.__label_uuid.setEnabled(False)
        self.__label_source.setEnabled(False)
        self.setWindowTitle('笔记')
        self.__datetime_time.setCalendarPopup(True)

        self.__button_apply.clicked.connect(self.on_button_apply)
        self.__button_cancel.clicked.connect(self.on_button_cancel)

    def on_button_apply(self):
        if self.__current_record is None:
            self.__current_record = HistoricalRecord()
        else:
            self.__current_record.reset()

        if not self.ui_to_record(self.__current_record):
            QMessageBox.information(self,
                                    QtCore.QCoreApplication.translate('History', '错误'),
                                    QtCore.QCoreApplication.translate('History', '采集界面数据错误'),
                                    QMessageBox.Ok, QMessageBox.Ok)
            return
        if self.__source is None or self.__source == '':
            QMessageBox.information(self,
                                    QtCore.QCoreApplication.translate('History', '错误'),
                                    QtCore.QCoreApplication.translate('History', '没有指定数据源,无法保存'),
                                    QMessageBox.Ok, QMessageBox.Ok)
            return

        self.__current_record.set_source(self.__source)
        self.__history.update_records([self.__current_record])

        records = self.__history.get_record_by_source(self.__source)
        result = HistoricalRecordLoader.to_local_source(records, self.__source)

        if not result:
            QMessageBox.information(self,
                                    QtCore.QCoreApplication.translate('History', '错误'),
                                    QtCore.QCoreApplication.translate('History', '保存到数据源 [%s] 失败' % self.__source),
                                    QMessageBox.Ok, QMessageBox.Ok)
            return

        self.close()

    def on_button_cancel(self):
        self.close()

    # ---------------------------------------------------------------------------

    def set_memo(self, memo: HistoricalRecord):
        self.__current_record = memo
        self.__source = memo.source()
        self.record_to_ui(memo)

    def set_source(self, source: str):
        self.__source = source

    def set_memo_datetime(self, date_time: datetime.datetime):
        self.__datetime_time.setDateTime(date_time)

    # -------------------------------- Operation --------------------------------

    def clear_ui(self):
        self.__label_uuid.setText('')
        self.__label_source.setText('')
        self.__text_record.clear()

    def ui_to_record(self, record: HistoricalRecord) -> bool:
        input_time = self.__datetime_time.dateTime()
        input_memo = self.__text_record.toPlainText()
        date_time = input_time.toPyDateTime()

        record.set_label_tags('time', date_time.strftime('%Y-%m-%d %H:%M:%S'))
        record.set_label_tags('event', input_memo)
        record.set_focus_label('time')
        return True

    def record_to_ui(self, record: HistoricalRecord or str):
        self.clear_ui()

        self.__label_uuid.setText(LabelTagParser.tags_to_text(record.uuid()))
        self.__label_source.setText(self.__source)
        self.__text_record.setText(LabelTagParser.tags_to_text(record.event()))

        since = record.since()
        pytime = HistoryTime.tick_to_pytime(since)
        self.__datetime_time.setDateTime(pytime)
Example #32
0
class Downtime(QDialog):
    """
        Class who create Downtime QDialog for hosts/services
    """
    def __init__(self, parent=None):
        super(Downtime, self).__init__(parent)
        self.setWindowTitle('Request a Downtime')
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setStyleSheet(get_css())
        self.setWindowIcon(QIcon(get_image_path('icon')))
        self.setMinimumSize(360, 460)
        # Fields
        self.fixed = True
        self.duration = QTimeEdit()
        self.start_time = QDateTimeEdit()
        self.end_time = QDateTimeEdit()
        self.comment_edit = QTextEdit()

    def initialize(self, item_type, item_name, comment):
        """
        Initialize Downtime QDialog

        :param item_type: type of item to acknowledge : host | service
        :type item_type: str
        :param item_name: name of the item to acknowledge
        :type item_name: str
        :param comment: the default comment of action
        :type comment: str
        """

        # Main layout
        main_layout = QVBoxLayout(self)
        main_layout.setContentsMargins(0, 0, 0, 0)

        main_layout.addWidget(get_logo_widget(self))

        downtime_widget = QWidget()
        downtime_widget.setObjectName('login')
        downtime_layout = QGridLayout(downtime_widget)

        ack_title = QLabel('<h2>Request a downtime</h2>')
        downtime_layout.addWidget(ack_title, 0, 0, 1, 3)

        host_label = QLabel('<h2>%s: %s</h2>' %
                            (item_type.capitalize(), item_name))
        downtime_layout.addWidget(host_label, 1, 0, 1, 1)

        options_label = QLabel('Downtime options:')
        options_label.setObjectName('actions')
        downtime_layout.addWidget(options_label, 2, 0, 1, 1)

        fixed_checkbox = QCheckBox()
        fixed_checkbox.setObjectName('actions')
        fixed_checkbox.setChecked(self.fixed)
        fixed_checkbox.setFixedSize(18, 18)
        downtime_layout.addWidget(fixed_checkbox, 2, 1, 1, 1)

        fixed_label = QLabel('Fixed')
        fixed_label.setObjectName('actions')
        downtime_layout.addWidget(fixed_label, 2, 2, 1, 1)

        fixed_info = QLabel(
            '<i>If checked, downtime will start and end at the times specified'
            ' by the “start time” and “end time” fields.</i>')
        fixed_info.setWordWrap(True)
        downtime_layout.addWidget(fixed_info, 3, 0, 1, 3)

        duration_label = QLabel('Duration')
        duration_label.setObjectName('actions')
        downtime_layout.addWidget(duration_label, 4, 0, 1, 1)

        duration_clock = QLabel()
        duration_clock.setPixmap(QPixmap(get_image_path('clock')))
        downtime_layout.addWidget(duration_clock, 4, 1, 1, 1)
        duration_clock.setFixedSize(16, 16)
        duration_clock.setScaledContents(True)

        self.duration.setTime(QTime(4, 00))
        self.duration.setDisplayFormat("HH'h'mm")
        downtime_layout.addWidget(self.duration, 4, 2, 1, 1)

        duration_info = QLabel(
            '<i>Sets the duration if it is a non-fixed downtime.</i>')
        downtime_layout.addWidget(duration_info, 5, 0, 1, 3)

        date_range_label = QLabel('Downtime date range')
        date_range_label.setObjectName('actions')
        downtime_layout.addWidget(date_range_label, 6, 0, 1, 1)

        calendar_label = QLabel()
        calendar_label.setPixmap(QPixmap(get_image_path('calendar')))
        calendar_label.setFixedSize(16, 16)
        calendar_label.setScaledContents(True)
        downtime_layout.addWidget(calendar_label, 6, 1, 1, 1)

        start_time_label = QLabel('Start time:')
        downtime_layout.addWidget(start_time_label, 7, 0, 1, 1)

        self.start_time.setCalendarPopup(True)
        self.start_time.setDateTime(datetime.datetime.now())
        self.start_time.setDisplayFormat("dd/MM/yyyy HH'h'mm")
        downtime_layout.addWidget(self.start_time, 7, 1, 1, 2)

        end_time_label = QLabel('End time:')
        downtime_layout.addWidget(end_time_label, 8, 0, 1, 1)

        self.end_time.setCalendarPopup(True)
        self.end_time.setDateTime(datetime.datetime.now() +
                                  datetime.timedelta(hours=2))
        self.end_time.setDisplayFormat("dd/MM/yyyy HH'h'mm")
        downtime_layout.addWidget(self.end_time, 8, 1, 1, 2)

        self.comment_edit.setText(comment)
        self.comment_edit.setMaximumHeight(60)
        downtime_layout.addWidget(self.comment_edit, 9, 0, 1, 3)

        request_btn = QPushButton('REQUEST DOWNTIME', self)
        request_btn.clicked.connect(self.handle_accept)
        request_btn.setObjectName('valid')
        request_btn.setMinimumHeight(30)
        request_btn.setDefault(True)
        downtime_layout.addWidget(request_btn, 10, 0, 1, 3)

        main_layout.addWidget(downtime_widget)

    def duration_to_seconds(self):
        """
        Return "duration" QTimeEdit value in seconds

        :return: "duration" in seconds
        :rtype: int
        """

        return QTime(0, 0).secsTo(self.duration.time())

    def handle_accept(self):
        """
        Check if end_time timestamp is not lower than start_time

        """

        if self.start_time.dateTime().toTime_t() > self.end_time.dateTime(
        ).toTime_t():
            logger.warning(
                'Try to add Downtime with "End Time" lower than "Start Time"')
        else:
            self.accept()

    def mousePressEvent(self, event):
        """ QWidget.mousePressEvent(QMouseEvent) """

        self.offset = event.pos()

    def mouseMoveEvent(self, event):
        """ QWidget.mousePressEvent(QMouseEvent) """

        try:
            x = event.globalX()
            y = event.globalY()
            x_w = self.offset.x()
            y_w = self.offset.y()
            self.move(x - x_w, y - y_w)
        except AttributeError as e:
            logger.warning('Move Event %s: %s', self.objectName(), str(e))
Example #33
0
class LogFilterDialog(QDialog):
    OPERATION_OPTIONS = ['', 'insert', 'delete']
    TABLENAME_OPTIONS = ['', 'blocks', 'devices', 'measurements',\
                        'raw_data_view']

    def __init__(self, parent=None):
        super(LogFilterDialog, self).__init__(parent)
        self.accepted.connect(self.createFilter)

        self.operationCombo = QComboBox()
        self.operationCombo.addItems(LogFilterDialog.OPERATION_OPTIONS)
        self.tablenameCombo = QComboBox()
        self.tablenameCombo.addItems(LogFilterDialog.TABLENAME_OPTIONS)

        self.fromEdit = QDateTimeEdit()
        self.toEdit = QDateTimeEdit()

        groupLayout = QFormLayout()
        groupLayout.addRow("Od: ", self.fromEdit)
        groupLayout.addRow("Do: ", self.toEdit)
        groupLayout.addRow("Operace: ", self.operationCombo)
        groupLayout.addRow("Tabulka: ", self.tablenameCombo)

        rejectButton = QPushButton("Storno")
        rejectButton.clicked.connect(self.reject)
        acceptButton = QPushButton("OK")
        acceptButton.clicked.connect(self.accept)

        buttonsLayout = QHBoxLayout()
        buttonsLayout.addStretch(1)
        buttonsLayout.addWidget(acceptButton)
        buttonsLayout.addWidget(rejectButton)

        layout = QVBoxLayout()
        layout.addLayout(groupLayout)
        layout.addSpacing(12)
        layout.addLayout(buttonsLayout)
        self.setLayout(layout)

        self.setMinimumWidth(300)
        self.setWindowTitle("Filtrování logů")

    def initControls(self, filter_):
        selected = filter_.get('operation', '')
        try:
            index = LogFilterDialog.OPERATION_OPTIONS.index(selected)
        except ValueError:
            index = 0
        self.operationCombo.setCurrentIndex(index)

        selected = filter_.get('tablename', '')
        try:
            index = LogFilterDialog.TABLENAME_OPTIONS.index(selected)
        except ValueError:
            index = 0
        self.tablenameCombo.setCurrentIndex(index)

        start = filter_.get('start_datetime', None)
        if start is None:
            start = datetime.utcnow()
            start = calendar.timegm(start.timetuple()) - 3600*24
        else:
            start = calendar.timegm(start.timetuple())
        
        end = filter_.get('end_datetime', datetime.utcnow())
        end = calendar.timegm(end.timetuple())
        self.fromEdit.setDateTime(QDateTime.fromTime_t(start, TZ))
        self.toEdit.setDateTime(QDateTime.fromTime_t(end, TZ))

    def getFilter(self):
        filter_ = {}

        start = self.fromEdit.dateTime().toTime_t()
        end = self.toEdit.dateTime().toTime_t()
        filter_['start_datetime'] = datetime.utcfromtimestamp(start)
        filter_['end_datetime'] = datetime.utcfromtimestamp(end)
        if self.operationCombo.currentText():
            filter_['operation'] = self.operationCombo.currentText()
        if self.tablenameCombo.currentText():
            filter_['tablename'] = self.tablenameCombo.currentText()

        return filter_

    @pyqtSlot()
    def createFilter(self):
        self._filter = self.getFilter()

    def filter(self):
        return self._filter
class DataHubUi(QWidget):
    def __init__(self, data_center: UniversalDataCenter):
        super(DataHubUi, self).__init__()

        self.__data_center = data_center
        self.__translate = QtCore.QCoreApplication.translate

        self.__combo_uri = QComboBox()
        self.__line_identity = QLineEdit()
        self.__table_main = EasyQTableWidget()
        self.__datetime_since = QDateTimeEdit()
        self.__datetime_until = QDateTimeEdit()
        self.__button_query = QPushButton(self.__translate('', 'Query'))
        self.__check_identity_enable = QCheckBox(
            self.__translate('', 'Identity'))
        self.__check_datetime_enable = QCheckBox(
            self.__translate('', 'Datetime'))

        self.init_ui()

    # ---------------------------------------------------- UI Init -----------------------------------------------------

    def init_ui(self):
        self.__layout_control()
        self.__config_control()

    def __layout_control(self):
        main_layout = QVBoxLayout()
        self.setLayout(main_layout)

        line = QHBoxLayout()
        line.addWidget(QLabel(self.__translate('', 'URI')), 0)
        line.addWidget(self.__combo_uri, 10)
        main_layout.addLayout(line)

        line = QHBoxLayout()
        line.addWidget(self.__check_identity_enable, 0)
        line.addWidget(self.__line_identity, 10)
        main_layout.addLayout(line)

        line = QHBoxLayout()
        line.addWidget(self.__check_datetime_enable, 0)
        line.addWidget(self.__datetime_since, 10)
        line.addWidget(self.__datetime_until, 10)
        main_layout.addLayout(line)

        line = QHBoxLayout()
        line.addWidget(QLabel(' '), 10)
        line.addWidget(self.__button_query, 1)
        main_layout.addLayout(line)

        main_layout.addWidget(self.__table_main)

    def __config_control(self):
        # self.__combo_uri.setEditable(True)
        self.__check_identity_enable.setChecked(True)
        self.__check_datetime_enable.setChecked(True)
        self.__datetime_since.setDateTime(default_since())
        self.__datetime_until.setDateTime(now())
        self.__button_query.clicked.connect(self.on_button_query)

        all_uri = self.__data_center.get_all_uri()
        for uri in all_uri:
            self.__combo_uri.addItem(uri)

    def on_button_query(self):
        uri = self.__combo_uri.currentText()
        identity = self.__line_identity.text(
        ) if self.__check_identity_enable.isChecked() else None
        since = self.__datetime_since.dateTime().toPyDateTime(
        ) if self.__check_datetime_enable.isChecked() else None
        until = self.__datetime_until.dateTime().toPyDateTime(
        ) if self.__check_datetime_enable.isChecked() else None

        result = self.__data_center.query(
            uri, identity,
            (since, until)) if self.__data_center is not None else None

        if result is not None and '_id' in result.columns:
            del result['_id']
            write_df_to_qtable(result, self.__table_main)
Example #35
0
class MainWindow(QWidget):
    
    def __init__(self, parent=None):

        super().__init__(parent) 
        self.files = files.get_files()
        self.height = 300
        self.checkboxes = []
        self.col_selects = []
        self.initUI()
        
        
    def initUI(self):  

        self.layout = QVBoxLayout()
        pic = QLabel()
        pic.setPixmap(QPixmap(os.getcwd() + "/logo3.jpg"))
        self.layout.addWidget(pic)

        self.flash_msg = QLabel("")
        self.flash_msg.setStyleSheet("QLabel { color : red; }")
        self.layout.addWidget(self.flash_msg)
        self.flash_msg.hide()

        self.layout.addWidget(QLabel("Wähle Größen:"))

        for file in self.files:
            checkbox = QCheckBox()
            text = "{} ({})".format(str(file), file.unit)
            checkbox.setText(text)
            self.layout.addWidget(checkbox)
            self.checkboxes.append(checkbox)

            col_select = Col_select(file.columns)
            col_select.hide()
            self.col_selects.append(col_select)
            self.layout.addWidget(col_select)

            checkbox.stateChanged.connect(self.toggle_checkbox(col_select))

        self._set_date_time_edit()
        button = QPushButton("Weiter")
        button.clicked.connect(self.plot) 
        self.layout.addWidget(button)

        self.setGeometry(300, 300, 200, self.height)
        self.setLayout(self.layout) 
        self.setWindowTitle('Csv Plotter')
        self.show()

    def _set_date_time_edit(self):

        gridLayout = QGridLayout()
        self.start = QDateTimeEdit()
        self.end = QDateTimeEdit()
        gridLayout.addWidget(QLabel("Startzeit"), 0, 0)
        gridLayout.addWidget(self.start, 0, 1)
        gridLayout.addWidget(QLabel("Endzeit"), 1, 0)
        gridLayout.addWidget(self.end, 1, 1)
        self.layout.addLayout(gridLayout)

    def _check_submission(self, files_, columns):
        "checks if submit is valid, shows error message if not"
        msg = ""
        for idx, col in enumerate(columns):
            if col == []:
                msg = ("Bitte eine Größe zu folgender Kategorie auswählen: {}"
                        .format(files_[idx].quantity))
        if len(set((file.unit for file in files_))) != 1:
                msg = "Die Ausgewählten Größen haben unterschiedliche Einheiten."
                       
        if msg:
            self.flash_msg.setText(msg)
            self.flash_msg.show()
            return False
        self.flash_msg.hide()
        return True

    def plot(self):

        files_and_columns = [(file, col_select) for file, checkbox, col_select 
                            in zip(self.files, self.checkboxes, self.col_selects) 
                            if checkbox.isChecked()]
        files_ = [file for file, col in files_and_columns]
        columns = [col.get_selected() for file, col in files_and_columns]

        if not self._check_submission(files_, columns):
            return

        files.plot_files(self.start.dateTime().toPyDateTime(),
              self.end.dateTime().toPyDateTime(), files_, columns)

    def _set_start(self, py_datetime):

        qt_datetime = _datetime_to_Qdatetime(py_datetime)
        if self.start.dateTime() < qt_datetime:
             self.start.setDateTime(qt_datetime)

    def _set_end(self, py_datetime):

        qt_datetime = _datetime_to_Qdatetime(py_datetime)
        default = QDateTime.fromString("2000-01-01 00:00:00,0" , "yyyy-MM-dd HH:mm:ss,z")
        if self.end.dateTime() > qt_datetime or self.end.dateTime() == default:
             self.end.setDateTime(qt_datetime)


    def toggle_checkbox(self, cb):
        "expand or collapse more options"
        def wrapped():
            cb.show() if cb.isHidden() else cb.hide()
            self.height += 100 if cb.isHidden() else - 100
            self.resize(200, self.height)
            file_ind = self.col_selects.index(cb)
            file = self.files[file_ind]
            self._set_start(file.start)
            self._set_end(file.end)
        return wrapped
Example #36
0
class QtDBConsoleWindow(QMainWindow):
    def __init__(self, master):
        super(QtDBConsoleWindow, self).__init__()
        self.master = master
        self.connection = self.master.connection
        self.GroupBoxSeg = [1, 10, 1]
        self.processing = []
        #Fixme: QTimer to be added to update the page automatically

        self.mainWidget = QWidget()
        self.mainLayout = QGridLayout()
        self.mainWidget.setLayout(self.mainLayout)
        self.setCentralWidget(self.mainWidget)

        self.occupied()
        self.setLoginUI()
        self.createHeadLine()
        self.createMain()
        self.createApp()
        if isActive(self.connection):
            self.connectDB()

    def setLoginUI(self):
        self.setGeometry(200, 200, 600, 1200)
        self.setWindowTitle('Database Console')

        self.menubar = self.menuBar()
        self.menubar.setNativeMenuBar(False)

        ###################################################
        ##  Database Menu
        ###################################################
        self.actionDatabase = self.menubar.addMenu("&Database")

        self.ViewerAction = QAction("&View Table")
        self.ViewerAction.triggered.connect(self.viewTable)
        self.actionDatabase.addAction(self.ViewerAction)

        ###################################################
        ##  Image Menu
        ###################################################
        self.actionImage = self.menubar.addMenu("&Image")

        self.InsertImgAction = QAction("&Insert Image")
        self.InsertImgAction.triggered.connect(self.insertImage)
        self.actionImage.addAction(self.InsertImgAction)

        self.ViewImgAction = QAction("&View Image")
        self.ViewImgAction.triggered.connect(self.viewImage)
        self.actionImage.addAction(self.ViewImgAction)

        ###################################################
        ##  Shipment Menu
        ###################################################
        self.actionShipment = self.menubar.addMenu("&Shipment")

        self.sendPackAction = QAction("&Send Package")
        self.sendPackAction.triggered.connect(self.sendPackage)
        self.actionShipment.addAction(self.sendPackAction)

        self.receivePackAction = QAction("&Receive Package")
        self.receivePackAction.triggered.connect(self.receivePackage)
        self.actionShipment.addAction(self.receivePackAction)

        ###################################################
        ##  User Menu
        ###################################################
        self.actionUser = self.menubar.addMenu("&User")

        self.ShowUserAction = QAction("&Show Users", self)
        self.ShowUserAction.triggered.connect(self.displayUsers)
        self.actionUser.addAction(self.ShowUserAction)

        self.AddUserAction = QAction("&Add Users", self)
        self.AddUserAction.triggered.connect(self.addUsers)
        self.actionUser.addAction(self.AddUserAction)

        self.UpdateUserAction = QAction("&Update Profile", self)
        self.UpdateUserAction.triggered.connect(self.updateProfile)
        self.actionUser.addAction(self.UpdateUserAction)

        self.ShowInstAction = QAction("&Show institute", self)
        self.ShowInstAction.triggered.connect(self.displayInstitue)
        self.actionUser.addAction(self.ShowInstAction)

        ###################################################
        ##  Miscellanea Menu
        ###################################################
        self.actionMiscel = self.menubar.addMenu("&Miscellanea")

        self.ComplaintAction = QAction("&Submit Complaint", self)
        self.ComplaintAction.triggered.connect(self.fileComplaint)
        self.actionMiscel.addAction(self.ComplaintAction)

        self.show()

    def activateMenuBar(self):
        self.menubar.setDisabled(False)

    def deactivateMenuBar(self):
        self.menubar.setDisabled(True)

    def enableMenuItem(self, item, enabled):
        item.setEnabled(enabled)

    ##########################################################################
    ##  Functions for Table Viewer
    ##########################################################################

    def viewTable(self):
        viewTableTab = QtViewTableTab(self)
        self.MainTabs.addTab(viewTableTab, "Database Viewer")
        self.MainTabs.setCurrentWidget(viewTableTab)

    ##########################################################################
    ##  Functions for Table Viewer (END)
    ##########################################################################

    ##########################################################################
    ##  Functions for Image
    ##########################################################################

    def insertImage(self):
        insertImageTab = QtImageInsertionTab(self)
        self.InsertImgAction.setDisabled(True)
        self.MainTabs.addTab(insertImageTab, "Insert Image")
        self.MainTabs.setCurrentWidget(insertImageTab)

    def viewImage(self):
        viewImageTab = QtImageViewerTab(self)
        self.MainTabs.addTab(viewImageTab, "Image  Viewer")
        self.MainTabs.setCurrentWidget(viewImageTab)

    ##########################################################################
    ##  Functions for Image (END)
    ##########################################################################

    ##########################################################################
    ##  Functions for Shipment
    ##########################################################################

    def sendPackage(self):
        self.sendPackageTab = QWidget()

        # Add tabs
        self.MainTabs.addTab(self.sendPackageTab, "Send Package")
        self.sendPackAction.setDisabled(True)
        self.sendPackageTab.layout = QGridLayout(self)
        sendPackageLabel = QLabel('<font size="12"> Package Delivery </font>')
        sendPackageLabel.setMaximumHeight(60)

        self.SPSenderLabel = QLabel('Sender:')
        self.SPSenderEdit = QLineEdit('')
        self.SPSenderEdit.setEchoMode(QLineEdit.Normal)
        self.SPSenderEdit.setPlaceholderText('Sender Name')

        self.SPReceiverLabel = QLabel('Receiver:')
        self.SPReceiverEdit = QLineEdit('')
        self.SPReceiverEdit.setEchoMode(QLineEdit.Normal)
        self.SPReceiverEdit.setPlaceholderText('Receiver Name')
        self.SPReceiverEdit.setDisabled(True)

        siteList = getByColumnName("institute",
                                   describeInstitute(self.connection),
                                   retrieveAllInstitute(self.connection))

        self.SPOriginLabel = QLabel('Origin:')
        self.SPOriginCombo = QComboBox()
        self.SPOriginCombo.addItems(["{0}".format(x) for x in siteList])

        self.SPDestinationLabel = QLabel('Destination:')
        self.SPDestinationCombo = QComboBox()
        self.SPDestinationCombo.addItems(["{0}".format(x) for x in siteList])

        self.SPDateSentLabel = QLabel('date sent:')
        self.SPDateSentEdit = QDateTimeEdit()
        self.SPDateSentEdit.setDateTime(QDateTime.currentDateTime())

        self.SPDateReceivedLabel = QLabel('date received:')
        self.SPDateReceivedEdit = QDateTimeEdit()
        self.SPDateReceivedEdit.setDisabled(True)
        #self.SPDateReceivedEdit.setDateTime(QDateTime.currentDateTime())

        self.SPCarrierLabel = QLabel('Carrier:')
        self.SPCarrierEdit = QLineEdit('')
        self.SPCarrierEdit.setEchoMode(QLineEdit.Normal)
        self.SPCarrierEdit.setPlaceholderText('carrier name')

        self.SPTrackingLabel = QLabel('Tracking Number:')
        self.SPTrackingEdit = QLineEdit('')
        self.SPTrackingEdit.setEchoMode(QLineEdit.Normal)
        self.SPTrackingEdit.setPlaceholderText('Tracking Code')

        self.SPCommentLabel = QLabel('Comment:')
        self.SPCommentEdit = QTextEdit('')
        self.SPCommentEdit.setPlaceholderText("Your comment")

        self.SPFeedBackLabel = QLabel()

        self.SPSubmitButton = QPushButton('Submit')
        self.SPSubmitButton.clicked.connect(self.submitSPRequest)

        self.sendPackageTab.layout.addWidget(sendPackageLabel, 0, 0, 1, 4,
                                             Qt.AlignTop)
        self.sendPackageTab.layout.addWidget(self.SPSenderLabel, 1, 0, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPSenderEdit, 1, 1, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPDateSentLabel, 1, 2, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPDateSentEdit, 1, 3, 1, 1)

        self.sendPackageTab.layout.addWidget(self.SPOriginLabel, 2, 0, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPOriginCombo, 2, 1, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPDestinationLabel, 2, 2, 1,
                                             1)
        self.sendPackageTab.layout.addWidget(self.SPDestinationCombo, 2, 3, 1,
                                             1)

        self.sendPackageTab.layout.addWidget(self.SPCarrierLabel, 3, 0, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPCarrierEdit, 3, 1, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPTrackingLabel, 3, 2, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPTrackingEdit, 3, 3, 1, 1)

        self.sendPackageTab.layout.addWidget(self.SPCommentLabel, 4, 0, 1, 4,
                                             Qt.AlignLeft)
        self.sendPackageTab.layout.addWidget(self.SPCommentEdit, 5, 0, 3, 4)
        self.sendPackageTab.layout.addWidget(self.SPFeedBackLabel, 8, 0, 1, 2)
        self.sendPackageTab.layout.addWidget(self.SPSubmitButton, 8, 3, 1, 1)

        self.sendPackageTab.setLayout(self.sendPackageTab.layout)
        self.MainTabs.setCurrentWidget(self.sendPackageTab)

    def submitSPRequest(self):
        if self.SPTrackingEdit.text() == "":
            self.SPFeedBackLabel.setText(
                "Please make sure Tracking Number are filled")
            return
        if self.SPSenderEdit.text() == "":
            self.SPFeedBackLabel.setText("Please make sure sender are filled")
            return
        Args = describeTable(self.connection, "shipment")
        Data = []
        SubmitArgs = []
        for arg in Args:
            if arg == "origin":
                Data.append(self.SPOriginCombo.currentText())
                SubmitArgs.append(arg)
            if arg == "destination":
                Data.append(self.SPDestinationCombo.currentText())
                SubmitArgs.append(arg)
            if arg == "sender":
                Data.append(self.SPSenderEdit.text())
                SubmitArgs.append(arg)
            if arg == "date_sent":
                Data.append(self.SPDateSentEdit.dateTime().toUTC().toString(
                    "yyyy-dd-MM hh:mm:ss.z"))
                SubmitArgs.append(arg)
            if arg == "carrier":
                Data.append(self.SPCarrierEdit.text())
                SubmitArgs.append(arg)
            if arg == "tracking_number":
                Data.append(self.SPTrackingEdit.text())
                SubmitArgs.append(arg)
            if arg == "comment":
                Data.append(self.SPCommentEdit.toPlainText())
                SubmitArgs.append(arg)
        try:
            insertGenericTable(self.connection, "shipment", SubmitArgs, Data)
        except:
            print("Failed to submit the shipment record")
            return

        self.SPSenderLabel.deleteLater()
        self.SPSenderEdit.deleteLater()
        self.SPDateSentLabel.deleteLater()
        self.SPDateSentEdit.deleteLater()

        self.SPOriginLabel.deleteLater()
        self.SPOriginCombo.deleteLater()
        self.SPDestinationLabel.deleteLater()
        self.SPDestinationCombo.deleteLater()

        self.SPCarrierLabel.deleteLater()
        self.SPCarrierEdit.deleteLater()
        self.SPTrackingLabel.deleteLater()
        self.SPTrackingEdit.deleteLater()

        self.SPCommentLabel.deleteLater()
        self.SPCommentEdit.deleteLater()
        self.SPFeedBackLabel.deleteLater()
        self.SPSubmitButton.deleteLater()

        self.sendPackageTab.layout.removeWidget(self.SPSenderLabel)
        self.sendPackageTab.layout.removeWidget(self.SPSenderEdit)
        self.sendPackageTab.layout.removeWidget(self.SPDateSentLabel)
        self.sendPackageTab.layout.removeWidget(self.SPDateSentEdit)

        self.sendPackageTab.layout.removeWidget(self.SPOriginLabel)
        self.sendPackageTab.layout.removeWidget(self.SPOriginCombo)
        #self.sendPackageTab.layout.removeWidget(self.SPDestinationLabel)
        #self.sendPackageTab.layout.removeWidget(self.SPDestinationCombo)

        self.sendPackageTab.layout.removeWidget(self.SPCarrierLabel)
        self.sendPackageTab.layout.removeWidget(self.SPCarrierEdit)
        self.sendPackageTab.layout.removeWidget(self.SPTrackingLabel)
        self.sendPackageTab.layout.removeWidget(self.SPTrackingEdit)

        self.sendPackageTab.layout.removeWidget(self.SPCommentLabel)
        self.sendPackageTab.layout.removeWidget(self.SPCommentEdit)
        self.sendPackageTab.layout.removeWidget(self.SPFeedBackLabel)
        self.sendPackageTab.layout.removeWidget(self.SPSubmitButton)

        self.SPFeedBackLabel = QLabel("Submitted")
        self.SPFeedBackLabel.setStyleSheet("color:green")
        self.SPContinueButton = QPushButton('Continue')
        self.SPContinueButton.clicked.connect(self.recreateSP)
        self.SPCloseButton = QPushButton('Close')
        self.SPCloseButton.clicked.connect(self.closeSP)
        self.sendPackageTab.layout.addWidget(self.SPFeedBackLabel, 1, 0, 1, 2)
        self.sendPackageTab.layout.addWidget(self.SPContinueButton, 1, 3, 1, 1)
        self.sendPackageTab.layout.addWidget(self.SPCloseButton, 1, 4, 1, 1)
        return

    def recreateSP(self):
        self.closeTab(self.MainTabs.currentIndex())
        self.sendPackage()

    def closeSP(self):
        self.closeTab(self.MainTabs.currentIndex())

    def receivePackage(self):
        self.receivePackageTab = QWidget()

        # Add tabs
        self.MainTabs.addTab(self.receivePackageTab, "Receive Package")
        self.receivePackAction.setDisabled(True)
        self.receivePackageTab.layout = QGridLayout(self)
        receivePackageLabel = QLabel(
            '<font size="12"> Package Delivery </font>')
        receivePackageLabel.setMaximumHeight(60)

        self.RPIDLabel = QLabel('ID:')
        self.RPIDEdit = QLineEdit('')
        self.RPIDEdit.setEchoMode(QLineEdit.Normal)
        self.RPIDEdit.setPlaceholderText('Shipment ID')
        self.RPFetchButton = QPushButton("Fetch")
        self.RPFetchButton.clicked.connect(self.fillRPRequest)

        self.RPSenderLabel = QLabel('Sender:')
        self.RPSenderEdit = QLineEdit('')
        self.RPSenderEdit.setEchoMode(QLineEdit.Normal)
        self.RPSenderEdit.setPlaceholderText('Sender Name')
        self.RPSenderEdit.setDisabled(True)

        self.RPReceiverLabel = QLabel('Receiver:')
        self.RPReceiverEdit = QLineEdit('')
        self.RPReceiverEdit.setEchoMode(QLineEdit.Normal)
        self.RPReceiverEdit.setPlaceholderText('Receiver Name')

        siteList = getByColumnName("institute",
                                   describeInstitute(self.connection),
                                   retrieveAllInstitute(self.connection))

        self.RPOriginLabel = QLabel('Origin:')
        self.RPOriginCombo = QComboBox()
        self.RPOriginCombo.addItems(["{0}".format(x) for x in siteList])
        self.RPOriginCombo.setDisabled(True)

        self.RPDestinationLabel = QLabel('Destination:')
        self.RPDestinationCombo = QComboBox()
        self.RPDestinationCombo.addItems(["{0}".format(x) for x in siteList])
        self.RPDestinationCombo.setDisabled(True)

        self.RPDateSentLabel = QLabel('date sent:')
        self.RPDateSentEdit = QDateTimeEdit()
        #self.RPDateSentEdit.setDateTime(QDateTime.currentDateTime())
        self.RPDateSentEdit.setDisabled(True)

        self.RPDateReceivedLabel = QLabel('date received:')
        self.RPDateReceivedEdit = QDateTimeEdit()
        self.RPDateReceivedEdit.setDateTime(QDateTime.currentDateTime())

        self.RPCarrierLabel = QLabel('Carrier:')
        self.RPCarrierEdit = QLineEdit('')
        self.RPCarrierEdit.setEchoMode(QLineEdit.Normal)
        self.RPCarrierEdit.setPlaceholderText('carrier name')
        self.RPCarrierEdit.setDisabled(True)

        self.RPTrackingLabel = QLabel('Tracking Number:')
        self.RPTrackingEdit = QLineEdit('')
        self.RPTrackingEdit.setEchoMode(QLineEdit.Normal)
        self.RPTrackingEdit.setPlaceholderText('Tracking Code')
        self.RPTrackingEdit.setDisabled(True)

        self.RPCommentLabel = QLabel('Comment:')
        self.RPCommentEdit = QTextEdit('')
        self.RPCommentEdit.setPlaceholderText("Your comment")

        self.RPFeedBackLabel = QLabel()

        self.RPSubmitButton = QPushButton('Submit')
        self.RPSubmitButton.clicked.connect(self.submitRPRequest)

        self.receivePackageTab.layout.addWidget(receivePackageLabel, 0, 0, 1,
                                                4, Qt.AlignTop)

        self.receivePackageTab.layout.addWidget(self.RPIDLabel, 1, 0, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPIDEdit, 1, 1, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPFetchButton, 1, 2, 1, 1)

        self.receivePackageTab.layout.addWidget(self.RPSenderLabel, 2, 0, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPSenderEdit, 2, 1, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPDateSentLabel, 2, 2, 1,
                                                1)
        self.receivePackageTab.layout.addWidget(self.RPDateSentEdit, 2, 3, 1,
                                                1)

        self.receivePackageTab.layout.addWidget(self.RPReceiverLabel, 3, 0, 1,
                                                1)
        self.receivePackageTab.layout.addWidget(self.RPReceiverEdit, 3, 1, 1,
                                                1)
        self.receivePackageTab.layout.addWidget(self.RPDateReceivedLabel, 3, 2,
                                                1, 1)
        self.receivePackageTab.layout.addWidget(self.RPDateReceivedEdit, 3, 3,
                                                1, 1)

        self.receivePackageTab.layout.addWidget(self.RPOriginLabel, 4, 0, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPOriginCombo, 4, 1, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPDestinationLabel, 4, 2,
                                                1, 1)
        self.receivePackageTab.layout.addWidget(self.RPDestinationCombo, 4, 3,
                                                1, 1)

        self.receivePackageTab.layout.addWidget(self.RPCarrierLabel, 5, 0, 1,
                                                1)
        self.receivePackageTab.layout.addWidget(self.RPCarrierEdit, 5, 1, 1, 1)
        self.receivePackageTab.layout.addWidget(self.RPTrackingLabel, 5, 2, 1,
                                                1)
        self.receivePackageTab.layout.addWidget(self.RPTrackingEdit, 5, 3, 1,
                                                1)

        self.receivePackageTab.layout.addWidget(self.RPCommentLabel, 6, 0, 1,
                                                4, Qt.AlignLeft)
        self.receivePackageTab.layout.addWidget(self.RPCommentEdit, 7, 0, 3, 4)
        self.receivePackageTab.layout.addWidget(self.RPFeedBackLabel, 10, 0, 1,
                                                3)
        self.receivePackageTab.layout.addWidget(self.RPSubmitButton, 10, 3, 1,
                                                1)

        self.receivePackageTab.setLayout(self.receivePackageTab.layout)
        self.MainTabs.setCurrentWidget(self.receivePackageTab)

    def fillRPRequest(self):
        try:
            header = describeTable(self.connection, "shipment", True)
            shipmentInfo = retrieveWithConstraint(self.connection,
                                                  "shipment",
                                                  id=self.RPIDEdit.text())
        except:
            return
        if len(shipmentInfo) > 0 and len(header) == len(shipmentInfo[0]):
            self.RPFeedBackLabel.setText("Delivery Record found")
            self.RPSenderEdit.setText(
                getByColumnName("sender", header, shipmentInfo)[0])
            origin_index = self.RPOriginCombo.findText(
                getByColumnName("origin", header, shipmentInfo)[0])
            self.RPOriginCombo.setCurrentIndex(origin_index)
            destination_index = self.RPDestinationCombo.findText(
                getByColumnName("destination", header, shipmentInfo)[0])
            self.RPDestinationCombo.setCurrentIndex(destination_index)
            time_string = getByColumnName(
                "date_sent", header,
                shipmentInfo)[0].strftime("%m/%d/%Y, %H:%M:%S")
            print(time_string)
            self.RPDateSentEdit.setDateTime(QDateTime.fromString(time_string))
            self.RPCarrierEdit.setText(
                getByColumnName("carrier", header, shipmentInfo)[0])
            self.RPTrackingEdit.setText(
                getByColumnName("tracking_number", header, shipmentInfo)[0])
            self.RPCommentEdit.setText(
                getByColumnName("comment", header, shipmentInfo)[0])
        else:
            self.RPFeedBackLabel.setText("Shipment ID not found")
            self.RPSenderEdit.setText("")
            origin_index = self.RPOriginCombo.findText("")
            self.RPOriginCombo.setCurrentIndex(origin_index)
            destination_index = self.RPDestinationCombo.findText("")
            self.RPDestinationCombo.setCurrentIndex(destination_index)
            #time_string = datetime.strftime("%m/%d/%Y, %H:%M:%S")
            #self.RPDateSentEdit.setDateTime(QDateTime.fromString(time_string))
            self.RPCarrierEdit.setText("")
            self.RPTrackingEdit.setText("")
            self.RPCommentEdit.setText("")

    def submitRPRequest(self):
        if self.RPTrackingEdit.text() == "":
            self.RPFeedBackLabel.setText(
                "Please make sure Tracking Number are filled")
            return
        if self.RPReceiverEdit.text() == "":
            self.RPFeedBackLabel.setText(
                "Please make sure receiver are filled")
            return
        if self.RPDateReceivedEdit.text() == "":
            self.RPFeedBackLabel.setText(
                "Please make sure received time are filled")
            return
        Args = describeTable(self.connection, "shipment")
        Data = []
        SubmitArgs = []
        for arg in Args:
            if arg == "receiver":
                Data.append(self.RPReceiverEdit.text())
                SubmitArgs.append(arg)
            if arg == "date_received":
                Data.append(
                    self.RPDateReceivedEdit.dateTime().toUTC().toString(
                        "yyyy-dd-MM hh:mm:ss.z"))
                SubmitArgs.append(arg)
            if arg == "comment":
                Data.append(self.RPCommentEdit.toPlainText())
                SubmitArgs.append(arg)
        try:
            updateGenericTable(self.connection,
                               "shipment",
                               SubmitArgs,
                               Data,
                               id=int(self.RPIDEdit.text()))
        except:
            print("Failed to submit the shipment record")
            return

        self.RPIDLabel.deleteLater()
        self.RPIDEdit.deleteLater()
        self.RPFetchButton.deleteLater()

        self.RPSenderLabel.deleteLater()
        self.RPSenderEdit.deleteLater()
        self.RPDateSentLabel.deleteLater()
        self.RPDateSentEdit.deleteLater()

        self.RPReceiverLabel.deleteLater()
        self.RPReceiverEdit.deleteLater()
        self.RPDateReceivedLabel.deleteLater()
        self.RPDateReceivedEdit.deleteLater()

        self.RPOriginLabel.deleteLater()
        self.RPOriginCombo.deleteLater()
        self.RPDestinationLabel.deleteLater()
        self.RPDestinationCombo.deleteLater()

        self.RPCarrierLabel.deleteLater()
        self.RPCarrierEdit.deleteLater()
        self.RPTrackingLabel.deleteLater()
        self.RPTrackingEdit.deleteLater()

        self.RPCommentLabel.deleteLater()
        self.RPCommentEdit.deleteLater()
        self.RPFeedBackLabel.deleteLater()
        self.RPSubmitButton.deleteLater()

        self.receivePackageTab.layout.removeWidget(self.RPIDEdit)
        self.receivePackageTab.layout.removeWidget(self.RPIDLabel)
        self.receivePackageTab.layout.removeWidget(self.RPFetchButton)

        self.receivePackageTab.layout.removeWidget(self.RPSenderLabel)
        self.receivePackageTab.layout.removeWidget(self.RPSenderEdit)
        self.receivePackageTab.layout.removeWidget(self.RPDateSentLabel)
        self.receivePackageTab.layout.removeWidget(self.RPDateSentEdit)

        self.receivePackageTab.layout.removeWidget(self.RPReceiverLabel)
        self.receivePackageTab.layout.removeWidget(self.RPReceiverEdit)
        self.receivePackageTab.layout.removeWidget(self.RPDateReceivedLabel)
        self.receivePackageTab.layout.removeWidget(self.RPDateReceivedEdit)

        self.receivePackageTab.layout.removeWidget(self.RPOriginLabel)
        self.receivePackageTab.layout.removeWidget(self.RPOriginCombo)
        self.receivePackageTab.layout.removeWidget(self.RPDestinationLabel)
        self.receivePackageTab.layout.removeWidget(self.RPDestinationCombo)

        self.receivePackageTab.layout.removeWidget(self.RPCarrierLabel)
        self.receivePackageTab.layout.removeWidget(self.RPCarrierEdit)
        self.receivePackageTab.layout.removeWidget(self.RPTrackingLabel)
        self.receivePackageTab.layout.removeWidget(self.RPTrackingEdit)

        self.receivePackageTab.layout.removeWidget(self.RPCommentLabel)
        self.receivePackageTab.layout.removeWidget(self.RPCommentEdit)
        self.receivePackageTab.layout.removeWidget(self.RPFeedBackLabel)
        self.receivePackageTab.layout.removeWidget(self.RPSubmitButton)

        self.RPFeedBackLabel = QLabel("Submitted")
        self.RPFeedBackLabel.setStyleSheet("color:green")
        self.RPContinueButton = QPushButton('Continue')
        self.RPContinueButton.clicked.connect(self.recreateRP)
        self.RPCloseButton = QPushButton('Close')
        self.RPCloseButton.clicked.connect(self.closeRP)
        self.receivePackageTab.layout.addWidget(self.RPFeedBackLabel, 1, 0, 1,
                                                2)
        self.receivePackageTab.layout.addWidget(self.RPContinueButton, 1, 3, 1,
                                                1)
        self.receivePackageTab.layout.addWidget(self.RPCloseButton, 1, 4, 1, 1)
        return

    def recreateRP(self):
        self.closeTab(self.MainTabs.currentIndex())
        self.receivePackage()

    def closeRP(self):
        self.closeTab(self.MainTabs.currentIndex())

    ##########################################################################
    ##  Functions for Shipment  (END)
    ##########################################################################

    def displayUsers(self):
        self.processing.append("UserDisplay")
        UserDisplayTab = QWidget()

        # Add tabs
        self.MainTabs.addTab(UserDisplayTab, "User List")

        UserDisplayTab.layout = QGridLayout()

        dataList = ([describeTable(self.connection, "people")] +
                    retrieveGenericTable(self.connection, "people"))

        proxy = QtDBTableWidget(dataList, 0)

        lineEdit = QLineEdit()
        lineEdit.textChanged.connect(proxy.on_lineEdit_textChanged)
        view = QTableView()
        view.setSortingEnabled(True)
        comboBox = QComboBox()
        comboBox.addItems(["{0}".format(x) for x in dataList[0]])
        comboBox.currentIndexChanged.connect(
            proxy.on_comboBox_currentIndexChanged)
        label = QLabel()
        label.setText("Regex Filter")

        view.setModel(proxy)
        view.setSelectionBehavior(QAbstractItemView.SelectRows)
        view.setSelectionMode(QAbstractItemView.MultiSelection)
        view.setEditTriggers(QAbstractItemView.NoEditTriggers)

        UserDisplayTab.layout.addWidget(lineEdit, 0, 1, 1, 1)
        UserDisplayTab.layout.addWidget(view, 1, 0, 1, 3)
        UserDisplayTab.layout.addWidget(comboBox, 0, 2, 1, 1)
        UserDisplayTab.layout.addWidget(label, 0, 0, 1, 1)

        UserDisplayTab.setLayout(UserDisplayTab.layout)
        self.MainTabs.setCurrentWidget(UserDisplayTab)

    ##########################################################################
    ##  Functions for Managing Users
    ##########################################################################

    def addUsers(self):
        ## Fixme: disable the menu when tab exists, relieaze the menu when closed.
        self.processing.append("AddUser")
        AddingUserTab = QWidget()

        # Add tabs
        self.MainTabs.addTab(AddingUserTab, "Adding User")
        self.AddUserAction.setDisabled(True)
        AddingUserTab.layout = QGridLayout(self)
        AddUserLabel = QLabel('<font size="12"> Creating new user: </font>')
        AddUserLabel.setMaximumHeight(60)

        self.AUNewUsernameLabel = QLabel('username')
        self.AUNewUsernameEdit = QLineEdit('')
        self.AUNewUsernameEdit.setEchoMode(QLineEdit.Normal)
        self.AUNewUsernameEdit.setPlaceholderText('new username')

        self.AUPasswordLabel = QLabel('password')
        self.AUPasswordEdit = QLineEdit('')
        self.AUPasswordEdit.setEchoMode(QLineEdit.Password)
        self.AUPasswordEdit.setPlaceholderText('new password')

        self.AURePasswordLabel = QLabel('re-password')
        self.AURePasswordEdit = QLineEdit('')
        self.AURePasswordEdit.setEchoMode(QLineEdit.Password)
        self.AURePasswordEdit.setPlaceholderText('verify password')

        self.AUNameLabel = QLabel('*name')
        self.AUNameEdit = QLineEdit('')
        self.AUNameEdit.setEchoMode(QLineEdit.Normal)
        self.AUNameEdit.setPlaceholderText('short name')

        self.AUFullNameLabel = QLabel('*full name')
        self.AUFullNameEdit = QLineEdit('')
        self.AUFullNameEdit.setEchoMode(QLineEdit.Normal)
        self.AUFullNameEdit.setPlaceholderText('full name')

        self.AUEmailLabel = QLabel('e-mail')
        self.AUEmailEdit = QLineEdit('')
        self.AUEmailEdit.setEchoMode(QLineEdit.Normal)
        self.AUEmailEdit.setPlaceholderText('*****@*****.**')

        self.AUInstLabel = QLabel('institute')
        self.AUInstComboBox = QComboBox()
        siteList = getByColumnName("description",
                                   describeInstitute(self.connection),
                                   retrieveAllInstitute(self.connection))
        self.AUInstComboBox.addItems(["{0}".format(x) for x in siteList])

        self.AUFeedBackLabel = QLabel()

        self.AUSubmitButton = QPushButton('Submit')
        self.AUSubmitButton.clicked.connect(self.submitAURequest)

        AddingUserTab.layout.addWidget(AddUserLabel, 0, 0, 1, 4)
        AddingUserTab.layout.addWidget(self.AUNewUsernameLabel, 1, 0, 1, 1)
        AddingUserTab.layout.addWidget(self.AUNewUsernameEdit, 1, 1, 1, 1)
        AddingUserTab.layout.addWidget(self.AUPasswordLabel, 2, 0, 1, 1)
        AddingUserTab.layout.addWidget(self.AUPasswordEdit, 2, 1, 1, 1)
        AddingUserTab.layout.addWidget(self.AURePasswordLabel, 3, 0, 1, 1)
        AddingUserTab.layout.addWidget(self.AURePasswordEdit, 3, 1, 1, 1)
        AddingUserTab.layout.addWidget(self.AUNameLabel, 4, 0, 1, 1)
        AddingUserTab.layout.addWidget(self.AUNameEdit, 4, 1, 1, 1)
        AddingUserTab.layout.addWidget(self.AUFullNameLabel, 4, 2, 1, 1)
        AddingUserTab.layout.addWidget(self.AUFullNameEdit, 4, 3, 1, 1)
        AddingUserTab.layout.addWidget(self.AUEmailLabel, 5, 0, 1, 1)
        AddingUserTab.layout.addWidget(self.AUEmailEdit, 5, 1, 1, 1)
        AddingUserTab.layout.addWidget(self.AUInstLabel, 5, 2, 1, 1)
        AddingUserTab.layout.addWidget(self.AUInstComboBox, 5, 3, 1, 1)
        AddingUserTab.layout.addWidget(self.AUFeedBackLabel, 6, 0, 1, 3)
        AddingUserTab.layout.addWidget(self.AUSubmitButton, 6, 3, 1, 1)

        AddingUserTab.setLayout(AddingUserTab.layout)
        self.MainTabs.setCurrentWidget(AddingUserTab)

        #self.enableMenuItem(self.AddingUserTab, False)

    def submitAURequest(self):
        # check the password consistency
        if self.AUNewUsernameEdit.text() == "" or self.AUNameEdit.text(
        ) == "" or self.AUFullNameEdit.text() == "":
            self.AUFeedBackLabel.setText("key blank is empty")
            return
        if self.AUPasswordEdit.text() != self.AURePasswordEdit.text():
            self.AUFeedBackLabel.setText("passwords are inconsistent")
            self.AUPasswordEdit.setText("")
            self.AURePasswordEdit.setText("")
            return

        try:
            InstituteInfo = retrieveWithConstraint(
                self.connection,
                "institute",
                description=str(self.AUInstComboBox.currentText()))
            InstName = getByColumnName(
                "institute", describeTable(self.connection, "institute"),
                InstituteInfo)
            TimeZone = getByColumnName(
                "timezone", describeTable(self.connection, "institute"),
                InstituteInfo)
        except:
            self.AUFeedBackLabel.setText(
                "Failed to extract institute info, try to reconnect to DB")
        Args = describeTable(self.connection, "people")
        Data = []
        Data.append(self.AUNewUsernameEdit.text())
        Data.append(self.AUNameEdit.text())
        Data.append(self.AUFullNameEdit.text())
        Data.append(self.AUEmailEdit.text())
        Data.append(InstName[0])
        Data.append(self.AUPasswordEdit.text())
        Data.append(TimeZone[0])
        Data.append(0)
        try:
            createNewUser(self.connection, Args, Data)
            self.AUFeedBackLabel.setText("Query submitted")
            self.AUFeedBackLabel.setStyleSheet("color:green")
            return
        except:
            print("submitFailed")
            return

    def updateProfile(self):
        pass

    ##########################################################################
    ##  Functions for Adding Users (END)
    ##########################################################################

    ##########################################################################
    ##  Functions for Institutes display
    ##########################################################################
    def displayInstitue(self):
        self.processing.append("InstituteDisplay")

        displayInstiTab = QWidget()

        # Add tabs
        self.MainTabs.addTab(displayInstiTab, "Institutes")

        displayInstiTab.layout = QGridLayout(self)

        dataList = ([describeInstitute(self.connection)] +
                    retrieveAllInstitute(self.connection))

        proxy = QtDBTableWidget(dataList, 0)

        lineEdit = QLineEdit()
        lineEdit.textChanged.connect(proxy.on_lineEdit_textChanged)
        view = QTableView()
        view.setSortingEnabled(True)
        comboBox = QComboBox()
        comboBox.addItems(["{0}".format(x) for x in dataList[0]])
        comboBox.currentIndexChanged.connect(
            proxy.on_comboBox_currentIndexChanged)
        label = QLabel()
        label.setText("Regex Filter")

        view.setModel(proxy)
        view.setSelectionBehavior(QAbstractItemView.SelectRows)
        view.setSelectionMode(QAbstractItemView.MultiSelection)
        view.setEditTriggers(QAbstractItemView.NoEditTriggers)

        displayInstiTab.layout.addWidget(lineEdit, 0, 1, 1, 1)
        displayInstiTab.layout.addWidget(view, 1, 0, 1, 3)
        displayInstiTab.layout.addWidget(comboBox, 0, 2, 1, 1)
        displayInstiTab.layout.addWidget(label, 0, 0, 1, 1)

        displayInstiTab.setLayout(displayInstiTab.layout)
        self.MainTabs.setCurrentWidget(displayInstiTab)

    ##########################################################################
    ##  Functions for Institutes display (END)
    ##########################################################################

    ##########################################################################
    ##  Functions for Complaint submission
    ##########################################################################
    def fileComplaint(self):
        self.ComplaintTab = QWidget()

        # Add tabs
        self.MainTabs.addTab(self.ComplaintTab, "Complaint")
        self.ComplaintAction.setDisabled(True)
        self.ComplaintTab.layout = QGridLayout(self)
        ComplaintLabel = QLabel(
            '<font size="12"> Submit the complaint </font>')
        ComplaintLabel.setMaximumHeight(60)

        self.FCNameLabel = QLabel('Name:')
        self.FCNameEdit = QLineEdit('')
        self.FCNameEdit.setEchoMode(QLineEdit.Normal)
        TableInfo = describeTable(self.connection, "people")
        UserInfo = retrieveWithConstraint(self.connection,
                                          "people",
                                          username=self.TryUsername)
        ShortName = getByColumnName("name", TableInfo, UserInfo)
        if len(ShortName) > 0:
            self.FCNameEdit.setText(str(ShortName[0]))

        self.FCDateTimeLabel = QLabel('Date(local)')
        self.FCDateTimeEdit = QDateTimeEdit()
        self.FCDateTimeEdit.setDateTime(QDateTime.currentDateTime())

        self.FCCommentLabel = QLabel('Comment:')
        self.FCCommentEdit = QTextEdit('')
        self.FCCommentEdit.setPlaceholderText("Your comment")

        self.FCFeedBackLabel = QLabel()

        self.FCSubmitButton = QPushButton('Submit')
        self.FCSubmitButton.clicked.connect(self.submitFCRequest)

        self.ComplaintTab.layout.addWidget(ComplaintLabel, 0, 0, 1, 4,
                                           Qt.AlignTop)
        self.ComplaintTab.layout.addWidget(self.FCNameLabel, 1, 0, 1, 1)
        self.ComplaintTab.layout.addWidget(self.FCNameEdit, 1, 1, 1, 1)
        self.ComplaintTab.layout.addWidget(self.FCDateTimeLabel, 1, 2, 1, 1)
        self.ComplaintTab.layout.addWidget(self.FCDateTimeEdit, 1, 3, 1, 1)
        self.ComplaintTab.layout.addWidget(self.FCCommentLabel, 2, 0, 1, 4,
                                           Qt.AlignLeft)
        self.ComplaintTab.layout.addWidget(self.FCCommentEdit, 3, 0, 6, 4)
        self.ComplaintTab.layout.addWidget(self.FCFeedBackLabel, 9, 0, 1, 2)
        self.ComplaintTab.layout.addWidget(self.FCSubmitButton, 9, 3, 1, 1)

        self.ComplaintTab.setLayout(self.ComplaintTab.layout)
        self.MainTabs.setCurrentWidget(self.ComplaintTab)

    def submitFCRequest(self):
        if self.FCNameEdit.text() == "" or self.FCCommentEdit.toPlainText(
        ) == "":
            self.FCFeedBackLabel.setText(
                "Please make sure the name/comment are filled")
            return
        Args = describeTable(self.connection, "complaint")
        Data = []
        Data.append(self.FCDateTimeEdit.dateTime().toUTC().toString(
            "yyyy-dd-MM hh:mm:ss.z"))
        Data.append(self.FCCommentEdit.toPlainText())
        Data.append(self.FCNameEdit.text())
        print(Data)
        try:
            insertGenericTable(self.connection, "complaint", Args, Data)
        except:
            print("Failed to submit the text")
            return
        self.FCNameLabel.deleteLater()
        self.FCNameEdit.deleteLater()
        self.FCDateTimeLabel.deleteLater()
        self.FCDateTimeEdit.deleteLater()
        self.FCCommentLabel.deleteLater()
        self.FCCommentEdit.deleteLater()
        self.FCFeedBackLabel.deleteLater()
        self.FCSubmitButton.deleteLater()

        self.ComplaintTab.layout.removeWidget(self.FCNameLabel)
        self.ComplaintTab.layout.removeWidget(self.FCNameEdit)
        self.ComplaintTab.layout.removeWidget(self.FCDateTimeLabel)
        self.ComplaintTab.layout.removeWidget(self.FCDateTimeEdit)
        self.ComplaintTab.layout.removeWidget(self.FCCommentLabel)
        self.ComplaintTab.layout.removeWidget(self.FCCommentEdit)
        self.ComplaintTab.layout.removeWidget(self.FCFeedBackLabel)
        self.ComplaintTab.layout.removeWidget(self.FCSubmitButton)

        self.FCFeedBackLabel = QLabel("Submitted")
        self.FCFeedBackLabel.setStyleSheet("color:green")
        self.FCContinueButton = QPushButton('Continue')
        self.FCContinueButton.clicked.connect(self.recreateFC)
        self.ComplaintTab.layout.addWidget(self.FCFeedBackLabel, 1, 0, 1, 2)
        self.ComplaintTab.layout.addWidget(self.FCContinueButton, 1, 3, 1, 1)
        return

    def recreateFC(self):
        self.closeTab(self.MainTabs.currentIndex())
        self.fileComplaint()

    ##########################################################################
    ##  Functions for Complaint submission (END)
    ##########################################################################

    def createHeadLine(self):
        self.deactivateMenuBar()
        self.HeadBox = QGroupBox()

        self.HeadLayout = QHBoxLayout()

        UsernameLabel = QLabel("Username:"******"Password:"******"Host IP:")
        self.HostEdit = QLineEdit('128.146.38.1')
        self.HostEdit.setEchoMode(QLineEdit.Normal)
        self.HostEdit.setMinimumWidth(150)
        self.HostEdit.setMaximumHeight(30)

        DatabaseLabel = QLabel("Database:")
        self.DatabaseEdit = QLineEdit('SampleDB')
        self.DatabaseEdit.setEchoMode(QLineEdit.Normal)
        self.DatabaseEdit.setMinimumWidth(150)
        self.DatabaseEdit.setMaximumHeight(30)

        self.ConnectButton = QPushButton("&Connect to DB")
        self.ConnectButton.clicked.connect(self.connectDB)

        self.HeadLayout.addWidget(UsernameLabel)
        self.HeadLayout.addWidget(self.UsernameEdit)
        self.HeadLayout.addWidget(PasswordLabel)
        self.HeadLayout.addWidget(self.PasswordEdit)
        self.HeadLayout.addWidget(HostLabel)
        self.HeadLayout.addWidget(self.HostEdit)
        self.HeadLayout.addWidget(DatabaseLabel)
        self.HeadLayout.addWidget(self.DatabaseEdit)
        self.HeadLayout.addWidget(self.ConnectButton)

        self.HeadBox.setLayout(self.HeadLayout)

        self.mainLayout.addWidget(self.HeadBox, 0, 0, self.GroupBoxSeg[0], 1)

    def destroyHeadLine(self):
        self.HeadBox.deleteLater()
        self.mainLayout.removeWidget(self.HeadBox)

    def clearLogInfo(self):
        self.connection = "Offline"

    def connectedHeadLine(self):
        self.activateMenuBar()
        self.HeadBox.deleteLater()
        self.mainLayout.removeWidget(self.HeadBox)

        self.HeadBox = QGroupBox()
        self.HeadLayout = QHBoxLayout()

        WelcomeLabel = QLabel("Hello,{}!".format(self.TryUsername))

        statusString, colorString = checkDBConnection(self.connection)
        DBStatusLabel = QLabel()
        DBStatusLabel.setText("Database:{}/{}".format(self.TryHostAddress,
                                                      self.TryDatabase))
        DBStatusValue = QLabel()
        DBStatusValue.setText(statusString)
        DBStatusValue.setStyleSheet(colorString)

        self.SwitchButton = QPushButton("&Switch DB")
        self.SwitchButton.clicked.connect(self.destroyHeadLine)
        self.SwitchButton.clicked.connect(self.clearLogInfo)
        self.SwitchButton.clicked.connect(self.createHeadLine)

        self.HeadLayout.addWidget(WelcomeLabel)
        self.HeadLayout.addStretch(1)
        self.HeadLayout.addWidget(DBStatusLabel)
        self.HeadLayout.addWidget(DBStatusValue)
        self.HeadLayout.addWidget(self.SwitchButton)

        self.HeadBox.setLayout(self.HeadLayout)

        self.HeadBox.setLayout(self.HeadLayout)
        self.mainLayout.addWidget(self.HeadBox, 0, 0, self.GroupBoxSeg[0], 1)

    def createMain(self):
        self.MainBodyBox = QGroupBox()

        self.mainbodylayout = QHBoxLayout()

        self.MainTabs = QTabWidget()
        self.MainTabs.setTabsClosable(True)
        self.MainTabs.tabCloseRequested.connect(
            lambda index: self.closeTab(index))

        self.mainbodylayout.addWidget(self.MainTabs)

        self.MainBodyBox.setLayout(self.mainbodylayout)
        self.mainLayout.addWidget(self.MainBodyBox, sum(self.GroupBoxSeg[0:1]),
                                  0, self.GroupBoxSeg[1], 1)

    def destroyMain(self):
        self.MainBodyBox.deleteLater()
        self.mainLayout.removeWidget(self.MainBodyBox)

    def createApp(self):
        self.AppOption = QGroupBox()
        self.StartLayout = QHBoxLayout()

        self.ResetButton = QPushButton("&Refresh")

        self.FinishButton = QPushButton("&Finish")
        self.FinishButton.setDefault(True)
        self.FinishButton.clicked.connect(self.closeWindow)

        self.StartLayout.addWidget(self.ResetButton)
        self.StartLayout.addWidget(self.FinishButton)
        self.StartLayout.addStretch(1)
        self.AppOption.setLayout(self.StartLayout)

        self.mainLayout.addWidget(self.AppOption, sum(self.GroupBoxSeg[0:2]),
                                  0, self.GroupBoxSeg[2], 1)

    def destroyApp(self):
        self.AppOption.deleteLater()
        self.mainLayout.removeWidget(self.AppOption)

    def sendBackSignal(self):
        self.backSignal = True

    def connectDB(self):
        try:
            if isActive(self.connection):
                self.TryUsername = self.master.TryUsername
                self.TryHostAddress = self.master.TryHostAddress
                self.TryDatabase = self.master.TryDatabase
                self.connectedHeadLine()
                return
            self.TryUsername = self.UsernameEdit.text()
            self.TryPassword = self.PasswordEdit.text()
            self.TryHostAddress = self.HostEdit.text()
            self.TryDatabase = self.DatabaseEdit.text()

            if self.TryUsername == '':
                msg.information(None, "Error", "Please enter a valid username",
                                QMessageBox.Ok)
                return

            self.connection = QtStartConnection(self.TryUsername,
                                                self.TryPassword,
                                                self.TryHostAddress,
                                                self.TryDatabase)

            if isActive(self.connection):
                self.connectedHeadLine()
        except Exception as err:
            print("Error in connecting to database, {}".format(repr(err)))

    def syncDB(self):
        pass

    def changeDBList(self):
        self.DBNames = DBNames[str(self.HostName.currentText())]
        self.DatabaseCombo.clear()
        self.DatabaseCombo.addItems(self.DBNames)
        self.DatabaseCombo.setCurrentIndex(0)

    def closeTab(self, index):
        self.releaseAction(self.MainTabs.tabText(index))
        self.MainTabs.removeTab(index)

    def releaseAction(self, text):
        if text == "Adding User":
            self.AddUserAction.setDisabled(False)
            return
        if text == "Complaint":
            self.ComplaintAction.setDisabled(False)
            return
        if text == "Send Package":
            self.sendPackAction.setDisabled(False)
            return
        if text == "Receive Package":
            self.receivePackAction.setDisabled(False)
            return
        if text == "Insert Image":
            self.InsertImgAction.setDisabled(False)
            return

    def closeWindow(self):
        self.close()
        self.release()

    def occupied(self):
        self.master.DBConsoleButton.setDisabled(True)

    def release(self):
        self.master.DBConsoleButton.setDisabled(False)

    def closeEvent(self, event):
        #Fixme: strict criterias for process checking  should be added here:
        #if self.ProcessingTest == True:
        #	QMessageBox.critical(self, 'Critical Message', 'There is running process, can not close!')
        #	event.ignore()

        reply = QMessageBox.question(
            self, 'Window Close',
            'Are you sure you want to exit, all unsubmitted content will be lost?',
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

        if reply == QMessageBox.Yes:
            print('DB console terminated')
            event.accept()
        else:
            event.ignore()