mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-13 19:49:51 +01:00
making user dialog draggable on windows
This commit is contained in:
parent
78b20776a8
commit
b2be44bbe7
|
@ -16,6 +16,7 @@
|
|||
#include <QDebug>
|
||||
#include <QDesktopWidget>
|
||||
#include <QIcon>
|
||||
#include <functional>
|
||||
|
||||
#ifdef USEWINSDK
|
||||
#include <ObjIdl.h>
|
||||
|
@ -393,14 +394,17 @@ bool BaseWindow::nativeEvent(const QByteArray &eventType, void *message, long *r
|
|||
}
|
||||
} break;
|
||||
case WM_NCHITTEST: {
|
||||
const LONG border_width = 8; // in pixels
|
||||
RECT winrect;
|
||||
GetWindowRect(HWND(winId()), &winrect);
|
||||
|
||||
long x = GET_X_LPARAM(msg->lParam);
|
||||
long y = GET_Y_LPARAM(msg->lParam);
|
||||
|
||||
QPoint point(x - winrect.left, y - winrect.top);
|
||||
|
||||
if (this->hasCustomWindowFrame()) {
|
||||
*result = 0;
|
||||
const LONG border_width = 8; // in pixels
|
||||
RECT winrect;
|
||||
GetWindowRect(HWND(winId()), &winrect);
|
||||
|
||||
long x = GET_X_LPARAM(msg->lParam);
|
||||
long y = GET_Y_LPARAM(msg->lParam);
|
||||
|
||||
bool resizeWidth = minimumWidth() != maximumWidth();
|
||||
bool resizeHeight = minimumHeight() != maximumHeight();
|
||||
|
@ -451,7 +455,6 @@ bool BaseWindow::nativeEvent(const QByteArray &eventType, void *message, long *r
|
|||
if (*result == 0) {
|
||||
bool client = false;
|
||||
|
||||
QPoint point(x - winrect.left, y - winrect.top);
|
||||
for (QWidget *widget : this->ui_.buttons) {
|
||||
if (widget->geometry().contains(point)) {
|
||||
client = true;
|
||||
|
@ -469,6 +472,36 @@ bool BaseWindow::nativeEvent(const QByteArray &eventType, void *message, long *r
|
|||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
} else if (this->flags_ & FramelessDraggable) {
|
||||
*result = 0;
|
||||
bool client = false;
|
||||
|
||||
if (auto widget = this->childAt(point)) {
|
||||
std::function<bool(QWidget *)> recursiveCheckMouseTracking;
|
||||
recursiveCheckMouseTracking = [&](QWidget *widget) {
|
||||
if (widget == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (widget->hasMouseTracking()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return recursiveCheckMouseTracking(widget->parentWidget());
|
||||
};
|
||||
|
||||
if (recursiveCheckMouseTracking(widget)) {
|
||||
client = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (client) {
|
||||
*result = HTCLIENT;
|
||||
} else {
|
||||
*result = HTCAPTION;
|
||||
}
|
||||
|
||||
return true;
|
||||
} else {
|
||||
return QWidget::nativeEvent(eventType, message, result);
|
||||
|
|
|
@ -27,6 +27,7 @@ public:
|
|||
TopMost = 4,
|
||||
DeleteOnFocusOut = 8,
|
||||
DisableCustomScaling = 16,
|
||||
FramelessDraggable = 32,
|
||||
};
|
||||
|
||||
explicit BaseWindow(QWidget *parent = nullptr, Flags flags_ = None);
|
||||
|
|
|
@ -129,8 +129,8 @@ void SplitHeader::addDropdownItems(RippleEffectButton *)
|
|||
this->dropdownMenu.addSeparator();
|
||||
this->dropdownMenu.addAction("Reload channel emotes", this, SLOT(menuReloadChannelEmotes()));
|
||||
this->dropdownMenu.addAction("Manual reconnect", this, SLOT(menuManualReconnect()));
|
||||
this->dropdownMenu.addSeparator();
|
||||
this->dropdownMenu.addAction("Show changelog", this, SLOT(menuShowChangelog()));
|
||||
// this->dropdownMenu.addSeparator();
|
||||
// this->dropdownMenu.addAction("Show changelog", this, SLOT(menuShowChangelog()));
|
||||
// clang-format on
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,8 @@ namespace chatterino {
|
|||
namespace widgets {
|
||||
|
||||
UserInfoPopup::UserInfoPopup()
|
||||
: BaseWindow(nullptr, BaseWindow::Flags(BaseWindow::Frameless | BaseWindow::DeleteOnFocusOut))
|
||||
: BaseWindow(nullptr, BaseWindow::Flags(BaseWindow::Frameless | BaseWindow::DeleteOnFocusOut |
|
||||
BaseWindow::FramelessDraggable))
|
||||
, hack_(new bool)
|
||||
{
|
||||
this->setStayInScreenRect(true);
|
||||
|
@ -376,21 +377,16 @@ UserInfoPopup::TimeoutWidget::TimeoutWidget()
|
|||
|
||||
addTimeouts("sec", {{"1", 1}});
|
||||
addTimeouts("min", {
|
||||
{"1", 1 * 60},
|
||||
{"5", 5 * 60},
|
||||
{"10", 10 * 60},
|
||||
{"1", 1 * 60}, {"5", 5 * 60}, {"10", 10 * 60},
|
||||
});
|
||||
addTimeouts("hour", {
|
||||
{"1", 1 * 60 * 60},
|
||||
{"4", 4 * 60 * 60},
|
||||
{"1", 1 * 60 * 60}, {"4", 4 * 60 * 60},
|
||||
});
|
||||
addTimeouts("days", {
|
||||
{"1", 1 * 60 * 60 * 24},
|
||||
{"3", 3 * 60 * 60 * 24},
|
||||
{"1", 1 * 60 * 60 * 24}, {"3", 3 * 60 * 60 * 24},
|
||||
});
|
||||
addTimeouts("weeks", {
|
||||
{"1", 1 * 60 * 60 * 24 * 7},
|
||||
{"2", 2 * 60 * 60 * 24 * 7},
|
||||
{"1", 1 * 60 * 60 * 24 * 7}, {"2", 2 * 60 * 60 * 24 * 7},
|
||||
});
|
||||
|
||||
addButton(Ban, "ban", getApp()->resources->buttons.ban);
|
||||
|
|
Loading…
Reference in a new issue