Exemple #1
0
class CrosswordWidget(QWidget):
    def __init__(self, crossword_index, grid_data, grid_cell_length):
        QWidget.__init__(self)
        self.grid_model = CrosswordGridModel(crossword_index, grid_data)
        self.grid_delegate = CrosswordGridDelegate(grid_data)
        self.grid_table_view = QTableView(self)
        #sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum)
        #self.grid_table_view.setSizePolicy(sizePolicy)
        self.grid_table_view.setModel(self.grid_model)
        self.grid_table_view.setItemDelegate(self.grid_delegate)
        self.grid_table_view.resizeColumnsToContents()
        self.grid_table_view.setStyleSheet("background:transparent")
        #self.grid_horizontal_header = self.grid_table_view.horizontalHeader()
        #self.grid_horizontal_header.setSectionResizeMode(QHeaderView.Fixed)
        #self.grid_horizontal_header.setDefaultSectionSize(grid_cell_length)
        #self.grid_horizontal_header.hide()
        #self.grid_vertical_header = self.grid_table_view.verticalHeader()
        #self.grid_vertical_header.setSectionResizeMode(QHeaderView.Fixed)
        #self.grid_vertical_header.setDefaultSectionSize(grid_cell_length * 1.3)
        #self.grid_vertical_header.hide()

        #self.main_layout = QHBoxLayout(self)
        #self.main_layout.addWidget(self.grid_table_view)
        #self.setLayout(self.main_layout)
        #self.layout().addWidget(self.grid_table_view)

    def save_solution(self):
        if self.grid_model.save_solution():
            status_bar.showMessage("Solution saved")
class MainWin(QWidget):
    def __init__(self):
        super().__init__()
        self.dbConnector = cPl.DBConnector("timePlanner.db", "Task",
                                           ormMapping)
        self.taskStorage = cPl.TaskStorage(self.dbConnector, ormMapping)
        self.currentView = "Work"
        self.checkBox = QCheckBox('Minimize to Tray')
        self.checkBox.setChecked(True)
        self.createModels()
        self.grid = QGridLayout()
        self.tray_icon = QSystemTrayIcon()
        self.tray_icon.setToolTip("Time Planner")
        self.tray_icon.setIcon(self.style().standardIcon(
            QStyle.SP_ComputerIcon))
        traySignal = "activated(QSystemTrayIcon::ActivationReason)"
        QObject.connect(self.tray_icon, SIGNAL(traySignal),
                        self.__icon_activated)
        #appendFunc = anonFuncString("Total time")
        appendDataFinished = [
            cPl.AppendDataView(self.finishedModel, 3,
                               self.taskStorage.getTotalWorkTime,
                               workTimeFormat),
            cPl.AppendDataView(self.finishedModel, 2, anonFuncString)
        ]
        self.finishedModel.setAppendData(appendDataFinished)

        self.initUI()

    def hideEvent(self, event):
        if self.checkBox.isChecked():
            event.ignore()
            self.hide()
            self.tray_icon.show()

    def __icon_activated(self, reason):
        if reason == QSystemTrayIcon.Trigger:
            self.show()

    def __resizeView(self):
        self.view.horizontalHeader().setSectionResizeMode(
            0, QHeaderView.Stretch)
        if self.currentView == "Work":
            self.view.horizontalHeader().setSectionResizeMode(
                1, QHeaderView.Fixed)
            self.view.horizontalHeader().setSectionResizeMode(
                2, QHeaderView.Fixed)
            self.view.horizontalHeader().setSectionResizeMode(
                3, QHeaderView.ResizeToContents)
            self.view.setColumnWidth(1, 140)
            self.view.setColumnWidth(2, 70)

            self.view.setColumnWidth(self.model.getHeaderLenght(), 70)
            self.view.setColumnWidth(self.model.getHeaderLenght() + 1, 70)
            self.view.setColumnWidth(self.model.getHeaderLenght() + 2, 70)
            self.view.setColumnWidth(self.model.getHeaderLenght() + 3, 70)

        else:
            self.view.horizontalHeader().setSectionResizeMode(
                1, QHeaderView.Fixed)
            self.view.horizontalHeader().setSectionResizeMode(
                2, QHeaderView.Fixed)
            self.view.horizontalHeader().setSectionResizeMode(
                3, QHeaderView.ResizeToContents)
            self.view.setColumnWidth(1, 140)
            self.view.setColumnWidth(2, 140)

    def initUI(self):
        self.taskStorage.Model = self.model
        grid = self.grid

        self.setLayout(grid)

        buttonCurrent = QPushButton('Current Task')
        buttonCurrent.setCheckable(True)
        buttonFinished = QPushButton('Finished Task')
        buttonFinished.setCheckable(True)
        buttonCurrent.setMaximumWidth(100)
        buttonFinished.setMaximumWidth(100)

        self.move(300, 150)
        self.setMinimumWidth(1100)
        self.setMinimumHeight(400)
        self.setWindowTitle('Time Planner')
        top_Panel = self.createTop()
        grid.addWidget(top_Panel, 0, 0)

        self.view = QTableView()
        self.view.setModel(self.model)
        stylesheet = "QHeaderView::section{color: grey; border: 2px solid #6c6c6c; border-width: 0px 0px 2px 0px; " \
                     "border-style: dotted; border-color: black} "
        self.view.setStyleSheet(stylesheet)
        self.__resizeView()
        #Create here else garbage collector clear it
        self.buttonStart = cPl.StartButtonDelegate(self.taskStorage, "taskId")
        self.buttonPause = cPl.PauseButtonDelegate(self.taskStorage, "taskId")
        self.buttonFinish = cPl.FinishButtonDelegate(self.taskStorage,
                                                     "taskId")
        self.buttonDelete = cPl.DeleteButtonDelegate(self.taskStorage,
                                                     "taskId", self)

        if self.currentView == "Work":
            self.view.setItemDelegateForColumn(self.model.getHeaderLenght(),
                                               self.buttonStart)
            self.view.setItemDelegateForColumn(
                self.model.getHeaderLenght() + 1, self.buttonPause)
            self.view.setItemDelegateForColumn(
                self.model.getHeaderLenght() + 2, self.buttonFinish)
            self.view.setItemDelegateForColumn(
                self.model.getHeaderLenght() + 3, self.buttonDelete)
            buttonCurrent.setChecked(True)
            buttonFinished.setChecked(False)
        else:
            self.view.setItemDelegateForColumn(self.model.getHeaderLenght(),
                                               self.buttonDelete)
            buttonCurrent.setChecked(False)
            buttonFinished.setChecked(True)

        viewPanel = self.createTaskView(self.view)
        grid.addWidget(viewPanel, 1, 0)
        buttonPanel = self.createButtonView()
        grid.addWidget(buttonPanel, 1, 1)

        grid.addWidget(self.checkBox, 2, 0)
        self.show()

    # Top panel - LineEdit for task name  + Add new task button
    def createTop(self):
        topPanel = QWidget()
        topPanel.setContentsMargins(0, 0, 0, 0)
        hBox = QHBoxLayout()
        vBox = QVBoxLayout()
        lineEdit = QLineEdit('')
        lineEdit.setPlaceholderText("Enter new task name")
        buttonAdd = QPushButton('Add Task')
        buttonAdd.clicked.connect(self.add_newTask(lineEdit))
        hBox.addWidget(lineEdit)
        lineEdit.setMinimumWidth(250)
        hBox.addWidget(buttonAdd)
        hBox.addStretch(1)
        vBox.addLayout(hBox)
        topPanel.setLayout(vBox)
        return topPanel

    def createTaskView(self, view):
        hBox = QHBoxLayout()
        viewPanel = QWidget()
        hBox.addWidget(view)
        viewPanel.setLayout(hBox)
        return viewPanel

    def createButtonView(self):
        buttons = []
        datePickers = []
        buttonPanel = QWidget()
        buttonPanel.setContentsMargins(0, 0, 0, 0)
        buttonCurrent = QPushButton('Current tasks')
        buttonCurrent.setCheckable(True)
        buttonFinished = QPushButton('Finished tasks')
        buttonFinished.setCheckable(True)
        buttonFilter = QPushButton("Filter by end date")
        buttonApply = QPushButton("Apply")
        buttonFilter.setCheckable(True)
        buttonCurrent.setMaximumWidth(100)
        buttonFinished.setMaximumWidth(100)
        buttonFilter.setMaximumWidth(100)
        buttonApply.setMaximumWidth(100)
        buttonCurrent.setMinimumWidth(100)
        buttonFinished.setMinimumWidth(100)
        buttonFilter.setMinimumWidth(100)
        buttonApply.setMinimumWidth(100)
        buttons.append(buttonFilter)

        #
        labelStart = QLabel("Date start")
        datePickers.append(labelStart)
        dateStart = QDateEdit()
        dateStart.setDisplayFormat('dd/MM/yyyy')
        dateStart.setCalendarPopup(True)
        dateStart.setDate(QDate.currentDate())

        datePickers.append(dateStart)
        labelEnd = QLabel("Date end")
        datePickers.append(labelEnd)
        dateEnd = QDateEdit()
        dateEnd.setDisplayFormat('dd/MM/yyyy')
        dateEnd.setCalendarPopup(True)
        dateEnd.setDate(QDate.currentDate())
        datePickers.append(dateEnd)
        datePickers.append(buttonApply)

        buttonCurrent.clicked.connect(
            self.switchCurrentTask(buttonFinished, buttonCurrent, buttons))
        buttonFinished.clicked.connect(
            self.switchFinishedTask(buttonCurrent, buttonFinished, buttons))
        buttonFilter.clicked.connect(
            self.openDatePickerFilter(datePickers, buttonFilter))
        buttonApply.clicked.connect(
            self.ApplyDateFilterArchive(dateStart, dateEnd))
        buttonCurrent.setChecked(True)

        vBox = QVBoxLayout()
        vBox.addWidget(buttonCurrent)
        vBox.addWidget(buttonFinished)
        vBox.addSpacing(30)
        for bnt in buttons:
            bnt.setVisible(False)
            vBox.addWidget(bnt)
        for datePicker in datePickers:
            datePicker.setVisible(False)
            vBox.addWidget(datePicker)

        vBox.addStretch(1)
        buttonPanel.setLayout(vBox)
        return buttonPanel

    def add_newTask(self, lineEdit):
        def call_sql():
            if lineEdit.text() != "":
                self.taskStorage.addTask(lineEdit.text())
                self.model.refresh()

        return call_sql

    def openDatePickerFilter(self, filterElements, clickBtn):
        def call():
            if not clickBtn.isChecked():
                for filterElement in filterElements:
                    filterElement.setVisible(False)
                    self.taskStorage.viewAllFinishedTask()
                    self.finishedModel.refresh()
            else:
                for filterElement in filterElements:
                    filterElement.setVisible(True)

        return call

    def ApplyDateFilterArchive(self, dateStart, dateEnd):
        def call():
            start = datetime.combine(dateStart.date().toPython(),
                                     datetime.min.time())
            end = datetime.combine(dateEnd.date().toPython(),
                                   datetime.min.time())
            startUTC = int(float(start.timestamp()))
            endUTC = int(float(end.timestamp()))
            self.finishedModel.switchToFilterData(startUTC, endUTC)
            self.finishedModel.refresh()

        return call

    def switchCurrentTask(self, buttonInAct, btnAct, btnsFilter):
        def call():
            if self.currentView != "Work":
                self.model.setAllTaskView()
                self.view.setModel(self.model)
                self.view.setItemDelegateForColumn(
                    self.model.getHeaderLenght(), self.buttonStart)
                self.view.setItemDelegateForColumn(
                    self.model.getHeaderLenght() + 1, self.buttonPause)
                self.view.setItemDelegateForColumn(
                    self.model.getHeaderLenght() + 2, self.buttonFinish)
                btnAct.setChecked(True)
                buttonInAct.setChecked(False)
                for btn in btnsFilter:
                    btn.setVisible(False)
                self.currentView = "Work"
                self.__resizeView()

        return call

    def switchFinishedTask(self, buttonInAct, btnAct, btnsFilter):
        def call():
            if self.currentView != "Archive":
                self.finishedModel.switchToAllDataView()
                self.view.setModel(self.finishedModel)
                self.view.setItemDelegateForColumn(
                    self.model.getHeaderLenght(), self.buttonDelete)
                btnAct.setChecked(True)
                buttonInAct.setChecked(False)
                for btn in btnsFilter:
                    btn.setVisible(True)
                self.currentView = "Archive"
                self.__resizeView()

        return call

    def createModels(self):
        self.model = cPl.TaskModel(self.taskStorage, ormMapping, 0, buttonData,
                                   self)  # передаем хранилище задач в модель
        self.finishedModel = cPl.TaskModel(self.taskStorage,
                                           ormMappingFinished, 1,
                                           buttonDataFinish, self)

    def updateView(self):
        self.view.update()