コード例 #1
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_isReminded(self):
        task = Task()
        task.dueDateTime = datetime.datetime.today() + datetime.timedelta(
            seconds=30)

        occurrence = task.currentOccurrence()
        self.assertEqual(occurrence.isReminded(), False)
コード例 #2
0
    def test_getNextDeadline_None(self):
        manager = Manager()
        manager.addTask(Task("task1"))
        manager.addTask(Task("task2"))

        deadlineTask = manager.getNextDeadline()
        self.assertEqual(deadlineTask, None)
コード例 #3
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_getTaskOccurrenceForDate(self):
        taskDate = datetime.datetime(2020, 5, 17)
        task = Task()
        task.dueDateTime = taskDate

        entry = task.getTaskOccurrenceForDate(taskDate.date())
        self.assertEqual(entry.task, task)
        self.assertEqual(entry.offset, 0)
コード例 #4
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_getNotifications_due(self):
        task = Task()
        task.title = "task 1"
        task.dueDateTime = datetime.datetime.today() + datetime.timedelta(
            seconds=10)

        notifications = task.getNotifications()
        self.assertEqual(len(notifications), 1)
        self.assertEqual(notifications[0].task, task)
        self.assertEqual(notifications[0].message,
                         "task 'task 1' reached deadline")
コード例 #5
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_getTaskOccurrenceForDate_recurrent_far(self):
        taskDate = datetime.datetime(2020, 5, 17)
        task = Task()
        task.dueDateTime = taskDate
        task.recurrence = Recurrent()
        task.recurrence.setDaily(1)

        entry = task.getTaskOccurrenceForDate(taskDate.date() +
                                              timedelta(days=3333 * 366))
        self.assertEqual(entry.task, task)
        self.assertEqual(entry.offset, 1219878)
コード例 #6
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_getTaskOccurrenceForDate_recurrent_endDate(self):
        taskDate = datetime.datetime(2020, 5, 17)
        task = Task()
        task.dueDateTime = taskDate
        task.recurrence = Recurrent()
        task.recurrence.setDaily(1)
        task.recurrence.endDate = taskDate.date() + timedelta(days=5)

        entry = task.getTaskOccurrenceForDate(taskDate.date() +
                                              timedelta(days=9))
        self.assertEqual(entry, None)
コード例 #7
0
    def _createTask( self, newTaskDate: QDate = None ):
        task = Task()
        if newTaskDate is not None:
            startDate = newTaskDate.toPyDate()
            task.setDefaultDate( startDate )

        taskDialog = TaskDialog( task, self.parentWidget )
        taskDialog.setModal( True )
        dialogCode = taskDialog.exec_()
        if dialogCode == QDialog.Rejected:
            return None
        return taskDialog.task
コード例 #8
0
ファイル: taskdialog.py プロジェクト: anetczuk/hanlendar
    def __init__(self, taskObject, parentWidget=None):
        super().__init__(parentWidget)
        self.ui = UiTargetClass()
        self.ui.setupUi(self)

        if taskObject is not None:
            self.task = copy.deepcopy(taskObject)
        else:
            self.task = Task()

        self.completed = self.task.completed

        self.ui.reminderWidget.setTask(self.task)
        self.ui.recurrentWidget.setTask(self.task)

        if self.task.occurrenceStart is None:
            self.ui.deadlineBox.setChecked(True)
            if self.task.occurrenceDue is None:
                self.task.dueDateTime = datetime.today()
            self.ui.startDateTime.setDateTime(self.task.occurrenceDue)
        else:
            self.ui.deadlineBox.setChecked(False)
            self.ui.startDateTime.setDateTime(self.task.occurrenceStart)
            if self.task.occurrenceDue is None:
                self.task.dueDateTime = self.task.occurrenceStart + timedelta(
                    hours=1)

        self.ui.descriptionEdit.setContextMenuPolicy(Qt.CustomContextMenu)

        self.ui.titleEdit.setText(self.task.title)
        self.ui.descriptionEdit.setText(self.task.description)
        self.ui.completionSlider.setValue(self.task.completed)
        self.ui.priorityBox.setValue(self.task.priority)
        self.ui.dueDateTime.setDateTime(self.task.occurrenceDue)

        self.ui.titleEdit.textChanged.connect(self._titleChanged)
        self.ui.descriptionEdit.textChanged.connect(self._descriptionChanged)
        self.ui.descriptionEdit.anchorClicked.connect(self._openLink)
        self.ui.descriptionEdit.customContextMenuRequested.connect(
            self.textEditContextMenuRequest)
        self.ui.completionSlider.valueChanged.connect(self._completedChanged)
        self.ui.priorityBox.valueChanged.connect(self._priorityChanged)
        self.ui.deadlineBox.stateChanged.connect(self._deadlineChanged)
        self.ui.startDateTime.dateTimeChanged.connect(self._startChanged)
        self.ui.dueDateTime.dateTimeChanged.connect(self._dueChanged)

        self.ui.openLocalFilePB.clicked.connect(self._openLocalFile)
        self.ui.openLocalDirPB.clicked.connect(self._openLocalDir)
        self.ui.addUrlPB.clicked.connect(self._addUrl)

        self.finished.connect(self._finished)
コード例 #9
0
    def test_getTasksAll(self):
        manager = Manager()
        task1 = manager.addTask(Task("task1"))
        task2 = manager.addTask(Task("task2"))
        subtask = task2.addSubItem(Task("subtask1"))
        subtask2 = subtask.addSubItem(Task("subtask2"))

        allTasks = manager.getTasksAll()
        self.assertEqual(len(allTasks), 4)
        self.assertEqual(allTasks[0], task1)
        self.assertEqual(allTasks[1], task2)
        self.assertEqual(allTasks[2], subtask)
        self.assertEqual(allTasks[3], subtask2)

        allTasks.clear()
        self.assertEqual(len(manager.getTasksAll()), 4)
コード例 #10
0
    def show(self, task: Task = None, newTaskDate: QDate = None):
        if task is None:
            self.showNewTask(newTaskDate)
            return

        self.addSubTaskAction.setEnabled(True)
        self.editTaskAction.setEnabled(True)
        self.removeTaskAction.setEnabled(True)
        if task.isCompleted():
            self.markCompletedAction.setEnabled(False)
        else:
            self.markCompletedAction.setEnabled(True)

        globalPos = QCursor.pos()
        action = self.contextMenu.exec_(globalPos)

        if action == self.addTaskAction:
            if newTaskDate is None:
                newTaskDate = QDate.currentDate()
            self.addNewTask.emit(newTaskDate)
        elif action == self.addSubTaskAction:
            self.addNewSubTask.emit(task)
        elif action == self.editTaskAction:
            self.editTask.emit(task)
        elif action == self.removeTaskAction:
            self.removeTask.emit(task)
        elif action == self.markCompletedAction:
            self.markCompleted.emit(task)
コード例 #11
0
    def test_replaceTask(self):
        manager = Manager()

        taskDate1 = datetime.date(2020, 5, 17)
        task1 = manager.addNewTask(taskDate1, "task1")
        task2 = Task()
        task2.title = "new task"

        tasks = manager.getTasks()
        self.assertEqual(len(tasks), 1)

        manager.replaceTask(task1, task2)

        tasks = manager.getTasks()
        self.assertEqual(len(tasks), 1)
        self.assertEqual(tasks[0].title, "new task")
コード例 #12
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_setCompleted(self):
        taskDate = datetime.date(2020, 5, 17)
        task = Task()
        task.setDefaultDate(taskDate)

        task.setCompleted()
        self.assertEqual(task.completed, 100)
コード例 #13
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_setCompleted_recurrent(self):
        taskDate = datetime.date(2020, 5, 17)
        task = Task()
        task.recurrence = Recurrent()
        task.recurrence.setDaily()
        task.setDefaultDate(taskDate)

        task.setCompleted()
        self.assertEqual(task.completed, 0)
        self.assertEqual(task.occurrenceStart.date(),
                         datetime.date(2020, 5, 18))
        self.assertEqual(task.occurrenceDue.date(), datetime.date(2020, 5, 18))
コード例 #14
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_getTaskOccurrenceForDate_recurrent_completed(self):
        task = Task()
        todayDate = datetime.datetime.today()
        dueDate = todayDate.replace(day=8, hour=12)
        task.dueDateTime = dueDate
        task.recurrence = Recurrent()
        task.recurrence.setWeekly()
        task.setCompleted()  ## mark first occurrence completed

        occurrence1 = task.getTaskOccurrenceForDate(dueDate.date() -
                                                    timedelta(days=7))
        self.assertEqual(occurrence1, None)

        occurrence2 = task.getTaskOccurrenceForDate(dueDate.date())
        self.assertNotEqual(occurrence2, None)
        self.assertEqual(occurrence2.isCompleted(), True)

        occurrence3 = task.getTaskOccurrenceForDate(dueDate.date() +
                                                    timedelta(days=7))
        self.assertNotEqual(occurrence3, None)
        self.assertEqual(occurrence3.isCompleted(), False)
コード例 #15
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_isReminded_reminded(self):
        task = Task()
        task.dueDateTime = datetime.datetime.today() + datetime.timedelta(
            seconds=30)

        reminder = Reminder()
        reminder.setTime(0, 300)
        task.addReminder(reminder)

        occurrence = task.currentOccurrence()
        self.assertEqual(occurrence.isReminded(), True)
コード例 #16
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_date_current_subtask(self):
        task = Task()
        task.startDateTime = datetime.datetime(2020, 10, 10)
        task.dueDateTime = task.startDateTime + timedelta(days=1)

        subtask = task.addSubTask()
        subtask.setDeadline()
        #         subtask.startDateTime = task.startDateTime - timedelta( days=5 )
        subtask.dueDateTime = task.dueDateTime - timedelta(days=7)

        occurrence = task.currentOccurrence()
        self.assertEqual(occurrence.startCurrent, task.startDateTime)
        self.assertEqual(occurrence.dueCurrent, subtask.dueDateTime)
コード例 #17
0
    def convertToDoToTask(self, todo: ToDo ):
        task = Task()
        task.title       = todo.title
        task.description = todo.description
        task.completed   = todo.completed
        task.priority    = todo.priority

        taskDialog = TaskDialog( task, self.parentWidget )
        taskDialog.setModal( True )
        dialogCode = taskDialog.exec_()
        if dialogCode == QDialog.Rejected:
            return
        self.undoStack.push( ConvertToDoToTaskCommand( self, todo, taskDialog.task ) )
コード例 #18
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
    def test_getNotifications_reminder(self):
        task = Task()
        task.title = "task 1"
        task.dueDateTime = datetime.datetime.today() + datetime.timedelta(
            seconds=30)

        reminder = Reminder()
        reminder.setTime(0, 10)
        task.addReminder(reminder)

        notifications = task.getNotifications()
        self.assertEqual(len(notifications), 2)
        self.assertEqual(notifications[0].task, task)
        self.assertEqual(notifications[0].message,
                         "task 'task 1': 0:00:10 before due time")
        self.assertEqual(notifications[1].task, task)
        self.assertEqual(notifications[1].message,
                         "task 'task 1' reached deadline")
コード例 #19
0
from hanlendar.gui.sigint import setup_interrupt_handling
from hanlendar.gui.widget.taskdetails import TaskDetails

from hanlendar.domainmodel.task import Task

## ============================= main section ===================================

if __name__ != '__main__':
    sys.exit(0)

app = QApplication(sys.argv)
app.setApplicationName("Hanlendar")
app.setOrganizationName("arnet")
### app.setOrganizationDomain("www.my-org.com")

task = Task()
task.title = "Task title"
task.description = "Description"
task.completed = 50
task.priority = 5
task.setDefaultDateTime(datetime.today())

setup_interrupt_handling()

widget = TaskDetails()
widget.setTask(task)
widget.show()

exitCode = app.exec_()
sys.exit(exitCode)
コード例 #20
0
from hanlendar.domainmodel.task import Task

## ============================= main section ===================================

if __name__ != '__main__':
    sys.exit(0)

app = QApplication(sys.argv)
app.setApplicationName("Hanlendar")
app.setOrganizationName("arnet")
### app.setOrganizationDomain("www.my-org.com")

tasksList = []

task1 = Task()
task1.title = "Task 1"
task1.description = "Description"
task1.completed = 50
task1.priority = 5
task1.setDefaultDateTime(datetime.today())
tasksList.append(task1)

task2 = Task()
task2.title = "Task 2"
task2.description = "Description"
task2.completed = 0
task2.priority = 3
task2.setDefaultDateTime(datetime.today() + timedelta(hours=2))
tasksList.append(task2)
コード例 #21
0
from hanlendar.gui.widget.taskdialog import TaskDialog

from hanlendar.domainmodel.task import Task
from hanlendar.domainmodel.recurrent import Recurrent

## ============================= main section ===================================

if __name__ != '__main__':
    sys.exit(0)

app = QApplication(sys.argv)
app.setApplicationName("Hanlendar")
app.setOrganizationName("arnet")
### app.setOrganizationDomain("www.my-org.com")

parentTask = Task()
parentTask.recurrence = Recurrent()
parentTask.recurrence.setWeekly(1)

task = Task()
task.setParent(parentTask)
task.title = "Task 1"
# pylint: disable=C0301
task.description = (
    '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">'
    '<html><head><meta name="qrichtext" content="1" /><style type="text/css">'
    'p, li { white-space: pre-wrap; }'
    '</style></head><body style=" font-family:\'Noto Sans\'; font-size:9pt; font-weight:400; font-style:normal;">'
    '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">A description</p>'
    '<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p>'
    '<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><a href="www.google.pl"><span style=" text-decoration: underline; color:#0000ff;">www.google.pl</span></a> </p>'
コード例 #22
0
 def addTask(self, task: Task = None):
     if task is None:
         task = Task()
     self.tasks.append(task)
     task.setParent(None)
     return task
コード例 #23
0
 def addTask(self, task: Task = None ) -> Task:
     if task is None:
         task = Task()
     self.undoStack.push( AddTaskCommand( self, task ) )
     return task
コード例 #24
0
 def addNewDeadlineDateTime(self, eventdate: datetime, title):
     eventTask = Task()
     eventTask.title = title
     eventTask.setDeadlineDateTime(eventdate)
     self.addTask(eventTask)
     return eventTask
コード例 #25
0
 def addNewTaskDateTime(self, taskdate: datetime, title):
     task = Task()
     task.title = title
     task.setDefaultDateTime(taskdate)
     self.addTask(task)
     return task
コード例 #26
0
ファイル: test_task.py プロジェクト: anetczuk/hanlendar
 def test_isTimedout(self):
     task = Task()
     occurrence = task.currentOccurrence()
     self.assertEqual(occurrence.isTimedout(), False)
コード例 #27
0
def prepare_example_data(dataManager: Manager):
    taskDate = datetime.today() - timedelta(seconds=5)
    task1 = dataManager.addNewTaskDateTime(
        datetime.today() + timedelta(days=1), "task 1")
    task1.completed = 50
    task1.description = (
        "<a href=\"http://www.google.com\">xxx</a> <br> "
        "<a href=\"file:///media/E/bluetooth.txt\">yyy</a> <br> "
        "<a href=\"file:///media/E/Pani1.jpg\">zzz</a>")
    task1.addSubItem(Task("Subtask"))

    completedTask = dataManager.addNewTaskDateTime(
        taskDate + timedelta(days=7), "completed task")
    completedTask.setCompleted()

    ## add far task
    dataManager.addNewTaskDateTime(datetime.today() + timedelta(days=360),
                                   "far task")

    recurrentDate = taskDate.replace(day=20, hour=12)
    recurrentTask = dataManager.addNewTaskDateTime(recurrentDate,
                                                   "recurrent task 1")
    recurrentTask.recurrence = Recurrent()
    recurrentTask.recurrence.setDaily()
    recurrentTask.recurrence.endDate = recurrentDate.date() + timedelta(days=2)
    reminder = recurrentTask.addReminder()
    reminder.setDays(1)

    task2 = dataManager.addNewTaskDateTime(
        recurrentTask.occurrenceStart.replace(hour=11), "task 2")
    task2.dueDateTime = task2.occurrenceDue.replace(hour=20)

    task3 = dataManager.addTask()
    task3.title = "task 3"
    task3.dueDateTime = taskDate.replace(hour=20) + timedelta(days=90)
    task3.startDateTime = task3.dueDateTime - timedelta(days=1)

    subtask1 = task3.addSubTask()
    subtask1.title = "subtask 1"
    subtask1.startDateTime = task3.startDateTime - timedelta(days=50)
    subtask1.dueDateTime = task3.dueDateTime - timedelta(days=40)

    completedTask = dataManager.addNewTaskDateTime(
        task2.occurrenceStart - timedelta(hours=3), "completed task 2")
    completedTask.setCompleted()

    recurrentDate2 = datetime.today().replace(day=15) + timedelta(days=30)
    recurrentTask2 = dataManager.addNewTaskDateTime(recurrentDate2,
                                                    "recurrent task 2")
    recurrentTask2.setDeadline()
    recurrentTask2.recurrence = Recurrent()
    recurrentTask2.recurrence.setMonthly()

    recurrentSub = recurrentTask2.addSubTask()
    recurrentSub.title = "recurrent subtask 1"
    recurrentSub.setDeadline()
    recurrentSub.dueDateTime = recurrentTask2.dueDateTime - timedelta(days=1)
    recurrentSub.recurrence = Recurrent()
    recurrentSub.recurrence.setMonthly()

    deadlineDate = datetime.today() + timedelta(seconds=10)
    deadlineTaks = dataManager.addNewDeadlineDateTime(deadlineDate,
                                                      "expired task 1")
    reminder = deadlineTaks.addReminder()
    reminder.setMillis(5000)

    remindedTask = dataManager.addNewTaskDateTime(
        datetime.today() + timedelta(hours=2), "reminded task 1")
    reminder = remindedTask.addReminder()
    reminder.setDays(30)

    todo1 = dataManager.addNewToDo("ToDo example A")
    todo1.description = "a description"
    todo1.priority = 3
    todo1.completed = 33
    todo1 = dataManager.addNewToDo("ToDo example B")
    todo1.description = "a description"
    todo1.priority = 3
    todo1.completed = 33
    todo1 = dataManager.addNewToDo("ToDo example C")
    todo1.description = "a description"
    todo1.priority = 3
    todo1.completed = 33

    todo2 = dataManager.addNewToDo("ToDo example 2")
    todo2.description = "a description"
    todo2.priority = 5
    todo2.completed = 20

    todo2 = dataManager.addNewToDo("ToDo example 3")
    todo2.description = "a description"
    todo2.priority = 1
    todo2.completed = 0

    todoCompleted = dataManager.addNewToDo("completed ToDo 1")
    todoCompleted.description = "a description"
    todoCompleted.priority = 1
    todoCompleted.completed = 100

    dataManager.addNote("note 2", "note content")
コード例 #28
0
## ============================= main section ===================================


if __name__ != '__main__':
    sys.exit(0)


app = QApplication(sys.argv)
app.setApplicationName("Hanlendar")
app.setOrganizationName("arnet")
### app.setOrganizationDomain("www.my-org.com")

taskDate = datetime.today().replace( hour=8 )

task1 = Task()
task1.title = "Completed Task"
task1.description = "Description"
task1.completed = 100
task1.priority = 5
task1.startDateTime = taskDate
task1.dueDateTime = task1.startDateTime + timedelta( hours=4 )

task2 = Task()
task2.title = "Task 1"
task2.description = "Description"
task2.completed = 0
task2.priority = 3
task2.setDefaultDateTime( taskDate + timedelta( hours=6 ) )

task3 = Task()
コード例 #29
0
ファイル: taskdialog.py プロジェクト: anetczuk/hanlendar
class TaskDialog(QtBaseClass):  # type: ignore
    def __init__(self, taskObject, parentWidget=None):
        super().__init__(parentWidget)
        self.ui = UiTargetClass()
        self.ui.setupUi(self)

        if taskObject is not None:
            self.task = copy.deepcopy(taskObject)
        else:
            self.task = Task()

        self.completed = self.task.completed

        self.ui.reminderWidget.setTask(self.task)
        self.ui.recurrentWidget.setTask(self.task)

        if self.task.occurrenceStart is None:
            self.ui.deadlineBox.setChecked(True)
            if self.task.occurrenceDue is None:
                self.task.dueDateTime = datetime.today()
            self.ui.startDateTime.setDateTime(self.task.occurrenceDue)
        else:
            self.ui.deadlineBox.setChecked(False)
            self.ui.startDateTime.setDateTime(self.task.occurrenceStart)
            if self.task.occurrenceDue is None:
                self.task.dueDateTime = self.task.occurrenceStart + timedelta(
                    hours=1)

        self.ui.descriptionEdit.setContextMenuPolicy(Qt.CustomContextMenu)

        self.ui.titleEdit.setText(self.task.title)
        self.ui.descriptionEdit.setText(self.task.description)
        self.ui.completionSlider.setValue(self.task.completed)
        self.ui.priorityBox.setValue(self.task.priority)
        self.ui.dueDateTime.setDateTime(self.task.occurrenceDue)

        self.ui.titleEdit.textChanged.connect(self._titleChanged)
        self.ui.descriptionEdit.textChanged.connect(self._descriptionChanged)
        self.ui.descriptionEdit.anchorClicked.connect(self._openLink)
        self.ui.descriptionEdit.customContextMenuRequested.connect(
            self.textEditContextMenuRequest)
        self.ui.completionSlider.valueChanged.connect(self._completedChanged)
        self.ui.priorityBox.valueChanged.connect(self._priorityChanged)
        self.ui.deadlineBox.stateChanged.connect(self._deadlineChanged)
        self.ui.startDateTime.dateTimeChanged.connect(self._startChanged)
        self.ui.dueDateTime.dateTimeChanged.connect(self._dueChanged)

        self.ui.openLocalFilePB.clicked.connect(self._openLocalFile)
        self.ui.openLocalDirPB.clicked.connect(self._openLocalDir)
        self.ui.addUrlPB.clicked.connect(self._addUrl)

        self.finished.connect(self._finished)

    def _titleChanged(self, newValue):
        self.task.title = newValue

    def _descriptionChanged(self):
        newValue = self.ui.descriptionEdit.toHtml()
        self.task.description = newValue

    def _completedChanged(self, newValue):
        #self.task.completed = newValue
        self.completed = newValue

    def _priorityChanged(self, newValue):
        self.task.priority = newValue

    ## deadline checkbox
    def _deadlineChanged(self, _):
        if self.ui.deadlineBox.isChecked():
            self.task.setDeadline()
        else:
            startDateTime = self.ui.startDateTime.dateTime()
            self.task.occurrenceStart = startDateTime.toPyDateTime()
        self.ui.recurrentWidget.refreshWidget()

    def _startChanged(self, newValue):
        startDateTime = newValue.toPyDateTime()
        self.task.occurrenceStart = startDateTime.replace(second=0)
        if self.task.occurrenceStart > self.task.occurrenceDue:
            self.ui.dueDateTime.setDateTime(self.task.occurrenceStart)
        self.ui.recurrentWidget.refreshWidget()

    def _dueChanged(self, newValue):
        dueDateTime = newValue.toPyDateTime()
        self.task.occurrenceDue = dueDateTime.replace(second=0)
        if self.task.occurrenceStart is not None and self.task.occurrenceDue < self.task.occurrenceStart:
            self.ui.startDateTime.setDateTime(self.task.occurrenceDue)
        self.ui.recurrentWidget.refreshWidget()

    def _openLocalFile(self):
        fielDialog = QFileDialog(self)
        fielDialog.setFileMode(QFileDialog.ExistingFile)
        dialogCode = fielDialog.exec_()
        if dialogCode == QDialog.Rejected:
            return
        selectedFile = fielDialog.selectedFiles()[0]
        fileUrl = QUrl.fromLocalFile(selectedFile)
        self.ui.urlEdit.setText(fileUrl.toString())

    def _openLocalDir(self):
        fielDialog = QFileDialog(self)
        fielDialog.setFileMode(QFileDialog.Directory)
        dialogCode = fielDialog.exec_()
        if dialogCode == QDialog.Rejected:
            return
        selectedFile = fielDialog.selectedFiles()[0]
        fileUrl = QUrl.fromLocalFile(selectedFile)
        self.ui.urlEdit.setText(fileUrl.toString())

    def _addUrl(self):
        urlText = self.ui.urlEdit.text()
        if len(urlText) < 1:
            return
        hrefText = "<a href=\"%s\">%s</a> " % (urlText, urlText)
        self.ui.descriptionEdit.insertHtml(hrefText)
        self.ui.urlEdit.setText("")

    def _openLink(self, link):
        #         QDesktopServices.openUrl( QUrl("http://google.com") )
        #         QDesktopServices.openUrl( QUrl("file:///media/E/bluetooth.txt") )
        self.ui.urlEdit.setText(link.toLocalFile())
        QDesktopServices.openUrl(link)

    def textEditContextMenuRequest(self, point):
        menu = self.ui.descriptionEdit.createStandardContextMenu()
        deleteAction = find_action(menu, "Delete")
        pastePlainAction = QAction(menu)
        menu.insertAction(deleteAction, pastePlainAction)
        pastePlainAction.setText("Paste unformatted")
        # pastePlainAction.setShortcut( QKeySequence("Ctrl+Shift+V") )
        pastePlainAction.triggered.connect(self._pasteUnformattedToDescription)
        if self.ui.descriptionEdit.canPaste() is False:
            pastePlainAction.setEnabled(False)
        globalPos = self.ui.descriptionEdit.mapToGlobal(point)
        menu.exec_(globalPos)

    def _finished(self, _):
        self.task.completed = self.completed

    def _pasteUnformattedToDescription(self):
        richTextState = self.ui.descriptionEdit.acceptRichText()
        self.ui.descriptionEdit.setAcceptRichText(False)
        self.ui.descriptionEdit.paste()
        self.ui.descriptionEdit.setAcceptRichText(richTextState)