Files
SemesterapparatsManager/src/ui/widgets/MessageCalendar.py

90 lines
2.9 KiB
Python

import sys
from typing import Any
import darkdetect
import loguru
from PyQt6 import QtCore, QtWidgets
from PyQt6.QtCore import QDate
from PyQt6.QtGui import QColor, QPen
from src import LOG_DIR
from src.backend import Database
log = loguru.logger
log.remove()
log.add(sys.stdout, level="INFO")
log.add(f"{LOG_DIR}/application.log", rotation="1 MB", retention="10 days")
color = "#ddfb00" if darkdetect.isDark() else "#2204ff"
pen = QPen(QColor(color))
pen.setWidth(5)
class MessageCalendar(QtWidgets.QCalendarWidget):
# Widget for MessageCalendar
def __init__(self, parent=None):
super().__init__(parent)
self.messages = {} # Dictionary to store dates with messages
self.setFirstDayOfWeek(QtCore.Qt.DayOfWeek.Monday)
self.setGridVisible(True)
self.getMessages()
def getMessages(self):
# Get the messages from the database
messages = Database().getAllMessages()
log.debug("Got {} messages", len(messages))
self.setMessages(messages)
def deleteMessage(self, id):
message = [message for message in self.messages if message["id"] == id][0]
self.messages.remove(message)
self.updateCells()
def setMessages(self, messages: list[dict[str, Any]]):
# remove all drawn circles
for message in messages:
# print(message)
# Convert the date string to a QDate object
date = QDate.fromString(message["remind_at"], "yyyy-MM-dd")
# Store the message for the date
self.messages[date] = message["message"]
self.updateCells()
def updateCells(self):
self.repaint()
def paintCell(self, painter, rect, date):
super().paintCell(painter, rect, date)
# Check if there is a message for the current date
if date in self.messages:
# draw a circle below the date
painter.setPen(pen)
# increase draw size
bl = rect.bottomLeft()
bl.setX(bl.x() + 8)
bl.setY(bl.y() - 8)
painter.drawEllipse(bl, 5, 5)
else:
for cell in self.messages:
if cell.month() == date.month() and cell.year() == date.year():
# draw a circle below the date
painter.setPen(QPen(QtCore.Qt.GlobalColor.transparent))
bl = rect.bottomLeft()
bl.setX(bl.x() + 8)
bl.setY(bl.y() - 8)
painter.drawEllipse(bl, 5, 5)
def reload(self, date):
qdate = QDate.fromString(date, "yyyy-MM-dd")
del self.messages[qdate]
self.updateCells()
# def change_stylesheet_cell(self, date: QDate, color: str):
# # change the stylesheet of a cell
# self.setStyleSheet(
# f"QCalendarWidget QTableView QTableCornerButton::section {{background-color: {color};}}"
# )