implemented pausing on hover

This commit is contained in:
fourtf
2018-11-03 21:26:57 +01:00
parent 22cf4368bd
commit 5453c65f0f
10 changed files with 395 additions and 304 deletions
+37 -14
View File
@@ -13,6 +13,7 @@
#include <QWidget>
#include <pajlada/signals/signal.hpp>
#include <unordered_map>
#include <unordered_set>
namespace chatterino {
@@ -21,6 +22,12 @@ enum class HighlightState;
class Channel;
using ChannelPtr = std::shared_ptr<Channel>;
struct Message;
using MessagePtr = std::shared_ptr<const Message>;
enum class MessageFlag : uint16_t;
using MessageFlags = FlagsEnum<MessageFlag>;
class MessageLayout;
using MessageLayoutPtr = std::shared_ptr<MessageLayout>;
@@ -32,6 +39,14 @@ class EffectLabel;
struct Link;
class MessageLayoutElement;
enum class PauseReason {
Mouse,
Selection,
DoubleClick,
};
using SteadyClock = std::chrono::steady_clock;
class ChannelView final : public BaseWidget
{
Q_OBJECT
@@ -48,12 +63,15 @@ public:
bool getEnableScrollingToBottom() const;
void setOverrideFlags(boost::optional<MessageElementFlags> value);
const boost::optional<MessageElementFlags> &getOverrideFlags() const;
void pause(int msecTimeout);
void updateLastReadMessage();
bool paused() const;
void pause(PauseReason reason, boost::optional<uint> msecs = boost::none);
void unpause(PauseReason reason);
void setChannel(ChannelPtr channel_);
LimitedQueueSnapshot<MessageLayoutPtr> getMessagesSnapshot();
void layoutMessages();
void queueLayout();
void clearMessages();
void showUserInfoPopup(const QString &userName);
@@ -94,18 +112,23 @@ private:
void initializeScrollbar();
void initializeSignals();
// void messageAppended(MessagePtr &message);
// void messageAddedAtStart(std::vector<MessagePtr> &messages);
// void messageRemoveFromStart(MessagePtr &message);
void messageAppended(MessagePtr &message,
boost::optional<MessageFlags> overridingFlags);
void messageAddedAtStart(std::vector<MessagePtr> &messages);
void messageRemoveFromStart(MessagePtr &message);
void messageReplaced(size_t index, MessagePtr &replacement);
void updatePauseStatus();
void detachChannel();
void actuallyLayoutMessages(bool causedByScollbar = false);
void performLayout(bool causedByScollbar = false);
void layoutVisibleMessages(
LimitedQueueSnapshot<MessageLayoutPtr> &messages);
void updateScrollbar(LimitedQueueSnapshot<MessageLayoutPtr> &messages,
bool causedByScrollbar);
void drawMessages(QPainter &painter);
void setSelection(const SelectionItem &start, const SelectionItem &end);
MessageElementFlags getFlags() const;
bool isPaused();
void selectWholeMessage(MessageLayout *layout, int &messageIndex);
void getWordBounds(MessageLayout *layout,
const MessageLayoutElement *element,
@@ -117,6 +140,7 @@ private:
void addContextMenuItems(const MessageLayoutElement *hoveredElement,
MessageLayout *layout);
int getLayoutWidth() const;
void updatePauseTimer();
QTimer *layoutCooldown_;
bool layoutQueued_;
@@ -126,12 +150,11 @@ private:
bool messageWasAdded_ = false;
bool lastMessageHasAlternateBackground_ = false;
bool pausedTemporarily_ = false;
bool pausedBySelection_ = false;
bool pausedByScrollingUp_ = false;
int messagesAddedSinceSelectionPause_ = 0;
QTimer pauseTimer_;
std::unordered_map<PauseReason, boost::optional<SteadyClock::time_point>>
pauses_;
boost::optional<SteadyClock::time_point> pauseEnd;
QTimer pauseTimeout_;
boost::optional<MessageElementFlags> overrideFlags_;
MessageLayoutPtr lastReadMessage_;
@@ -179,7 +202,7 @@ private:
private slots:
void wordFlagsChanged()
{
layoutMessages();
queueLayout();
update();
}
};