Improve layout of Emoji Picker
Respect system styling Increase size of emojis (to remove empty space) Add hover effect (partially adresses #41) Less hardcoding of sizes Use emoji font (color)
This commit is contained in:
parent
49ec388c1d
commit
78ed78c410
@ -232,6 +232,10 @@ emoji--Panel > * {
|
|||||||
color: #caccd1;
|
color: #caccd1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emoji--Category {
|
||||||
|
qproperty-hoverBackgroundColor: rgba(230, 230, 230, 30);
|
||||||
|
}
|
||||||
|
|
||||||
emoji--Category,
|
emoji--Category,
|
||||||
emoji--Category > * {
|
emoji--Category > * {
|
||||||
background-color: #2d3139;
|
background-color: #2d3139;
|
||||||
|
@ -200,6 +200,10 @@ emoji--Panel > * {
|
|||||||
color: #333;
|
color: #333;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emoji--Category {
|
||||||
|
qproperty-hoverBackgroundColor: rgba(200, 200, 200, 70);
|
||||||
|
}
|
||||||
|
|
||||||
emoji--Category,
|
emoji--Category,
|
||||||
emoji--Category > * {
|
emoji--Category > * {
|
||||||
background-color: white;
|
background-color: white;
|
||||||
|
@ -85,10 +85,10 @@ QListWidget {
|
|||||||
background-color: palette(window);
|
background-color: palette(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
RoomInfoListItem {
|
RoomInfoListItem, UserMentionsWidget {
|
||||||
qproperty-mentionedColor: palette(alternate-base);
|
qproperty-mentionedColor: palette(alternate-base);
|
||||||
qproperty-highlightedBackgroundColor: palette(highlight);
|
qproperty-highlightedBackgroundColor: palette(highlight);
|
||||||
qproperty-hoverBackgroundColor: palette(base);
|
qproperty-hoverBackgroundColor: palette(light);
|
||||||
qproperty-backgroundColor: palette(window);
|
qproperty-backgroundColor: palette(window);
|
||||||
|
|
||||||
qproperty-titleColor: palette(text);
|
qproperty-titleColor: palette(text);
|
||||||
@ -116,7 +116,7 @@ RoomInfoListItem {
|
|||||||
|
|
||||||
CommunitiesListItem {
|
CommunitiesListItem {
|
||||||
qproperty-highlightedBackgroundColor: palette(highlight);
|
qproperty-highlightedBackgroundColor: palette(highlight);
|
||||||
qproperty-hoverBackgroundColor: palette(base);
|
qproperty-hoverBackgroundColor: palette(light);
|
||||||
qproperty-backgroundColor: palette(window);
|
qproperty-backgroundColor: palette(window);
|
||||||
|
|
||||||
qproperty-avatarBgColor: palette(base);
|
qproperty-avatarBgColor: palette(base);
|
||||||
@ -131,6 +131,22 @@ LoadingIndicator {
|
|||||||
qproperty-color: palette(light);
|
qproperty-color: palette(light);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
emoji--Panel,
|
||||||
|
emoji--Panel > * {
|
||||||
|
background-color: palette(base);
|
||||||
|
color: palette(text);
|
||||||
|
}
|
||||||
|
|
||||||
|
emoji--Category {
|
||||||
|
qproperty-hoverBackgroundColor: palette(highlight);
|
||||||
|
}
|
||||||
|
|
||||||
|
emoji--Category,
|
||||||
|
emoji--Category > * {
|
||||||
|
background-color: palette(window);
|
||||||
|
color: palette(text);
|
||||||
|
}
|
||||||
|
|
||||||
FloatingButton {
|
FloatingButton {
|
||||||
qproperty-backgroundColor: palette(base);
|
qproperty-backgroundColor: palette(base);
|
||||||
qproperty-foregroundColor: palette(text);
|
qproperty-foregroundColor: palette(text);
|
||||||
|
@ -43,15 +43,18 @@ Category::Category(QString category, std::vector<Emoji> emoji, QWidget *parent)
|
|||||||
emojiListView_->setViewMode(QListView::IconMode);
|
emojiListView_->setViewMode(QListView::IconMode);
|
||||||
emojiListView_->setFlow(QListView::LeftToRight);
|
emojiListView_->setFlow(QListView::LeftToRight);
|
||||||
emojiListView_->setResizeMode(QListView::Adjust);
|
emojiListView_->setResizeMode(QListView::Adjust);
|
||||||
|
emojiListView_->setMouseTracking(true);
|
||||||
emojiListView_->verticalScrollBar()->setEnabled(false);
|
emojiListView_->verticalScrollBar()->setEnabled(false);
|
||||||
emojiListView_->horizontalScrollBar()->setEnabled(false);
|
emojiListView_->horizontalScrollBar()->setEnabled(false);
|
||||||
|
|
||||||
const int cols = 7;
|
const int cols = 7;
|
||||||
const int rows = emoji.size() / 7;
|
const int rows = emoji.size() / 7 + 1;
|
||||||
|
|
||||||
|
const int emojiSize = 48;
|
||||||
|
const int gridSize = emojiSize + 4;
|
||||||
// TODO: Be precise here. Take the parent into consideration.
|
// TODO: Be precise here. Take the parent into consideration.
|
||||||
emojiListView_->setFixedSize(cols * 50 + 20, rows * 50 + 20);
|
emojiListView_->setFixedSize(cols * gridSize + 20, rows * gridSize);
|
||||||
emojiListView_->setGridSize(QSize(50, 50));
|
emojiListView_->setGridSize(QSize(gridSize, gridSize));
|
||||||
emojiListView_->setDragEnabled(false);
|
emojiListView_->setDragEnabled(false);
|
||||||
emojiListView_->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
emojiListView_->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||||
|
|
||||||
@ -59,7 +62,7 @@ Category::Category(QString category, std::vector<Emoji> emoji, QWidget *parent)
|
|||||||
data_->unicode = e.unicode;
|
data_->unicode = e.unicode;
|
||||||
|
|
||||||
auto item = new QStandardItem;
|
auto item = new QStandardItem;
|
||||||
item->setSizeHint(QSize(24, 24));
|
item->setSizeHint(QSize(emojiSize, emojiSize));
|
||||||
|
|
||||||
QVariant unicode(data_->unicode);
|
QVariant unicode(data_->unicode);
|
||||||
item->setData(unicode.toString(), Qt::UserRole);
|
item->setData(unicode.toString(), Qt::UserRole);
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <QColor>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QLayout>
|
#include <QLayout>
|
||||||
#include <QListView>
|
#include <QListView>
|
||||||
@ -29,9 +30,13 @@ namespace emoji {
|
|||||||
class Category : public QWidget
|
class Category : public QWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
Q_PROPERTY(
|
||||||
|
QColor hoverBackgroundColor READ hoverBackgroundColor WRITE setHoverBackgroundColor)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Category(QString category, std::vector<Emoji> emoji, QWidget *parent = nullptr);
|
Category(QString category, std::vector<Emoji> emoji, QWidget *parent = nullptr);
|
||||||
|
QColor hoverBackgroundColor() const { return hoverBackgroundColor_; }
|
||||||
|
void setHoverBackgroundColor(QColor color) { hoverBackgroundColor_ = color; }
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void emojiSelected(const QString &emoji);
|
void emojiSelected(const QString &emoji);
|
||||||
@ -55,5 +60,7 @@ private:
|
|||||||
emoji::ItemDelegate *delegate_;
|
emoji::ItemDelegate *delegate_;
|
||||||
|
|
||||||
QLabel *category_;
|
QLabel *category_;
|
||||||
|
|
||||||
|
QColor hoverBackgroundColor_;
|
||||||
};
|
};
|
||||||
} // namespace emoji
|
} // namespace emoji
|
||||||
|
@ -37,12 +37,22 @@ ItemDelegate::paint(QPainter *painter,
|
|||||||
{
|
{
|
||||||
Q_UNUSED(index);
|
Q_UNUSED(index);
|
||||||
|
|
||||||
|
painter->save();
|
||||||
|
|
||||||
QStyleOptionViewItem viewOption(option);
|
QStyleOptionViewItem viewOption(option);
|
||||||
|
|
||||||
auto emoji = index.data(Qt::UserRole).toString();
|
auto emoji = index.data(Qt::UserRole).toString();
|
||||||
|
|
||||||
// QFont font("Emoji One");
|
|
||||||
QFont font;
|
QFont font;
|
||||||
|
font.setFamily("emoji");
|
||||||
|
font.setPixelSize(48);
|
||||||
painter->setFont(font);
|
painter->setFont(font);
|
||||||
painter->drawText(viewOption.rect, Qt::AlignCenter, emoji);
|
if (option.state & QStyle::State_MouseOver) {
|
||||||
|
painter->setBackgroundMode(Qt::OpaqueMode);
|
||||||
|
QColor hoverColor = parent()->property("hoverBackgroundColor").value<QColor>();
|
||||||
|
painter->setBackground(hoverColor);
|
||||||
|
}
|
||||||
|
painter->drawText(viewOption.rect, Qt::AlignCenter, emoji);
|
||||||
|
|
||||||
|
painter->restore();
|
||||||
}
|
}
|
||||||
|
@ -202,14 +202,12 @@ Panel::showCategory(const Category *category)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
// HACK
|
// HACK
|
||||||
// If we want to go to a previous category and position the label at the top
|
// We want the top of the category to be visible, so scroll to the top first and then to the
|
||||||
// the 6*50 offset won't work because not all the categories have the same
|
// category
|
||||||
// height. To ensure the category is at the top, we move to the top and go as
|
|
||||||
// normal to the next category.
|
|
||||||
if (current > posToGo)
|
if (current > posToGo)
|
||||||
this->scrollArea_->ensureVisible(0, 0, 0, 0);
|
this->scrollArea_->ensureVisible(0, 0, 0, 0);
|
||||||
|
|
||||||
posToGo += 6 * 50;
|
posToGo += scrollArea_->height();
|
||||||
this->scrollArea_->ensureVisible(0, posToGo, 0, 0);
|
this->scrollArea_->ensureVisible(0, posToGo, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user