implemented pausing on hover
This commit is contained in:
@@ -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();
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user