# Relational
# Copyright (C) 2016-2025  Salvo "LtWorf" Tomaselli
#
# Relational is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# author Salvo "LtWorf" Tomaselli <tiposchi@tiscali.it>
#
# This module provides a classes to represent relations and to perform
# relational operations on them.

from PyQt6.QtWidgets import QPlainTextEdit
from PyQt6.QtWidgets import QTextEdit
from PyQt6.QtCore import Qt
from PyQt6.QtGui import QColor
from PyQt6.QtGui import QPalette
from PyQt6.QtGui import QTextCharFormat
from PyQt6.QtGui import QWheelEvent


class Editor(QPlainTextEdit):

    def __init__(self, *args, **kwargs):
        super(Editor, self).__init__(*args, **kwargs)

        self._cursor_moved()
        self.cursorPositionChanged.connect(self._cursor_moved)

    def _cursor_moved(self) -> None:
        selections = []

        # Current line
        cur_line = QTextEdit.ExtraSelection()
        bgcolor = QPalette().color(
            QPalette.ColorGroup.Active,
            QPalette.ColorRole.Window,
        ).lighter()
        cur_line.format.setBackground(bgcolor)
        cur_line.format.setProperty(
            QTextCharFormat.Property.FullWidthSelection,
            True
        )
        cur_line.cursor = self.textCursor()
        cur_line.cursor.clearSelection()
        selections.append(cur_line)

        # Apply the selections
        self.setExtraSelections(selections)

    def wheelEvent(self, event: QWheelEvent | None) -> None:
        if event is not None and event.modifiers().value == Qt.Modifier.CTRL.value:
            event.accept()
            self.zoom(1 if event.angleDelta().y()>0 else -1)
        else:
            super(Editor, self).wheelEvent(event)

    def zoom(self, incr: int) -> None:
        font = self.font()
        point_size = font.pointSize()
        point_size += incr
        if point_size < 1:
            return
        font.setPointSize(point_size)
        self.setFont(font)
