Pause chat while hovering. Fixes #208

Also pauses when clicking with double-click-links enabled and while
selecting text
This commit is contained in:
fourtf 2018-01-05 11:22:51 +01:00
parent 4ac03f396f
commit df81a0e5a5
5 changed files with 103 additions and 37 deletions

View file

@ -10,6 +10,11 @@ template <typename T>
class LimitedQueueSnapshot
{
public:
LimitedQueueSnapshot()
: length(0)
{
}
LimitedQueueSnapshot(std::shared_ptr<std::vector<std::shared_ptr<std::vector<T>>>> _chunks,
size_t _length, size_t _firstChunkOffset, size_t _lastChunkEnd)
: chunks(_chunks)

View file

@ -50,6 +50,7 @@ public:
FloatSetting mouseScrollMultiplier = {"/behaviour/mouseScrollMultiplier", 1.0};
StringSetting streamlinkPath = {"/behaviour/streamlink/path", ""};
StringSetting preferredQuality = {"/behaviour/streamlink/quality", "Choose"};
BoolSetting pauseChatHover = {"/behaviour/pauseChatHover", false};
/// Commands
BoolSetting allowCommandsAtEnd = {"/commands/allowCommandsAtEnd", false};

View file

@ -26,6 +26,7 @@
#define LAYOUT_WIDTH \
(this->width() - (this->scrollBar.isVisible() ? 16 : 4) * this->getDpiMultiplier())
#define PAUSE_TIME 1000
using namespace chatterino::messages;
@ -91,6 +92,8 @@ ChannelView::ChannelView(BaseWidget *parent)
this->updateTimer.start();
}
});
this->pauseTimeout.setSingleShot(true);
}
ChannelView::~ChannelView()
@ -357,7 +360,11 @@ bool ChannelView::getEnableScrollingToBottom() const
messages::LimitedQueueSnapshot<SharedMessageRef> ChannelView::getMessagesSnapshot()
{
return this->messages.getSnapshot();
if (!this->paused) {
this->snapshot = this->messages.getSnapshot();
}
return this->snapshot;
}
void ChannelView::setChannel(std::shared_ptr<Channel> newChannel)
@ -446,6 +453,13 @@ void ChannelView::detachChannel()
this->messageRemovedConnection.disconnect();
}
void ChannelView::pause(int msecTimeout)
{
this->paused = true;
this->pauseTimeout.start(msecTimeout);
}
void ChannelView::resizeEvent(QResizeEvent *)
{
this->scrollBar.resize(this->scrollBar.width(), height());
@ -882,8 +896,22 @@ void ChannelView::wheelEvent(QWheelEvent *event)
}
}
void ChannelView::enterEvent(QEvent *)
{
// this->pause(PAUSE_TIME);
}
void ChannelView::leaveEvent(QEvent *)
{
this->paused = false;
}
void ChannelView::mouseMoveEvent(QMouseEvent *event)
{
if (singletons::SettingManager::getInstance().pauseChatHover.getValue()) {
this->pause(300);
}
auto tooltipWidget = TooltipWidget::getInstance();
std::shared_ptr<messages::MessageRef> message;
QPoint relativePos;
@ -896,6 +924,16 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
return;
}
// is selecting
if (this->selecting) {
this->pause(500);
int index = message->getSelectionIndex(relativePos);
this->setSelection(this->selection.start, SelectionItem(messageIndex, index));
this->queueUpdate();
}
// message under cursor is collapsed
if (message->isCollapsed()) {
this->setCursor(Qt::PointingHandCursor);
@ -903,15 +941,6 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
return;
}
// is selecting
if (this->selecting) {
int index = message->getSelectionIndex(relativePos);
this->setSelection(this->selection.start, SelectionItem(messageIndex, index));
this->repaint();
}
// check if word underneath cursor
const messages::Word *hoverWord;
if ((hoverWord = message->tryGetWordPart(relativePos)) == nullptr) {
@ -937,6 +966,10 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event)
void ChannelView::mousePressEvent(QMouseEvent *event)
{
if (singletons::SettingManager::getInstance().linksDoubleClickOnly.getValue()) {
this->pause(200);
}
this->isMouseDown = true;
this->lastPressPosition = event->screenPos();
@ -989,6 +1022,10 @@ void ChannelView::mouseReleaseEvent(QMouseEvent *event)
return;
}
if (this->selecting) {
this->paused = false;
}
this->isMouseDown = false;
this->selecting = false;

View file

@ -39,6 +39,7 @@ public:
void clearSelection();
void setEnableScrollingToBottom(bool);
bool getEnableScrollingToBottom() const;
void pause(int msecTimeout);
void setChannel(std::shared_ptr<Channel> channel);
messages::LimitedQueueSnapshot<messages::SharedMessageRef> getMessagesSnapshot();
@ -56,6 +57,9 @@ protected:
virtual void paintEvent(QPaintEvent *) override;
virtual void wheelEvent(QWheelEvent *event) override;
virtual void enterEvent(QEvent *) override;
virtual void leaveEvent(QEvent *) override;
virtual void mouseMoveEvent(QMouseEvent *event) override;
virtual void mousePressEvent(QMouseEvent *event) override;
virtual void mouseReleaseEvent(QMouseEvent *event) override;
@ -72,6 +76,10 @@ private:
QTimer updateTimer;
bool updateQueued = false;
bool messageWasAdded = false;
bool paused = false;
QTimer pauseTimeout;
messages::LimitedQueueSnapshot<messages::SharedMessageRef> snapshot;
void detachChannel();
void actuallyLayoutMessages();

View file

@ -327,35 +327,50 @@ QVBoxLayout *SettingsDialog::createBehaviourTab()
auto form = new QFormLayout();
form->addRow("Window:",
createCheckbox("Window always on top (requires restart)", settings.windowTopMost));
// 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));
// WINDOW
{
form->addRow("Window:", createCheckbox("Window always on top (requires restart)",
settings.windowTopMost));
// form->addRow("Messages:", createCheckbox("Mention users with a @ (except in
// commands)",
// settings.mentionUsersWithAt));
}
// MESSAGES
{
form->addRow("Messages:",
createCheckbox("Hide input box if empty", settings.hideEmptyInput));
form->addRow("", createCheckbox("Show last read message indicator",
settings.showLastMessageIndicator));
}
// PAUSE
{
form->addRow("Pause chat:", createCheckbox("When hovering", settings.pauseChatHover));
}
// MOUSE SCROLL SPEED
{
auto scroll = new QSlider(Qt::Horizontal);
form->addRow("Mouse scroll speed:", scroll);
auto scroll = new QSlider(Qt::Horizontal);
form->addRow("Mouse scroll speed:", scroll);
float currentValue = singletons::SettingManager::getInstance().mouseScrollMultiplier;
int scrollValue = ((currentValue - 0.1f) / 2.f) * 99.f;
scroll->setValue(scrollValue);
float currentValue = singletons::SettingManager::getInstance().mouseScrollMultiplier;
int scrollValue = ((currentValue - 0.1f) / 2.f) * 99.f;
scroll->setValue(scrollValue);
connect(scroll, &QSlider::valueChanged, [](int newValue) {
float mul = static_cast<float>(newValue) / 99.f;
float newScrollValue = (mul * 2.1f) + 0.1f;
singletons::SettingManager::getInstance().mouseScrollMultiplier = newScrollValue;
});
form->addRow("Streamlink path:", createLineEdit(settings.streamlinkPath));
form->addRow(this->createCombobox(
"Preferred quality:", settings.preferredQuality,
{"Choose", "Source", "High", "Medium", "Low", "Audio only"},
[](const QString &newValue, pajlada::Settings::Setting<std::string> &setting) {
setting = newValue.toStdString();
}));
connect(scroll, &QSlider::valueChanged, [](int newValue) {
float mul = static_cast<float>(newValue) / 99.f;
float newScrollValue = (mul * 2.1f) + 0.1f;
singletons::SettingManager::getInstance().mouseScrollMultiplier = newScrollValue;
});
}
// STREAMLINK
{
form->addRow("Streamlink path:", createLineEdit(settings.streamlinkPath));
form->addRow(this->createCombobox(
"Preferred quality:", settings.preferredQuality,
{"Choose", "Source", "High", "Medium", "Low", "Audio only"},
[](const QString &newValue, pajlada::Settings::Setting<std::string> &setting) {
setting = newValue.toStdString();
}));
}
layout->addLayout(form);