mirror-chatterino2/src/widgets/helper/TitlebarButtons.cpp
nerix 812186dc4c
Return correct hit-test values for title bar buttons on Windows (#4994)
Co-authored-by: Rasmus Karlsson <rasmus.karlsson@pajlada.com>
2023-12-03 13:41:33 +00:00

117 lines
2.9 KiB
C++

#include "widgets/helper/TitlebarButtons.hpp"
#ifdef USEWINSDK
# include "widgets/helper/TitlebarButton.hpp"
# include <Windows.h>
# include <cassert>
namespace chatterino {
TitleBarButtons::TitleBarButtons(QWidget *window, TitleBarButton *minButton,
TitleBarButton *maxButton,
TitleBarButton *closeButton)
: QObject(window)
, window_(window)
, minButton_(minButton)
, maxButton_(maxButton)
, closeButton_(closeButton)
{
}
void TitleBarButtons::hover(size_t ht, QPoint at)
{
TitleBarButton *hovered{};
TitleBarButton *other1{};
TitleBarButton *other2{};
switch (ht)
{
case HTMAXBUTTON:
hovered = this->maxButton_;
other1 = this->minButton_;
other2 = this->closeButton_;
break;
case HTMINBUTTON:
hovered = this->minButton_;
other1 = this->maxButton_;
other2 = this->closeButton_;
break;
case HTCLOSE:
hovered = this->closeButton_;
other1 = this->minButton_;
other2 = this->maxButton_;
break;
default:
assert(false && "TitleBarButtons::hover precondition violated");
return;
}
hovered->ncEnter();
hovered->ncMove(hovered->mapFromGlobal(at));
other1->ncLeave();
other2->ncLeave();
}
void TitleBarButtons::leave()
{
this->minButton_->ncLeave();
this->maxButton_->ncLeave();
this->closeButton_->ncLeave();
}
void TitleBarButtons::mousePress(size_t ht, QPoint at)
{
auto *button = this->buttonForHt(ht);
button->ncMousePress(button->mapFromGlobal(at));
}
void TitleBarButtons::mouseRelease(size_t ht, QPoint at)
{
auto *button = this->buttonForHt(ht);
button->ncMouseRelease(button->mapFromGlobal(at));
}
void TitleBarButtons::updateMaxButton()
{
this->maxButton_->setButtonStyle(
this->window_->windowState().testFlag(Qt::WindowMaximized)
? TitleBarButtonStyle::Unmaximize
: TitleBarButtonStyle::Maximize);
}
void TitleBarButtons::setSmallSize()
{
this->minButton_->setScaleIndependantSize(30, 30);
this->maxButton_->setScaleIndependantSize(30, 30);
this->closeButton_->setScaleIndependantSize(30, 30);
}
void TitleBarButtons::setRegularSize()
{
this->minButton_->setScaleIndependantSize(46, 30);
this->maxButton_->setScaleIndependantSize(46, 30);
this->closeButton_->setScaleIndependantSize(46, 30);
}
TitleBarButton *TitleBarButtons::buttonForHt(size_t ht) const
{
switch (ht)
{
case HTMAXBUTTON:
return this->maxButton_;
case HTMINBUTTON:
return this->minButton_;
case HTCLOSE:
return this->closeButton_;
default:
assert(false &&
"TitleBarButtons::buttonForHt precondition violated");
return nullptr;
}
}
} // namespace chatterino
#endif