added gotToBottom and EnableNonClientDpiScaling

This commit is contained in:
fourtf 2017-09-21 17:34:41 +02:00
parent 3e24752477
commit 222eedcd21
18 changed files with 108 additions and 53 deletions

View file

@ -178,21 +178,21 @@ win32 {
}
# Optional dependency on windows sdk 7.1
#win32:exists(C:\Program Files\Microsoft SDKs\Windows\v7.1\Include\Windows.h) {
# LIBS += -L"C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib" \
# -ldwmapi \
# -lgdi32
#
win32:exists(C:\Program Files\Microsoft SDKs\Windows\v7.1\Include\Windows.h) {
LIBS += -L"C:\Program Files\Microsoft SDKs\Windows\v7.1\Lib" \
-ldwmapi \
-lgdi32
# SOURCES += platform/borderless/qwinwidget.cpp \
# platform/borderless/winnativewindow.cpp \
# platform/borderless/widget.cpp
#
# HEADERS += platform/borderless/qwinwidget.h \
# platform/borderless/winnativewindow.h \
# platform/borderless/widget.h
#
# DEFINES += "USEWINSDK"
#}
DEFINES += "USEWINSDK"
}
macx {
INCLUDEPATH += /usr/local/include

2
resources/qt.conf Normal file
View file

@ -0,0 +1,2 @@
[Platforms]
WindowArguments = dpiawareness=2

View file

@ -33,4 +33,7 @@
<file>images/VSO_Link_blue_16x.png</file>
<file>sounds/ping2.wav</file>
</qresource>
<qresource prefix="/qt/etc">
<file>qt.conf</file>
</qresource>
</RCC>

View file

@ -1,12 +1,41 @@
#include "application.hpp"
#include <QAbstractNativeEventFilter>
#include <QApplication>
#include <QDir>
#include <QLibrary>
#include <QStandardPaths>
#include <pajlada/settings/settingmanager.hpp>
#ifdef USEWINSDK
#include "windows.h"
#endif
namespace {
#ifdef USEWINSDK
class DpiNativeEventFilter : public QAbstractNativeEventFilter
{
public:
bool nativeEventFilter(const QByteArray &eventType, void *message, long *result) override
{
MSG *msg = reinterpret_cast<MSG *>(message);
if (msg->message == WM_NCCREATE) {
typedef BOOL(WINAPI * EnableNonClientDpiScaling)(HWND);
QLibrary user32("user32.dll", NULL);
EnableNonClientDpiScaling enableNonClientDpiScaling =
(EnableNonClientDpiScaling)user32.resolve("EnableNonClientDpiScaling");
if (enableNonClientDpiScaling)
enableNonClientDpiScaling(msg->hwnd);
}
return false;
}
};
#endif
inline bool initSettings(bool portable)
{
QString settingsPath;
@ -38,6 +67,10 @@ int main(int argc, char *argv[])
{
QApplication a(argc, argv);
#ifdef USEWINSDK
a.installNativeEventFilter(new DpiNativeEventFilter);
#endif
a.setAttribute(Qt::AA_EnableHighDpiScaling, true);
// Options

View file

@ -42,13 +42,24 @@ ChannelView::ChannelView(WindowManager &windowManager, BaseWidget *parent)
this->scrollBar.getCurrentValueChanged().connect([this] {
// Whenever the scrollbar value has been changed, re-render the ChatWidgetView
this->update();
this->layoutMessages();
this->goToBottom->setVisible(this->scrollBar.isVisible() && !this->scrollBar.isAtBottom());
this->update();
});
this->repaintGifsConnection =
windowManager.repaintGifs.connect([&] { this->updateGifEmotes(); });
this->layoutConnection = windowManager.repaintGifs.connect([&] { this->layout(); });
this->goToBottom = new RippleEffectLabel(this, 0);
this->goToBottom->setStyleSheet("background-color: rgba(0,0,0,0.5); color: #FFF;");
this->goToBottom->getLabel().setText("Jump to bottom");
this->goToBottom->setVisible(false);
connect(goToBottom, &RippleEffectLabel::clicked, this,
[this] { QTimer::singleShot(180, [this] { this->scrollBar.scrollToBottom(); }); });
}
ChannelView::~ChannelView()
@ -340,6 +351,10 @@ void ChannelView::resizeEvent(QResizeEvent *)
this->scrollBar.resize(this->scrollBar.width(), height());
this->scrollBar.move(width() - this->scrollBar.width(), 0);
this->goToBottom->setGeometry(0, this->height() - 32, this->width(), 32);
this->scrollBar.raise();
layoutMessages();
this->update();

View file

@ -7,6 +7,7 @@
#include "messages/word.hpp"
#include "widgets/accountpopup.hpp"
#include "widgets/basewidget.hpp"
#include "widgets/rippleeffectlabel.hpp"
#include "widgets/scrollbar.hpp"
#include <QPaintEvent>
@ -135,6 +136,7 @@ private:
std::vector<GifEmoteData> gifEmotes;
ScrollBar scrollBar;
RippleEffectLabel *goToBottom;
// This variable can be used to decide whether or not we should render the "Show latest
// messages" button
@ -155,6 +157,7 @@ private:
boost::signals2::connection messageAppendedConnection;
boost::signals2::connection messageRemovedConnection;
boost::signals2::connection repaintGifsConnection;
boost::signals2::connection layoutConnection;
private slots:
void wordTypeMaskChanged()

View file

@ -9,6 +9,7 @@
#include "widgets/channelview.hpp"
#include "widgets/chatwidgetheader.hpp"
#include "widgets/chatwidgetinput.hpp"
#include "widgets/rippleeffectlabel.hpp"
#include <QFont>
#include <QShortcut>

View file

@ -7,13 +7,14 @@
#include "widgets/settingsdialog.hpp"
#include <QDebug>
#include <QLibrary>
#include <QPalette>
#include <QShortcut>
#include <QVBoxLayout>
#include <boost/foreach.hpp>
#ifdef USEWINSDK
#include "Windows.hpp"
#include "windows.h"
#endif
namespace chatterino {
@ -70,24 +71,18 @@ MainWindow::~MainWindow()
{
}
void MainWindow::layoutVisibleChatWidgets(Channel *channel)
#ifdef USEWINSDK
bool MainWindow::nativeEvent(const QByteArray &eventType, void *message, long *result)
{
auto *page = this->notebook.getSelectedPage();
MSG *msg = reinterpret_cast<MSG *>(message);
if (page == nullptr) {
return;
if (msg->message == 0x02E0) {
qDebug() << "dpi changed";
}
const std::vector<ChatWidget *> &widgets = page->getChatWidgets();
for (auto it = widgets.begin(); it != widgets.end(); ++it) {
ChatWidget *widget = *it;
if (channel == nullptr || channel == widget->getChannel().get()) {
widget->layoutMessages();
}
}
return QWidget::nativeEvent(eventType, message, result);
}
#endif
void MainWindow::repaintVisibleChatWidgets(Channel *channel)
{

View file

@ -4,9 +4,9 @@
#include "widgets/notebook.hpp"
#include "widgets/titlebar.hpp"
#ifdef USEWINSDK
#include <platform/borderless/qwinwidget.h>
#endif
//#ifdef USEWINSDK
//#include <platform/borderless/qwinwidget.h>
//#endif
#include <QMainWindow>
#include <boost/property_tree/ptree.hpp>
@ -30,7 +30,6 @@ public:
CompletionManager &_completionManager);
~MainWindow();
void layoutVisibleChatWidgets(Channel *channel = nullptr);
void repaintVisibleChatWidgets(Channel *channel = nullptr);
void load(const boost::property_tree::ptree &tree);
@ -43,6 +42,9 @@ public:
protected:
virtual void closeEvent(QCloseEvent *event) override;
#ifdef USEWINSDK
virtual bool nativeEvent(const QByteArray &eventType, void *message, long *result) override;
#endif
private:
virtual void refreshTheme() override;

View file

@ -11,7 +11,7 @@ namespace chatterino {
namespace widgets {
NotebookButton::NotebookButton(BaseWidget *parent)
: FancyButton(parent)
: RippleEffectButton(parent)
{
setMouseEffectColor(QColor(0, 0, 0));
}
@ -99,7 +99,7 @@ void NotebookButton::mouseReleaseEvent(QMouseEvent *event)
emit clicked();
}
FancyButton::mouseReleaseEvent(event);
RippleEffectButton::mouseReleaseEvent(event);
}
} // namespace widgets

View file

@ -7,7 +7,7 @@
namespace chatterino {
namespace widgets {
class NotebookButton : public FancyButton
class NotebookButton : public RippleEffectButton
{
Q_OBJECT

View file

@ -6,29 +6,29 @@
namespace chatterino {
namespace widgets {
FancyButton::FancyButton(BaseWidget *parent)
RippleEffectButton::RippleEffectButton(BaseWidget *parent)
: BaseWidget(parent)
{
connect(&effectTimer, &QTimer::timeout, this, &FancyButton::onMouseEffectTimeout);
connect(&effectTimer, &QTimer::timeout, this, &RippleEffectButton::onMouseEffectTimeout);
this->effectTimer.setInterval(20);
this->effectTimer.start();
}
void FancyButton::setMouseEffectColor(QColor color)
void RippleEffectButton::setMouseEffectColor(QColor color)
{
this->mouseEffectColor = color;
}
void FancyButton::paintEvent(QPaintEvent *)
void RippleEffectButton::paintEvent(QPaintEvent *)
{
QPainter painter(this);
this->fancyPaint(painter);
}
void FancyButton::fancyPaint(QPainter &painter)
void RippleEffectButton::fancyPaint(QPainter &painter)
{
QColor &c = this->mouseEffectColor;
@ -58,17 +58,17 @@ void FancyButton::fancyPaint(QPainter &painter)
}
}
void FancyButton::enterEvent(QEvent *)
void RippleEffectButton::enterEvent(QEvent *)
{
this->mouseOver = true;
}
void FancyButton::leaveEvent(QEvent *)
void RippleEffectButton::leaveEvent(QEvent *)
{
this->mouseOver = false;
}
void FancyButton::mousePressEvent(QMouseEvent *event)
void RippleEffectButton::mousePressEvent(QMouseEvent *event)
{
if (event->button() != Qt::LeftButton) {
return;
@ -79,7 +79,7 @@ void FancyButton::mousePressEvent(QMouseEvent *event)
this->mouseDown = true;
}
void FancyButton::mouseReleaseEvent(QMouseEvent *event)
void RippleEffectButton::mouseReleaseEvent(QMouseEvent *event)
{
if (event->button() != Qt::LeftButton) {
return;
@ -92,12 +92,12 @@ void FancyButton::mouseReleaseEvent(QMouseEvent *event)
}
}
void FancyButton::mouseMoveEvent(QMouseEvent *event)
void RippleEffectButton::mouseMoveEvent(QMouseEvent *event)
{
this->mousePos = event->pos();
}
void FancyButton::onMouseEffectTimeout()
void RippleEffectButton::onMouseEffectTimeout()
{
bool performUpdate = false;

View file

@ -11,7 +11,7 @@
namespace chatterino {
namespace widgets {
class FancyButton : public BaseWidget
class RippleEffectButton : public BaseWidget
{
Q_OBJECT
@ -26,7 +26,7 @@ class FancyButton : public BaseWidget
};
public:
FancyButton(BaseWidget *parent);
RippleEffectButton(BaseWidget *parent);
void setMouseEffectColor(QColor color);

View file

@ -9,7 +9,7 @@ namespace chatterino {
namespace widgets {
RippleEffectLabel::RippleEffectLabel(BaseWidget *parent, int spacing)
: FancyButton(parent)
: RippleEffectButton(parent)
{
setLayout(&this->ui.hbox);

View file

@ -15,7 +15,7 @@ class ColorScheme;
namespace widgets {
class RippleEffectLabel : public FancyButton
class RippleEffectLabel : public RippleEffectButton
{
public:
explicit RippleEffectLabel(BaseWidget *parent, int spacing = 6);

View file

@ -301,9 +301,11 @@ void SettingsDialog::addTabs()
auto form = new QFormLayout();
form->addRow("Window:", createCheckbox("Window always on top", settings.windowTopMost));
form->addRow("Messages:", createCheckbox("Mention users with a @ (except in commands)",
settings.mentionUsersWithAt));
form->addRow("", createCheckbox("Hide input box if empty", settings.hideEmptyInput));
// form->addRow("Messages:", createCheckbox("Mention users with a @ (except in
// commands)",
// settings.mentionUsersWithAt));
form->addRow("Messages:",
createCheckbox("Hide input box if empty", settings.hideEmptyInput));
form->addRow("", createCheckbox("Show last read message indicator",
settings.showLastMessageIndicator));

View file

@ -27,9 +27,7 @@ static const std::string &getSettingsPath()
void WindowManager::layoutVisibleChatWidgets(Channel *channel)
{
if (this->mainWindow != nullptr) {
this->mainWindow->layoutVisibleChatWidgets(channel);
}
this->layout();
}
void WindowManager::repaintVisibleChatWidgets(Channel *channel)

View file

@ -31,6 +31,7 @@ public:
void save();
boost::signals2::signal<void()> repaintGifs;
boost::signals2::signal<void()> layout;
private:
std::mutex windowMutex;