dark/light mode & accent color

This commit is contained in:
Hane 2024-11-26 17:11:01 +01:00
commit 60890cecad
9 changed files with 178 additions and 44 deletions

View file

@ -7,19 +7,27 @@ bool DarkModeEventFilter::nativeEventFilter(const QByteArray &eventType, void *m
if (eventType == "windows_generic_MSG") {
ProcessedNativeEvent event = osh->processTopLevelWindowMessage(message);
switch(event) {
case LIGHT_MODE:
case COLORS:
StylingHelper::setBackgroundColor(osh->isLightMode());
//Update accent color across entire app
{
uint32_t color = osh->getAccentColor();
uint8_t r, g, b, a;
if (StylingHelper::argbToDiscreteValues(osh->getAccentColor(), &r, &g, &b, &a)) {
const QWidgetList topLevelWidgets = QApplication::topLevelWidgets();
for (QWidget *widget : topLevelWidgets) {
if(qobject_cast<MainWindow*>(widget)) {
((MainWindow*)widget)->updateColor(r, g, b, a);
}
}
}
}
return true;
break;
default:
break;
}
/*
* if ([event type] == NSKeyDown) {
* // Handle key event
* qDebug() << QString::fromNSString([event characters]);
* }
*/
}
return false;
}
@ -124,8 +132,8 @@ void MeterSlider::paintEvent(QPaintEvent *event) {
sliderComplex2.subControls |= QStyle::SC_SliderTickmarks;
QPainter painter(this);
QStyle* stle = QApplication::style();
stle->drawComplexControl((QStyle::ComplexControl)CC_MeterSlider, &sliderComplex2, &painter, this);
QStyle* style = QApplication::style();
style->drawComplexControl((QStyle::ComplexControl)CC_MeterSlider, &sliderComplex2, &painter, this);
//Q_D(QSlider);
@ -252,6 +260,13 @@ QRect MainWindow::setSizePosition(QScreen* screen, int width, int height) {
}
}
void MainWindow::updateColor(uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
QColor color(r, g, b, a);
QPalette pal = QPalette(color);
pal.setColor(QPalette::Highlight, color);
scrollArea->verticalScrollBar()->setPalette(pal);
}
void MainWindow::compose() {
//todo: invalidate layout when adding sessions with window open
//We need dynamically added child widgets to expand so that we know their height
@ -1022,6 +1037,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setContentsMargins(QMargins(0, 0, 0, 0));
//ScrollBarFocusFilter focusFilter = new ScrollBarFocusFilter(this);
scrollArea->verticalScrollBar()->installEventFilter(this);
scrollArea->horizontalScrollBar()->installEventFilter(this);
//scrollArea->verticalScrollBar()->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
//scrollArea->verticalScrollBar()->setSingleStep(1);
@ -1070,6 +1089,13 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
this->recentlyClosedTimer->start();
}
});
/*
* Set accent color
*/
uint8_t a, r, g, b;
if (StylingHelper::argbToDiscreteValues(osh->getAccentColor(), &r, &g, &b, &a))
this->updateColor(r, g, b, a);
/*
* Set of function callback definitons for EndpointSituationCallback
@ -1090,6 +1116,50 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
}
bool MainWindow::eventFilter(QObject *object, QEvent *event) {
//QScrollBar* widgetCast = qobject_cast<QScrollBar*>(object);
if (object == scrollArea->verticalScrollBar()) {
[[maybe_unused]] QEvent::Type tipo = event->type();
if (event->type() == QHoverEvent::HoverEnter) {
log_debugcpp("Hover event: ");
log_debugcpp("\tGlobal pos: "
+ std::to_string(((QHoverEvent*)event)->globalPosition().x())
+ ", "
+ std::to_string(((QHoverEvent*)event)->globalPosition().y()));
log_debugcpp("\tNewWid pos: "
+ std::to_string(((QHoverEvent*)event)->position().x())
+ ", "
+ std::to_string(((QHoverEvent*)event)->position().y()));
log_debugcpp("\tOldWid pos: "
+ std::to_string(((QHoverEvent*)event)->oldPos().x())
+ ", "
+ std::to_string(((QHoverEvent*)event)->oldPos().y()));
}
if (event->type() == QScrollEvent::ScrollFinished) {
QHoverEvent* hoverEvent = new QHoverEvent(QEvent::HoverEnter,
scrollArea->verticalScrollBar()->mapFromGlobal(QCursor::pos()),
QCursor::pos(),
scrollArea->verticalScrollBar()->mapFromGlobal(QCursor::pos()));
log_debugcpp("ScrollFinished event: ");
log_debugcpp("\tGlobal pos: "
+ std::to_string(QCursor::pos().x())
+ ", "
+ std::to_string(QCursor::pos().y()));
log_debugcpp("\tWidget pos: "
+ std::to_string(scrollArea->verticalScrollBar()->mapFromGlobal(QCursor::pos()).x())
+ ", "
+ std::to_string(scrollArea->verticalScrollBar()->mapFromGlobal(QCursor::pos()).y()));
QCoreApplication::instance()->postEvent(scrollArea->verticalScrollBar(), hoverEvent);
/*
* QCoreApplication::instance()->postEvent(this, new CustomWidgetEvent<SessionHandler*>((QEvent::Type)CustomQEvent::SessionWidgetObsolete, sessionHandler));
*/
//scrollArea->setFocus(Qt::MouseFocusReason);
return false;
}}
return false;
}
void MainWindow::flushRoleChanges() {
//TODO: bucket list deque
std::pair<Roles, std::wstring> change = roleBucketList.front();