Exemple #1
0
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.resize(1024, 600)

        self.controller = Controller()
        self.notesWidget = NoteWidget(parent=self)

        self.cur_label_id = None
        self.cur_note = None

        self.init_ui()

        self.setWindowTitle('NOTE TAKING APP')
        self.update_labels()
        self.fetch_notes()

    def init_ui(self):
        self.ui.setupUi(self)
        self.resize(1024, 600)

        self.ui.horizontalLayout.addWidget(self.notesWidget)
        self.ui.horizontalLayout.setStretch(0, 2)
        self.ui.horizontalLayout.setStretch(1, 3)
        self.ui.horizontalLayout.setStretch(2, 8)

        self.ui.newLabelBtn.clicked.connect(self.create_label)
        self.ui.labelsListWidget.itemDoubleClicked.connect(self.label_clicked)
        self.ui.deleteLabelBtn.clicked.connect(self.delete_label)
        self.ui.searchBtn.clicked.connect(self.search_notes)

        self.notesWidget.note_created.connect(self.create_note)
        self.notesWidget.note_deleted.connect(self.delete_note)
        self.notesWidget.note_data_saved.connect(self.save_note)

    def update_labels(self):
        labels = self.controller.get_labels()
        active_labels = ()
        if self.cur_note is not None:
            active_labels = self.controller.get_labels_for_note(
                self.cur_note.id)

        self.notesWidget.update_labels(labels, active_labels)

        self.ui.labelsListWidget.clear()
        # first fake label, by clicking on it just fetch all notes
        item = QListWidgetItem("All notes")
        setattr(item, 'id', None)
        self.ui.labelsListWidget.addItem(item)

        for label in labels:
            item = QListWidgetItem(f'{label.name}')
            setattr(item, 'id', label.id)
            self.ui.labelsListWidget.addItem(item)

    def create_label(self):
        text, ok = QInputDialog.getText(self, 'Dialog', 'Input label name:')
        if ok:
            self.controller.save_label(Label(text))

        self.update_labels()

    def delete_label(self):
        labels = self.controller.get_labels()
        text, ok = QInputDialog.getItem(self, 'Delete label', 'Select label',
                                        (label.name for label in labels))
        label_to_del = next((label for label in labels if text == label.name),
                            None)
        if ok and label_to_del is not None:
            self.controller.delete_label(label_to_del.id)

        self.update_labels()

    def create_note(self):
        self.cur_note = self.controller.save_note(
            Note(name="untitled", content=""))
        self.notesWidget.set_data(self.cur_note.name, self.cur_note.content)
        self.notesWidget.update_labels(self.controller.get_labels(), tuple())
        self.fetch_notes(self.cur_label_id)

    def save_note(self, note_data: Dict):
        name, content, new_labels_id = note_data.values()
        note_to_save = Note(name=name, content=content)
        if self.cur_note is not None:
            note_to_save.id = self.cur_note.id
        self.cur_note = self.controller.save_note(note_to_save)

        old_labels = self.controller.get_labels_for_note(self.cur_note.id)
        old_labels_id = map(lambda l: l.id, old_labels)
        self.controller.delete_labels_from_note(self.cur_note.id,
                                                old_labels_id)
        self.controller.add_labels_to_note(self.cur_note.id, new_labels_id)

        self.fetch_notes(self.cur_label_id)

    def delete_note(self):
        if self.cur_note is not None:
            self.controller.delete_note(self.cur_note.id)
            self.cur_note = None
            self.fetch_notes(self.cur_label_id)

    def fetch_notes(self, label_id=None):
        notes = self.controller.get_notes(label_id)
        self.ui.notesListWidget.clear()
        for note in notes:
            note_preview = NotePreviewWidget(note, self)

            note_preview.note_passed.connect(self.setup_note)

            item = QListWidgetItem()
            item.setSizeHint(note_preview.minimumSizeHint())
            self.ui.notesListWidget.addItem(item)
            self.ui.notesListWidget.setItemWidget(item, note_preview)

    def label_clicked(self, label_item: QListWidgetItem) -> None:
        self.cur_label_id = label_item.id
        self.fetch_notes(self.cur_label_id)

    def setup_note(self, note: Note):
        self.cur_note = note
        labels = self.controller.get_labels()
        note_labels = self.controller.get_labels_for_note(self.cur_note.id)
        self.notesWidget.set_data(name=self.cur_note.name,
                                  content=self.cur_note.content)
        self.notesWidget.update_labels(labels, note_labels)

    def search_notes(self):
        text = self.ui.searchEdit.text()
        for index in range(self.ui.notesListWidget.count()):
            item = self.ui.notesListWidget.item(index)
            item.setHidden(True)
            note_preview = self.ui.notesListWidget.itemWidget(item)
            note = note_preview.getNote()
            if text in note.name:
                item.setHidden(False)