Skip to content

Commit ea6b19b

Browse files
committed
Add an ugly custom emote completer using ~
1 parent 3e8734d commit ea6b19b

File tree

5 files changed

+66
-24
lines changed

5 files changed

+66
-24
lines changed

resources/qml/Completer.qml

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,7 @@ Popup {
6969

7070
onCompleterNameChanged: {
7171
if (completerName) {
72-
if (completerName == "user")
73-
completer = TimelineManager.completerFor(completerName, room.roomId);
74-
else
75-
completer = TimelineManager.completerFor(completerName);
72+
completer = TimelineManager.completerFor(completerName, room.roomId);
7673
completer.setSearchString("");
7774
} else {
7875
completer = undefined;
@@ -182,6 +179,39 @@ Popup {
182179

183180
}
184181

182+
DelegateChoice {
183+
roleValue: "customEmoji"
184+
185+
RowLayout {
186+
id: del
187+
188+
anchors.centerIn: parent
189+
spacing: rowSpacing
190+
191+
Avatar {
192+
height: popup.avatarHeight
193+
width: popup.avatarWidth
194+
displayName: model.shortcode
195+
//userid: model.shortcode
196+
url: model.url.replace("mxc://", "image://MxcImage/")
197+
onClicked: popup.completionClicked(completer.completionAt(model.index))
198+
crop: false
199+
}
200+
201+
Label {
202+
text: model.shortcode
203+
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.text
204+
}
205+
206+
Label {
207+
text: "(" + model.packname + ")"
208+
color: model.index == popup.currentIndex ? Nheko.colors.highlightedText : Nheko.colors.buttonText
209+
}
210+
211+
}
212+
213+
}
214+
185215
DelegateChoice {
186216
roleValue: "room"
187217

resources/qml/MessageInput.qml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ Rectangle {
101101
}
102102

103103
function openCompleter(pos, type) {
104+
if (popup.opened) return;
104105
completerTriggeredAt = pos;
105106
popup.completerName = type;
106107
popup.open();
@@ -166,13 +167,12 @@ Rectangle {
166167
messageInput.text = room.input.nextText();
167168
} else if (event.key == Qt.Key_At) {
168169
messageInput.openCompleter(selectionStart, "user");
169-
popup.open();
170170
} else if (event.key == Qt.Key_Colon) {
171171
messageInput.openCompleter(selectionStart, "emoji");
172-
popup.open();
173172
} else if (event.key == Qt.Key_NumberSign) {
174173
messageInput.openCompleter(selectionStart, "roomAliases");
175-
popup.open();
174+
} else if (event.text == "~") {
175+
messageInput.openCompleter(selectionStart, "customEmoji");
176176
} else if (event.key == Qt.Key_Escape && popup.opened) {
177177
popup.completerName = "";
178178
popup.close();
@@ -214,6 +214,9 @@ Rectangle {
214214
} else if (t == ':') {
215215
messageInput.openCompleter(pos, "emoji");
216216
return ;
217+
} else if (t == '~') {
218+
messageInput.openCompleter(pos, "customEmoji");
219+
return ;
217220
}
218221
pos = pos - 1;
219222
}

src/Cache.cpp

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3580,24 +3580,26 @@ Cache::getImagePacks(const std::string &room_id, std::optional<bool> stickers)
35803580
auto addPack = [&infos, stickers](const mtx::events::msc2545::ImagePack &pack,
35813581
const std::string &source_room,
35823582
const std::string &state_key) {
3583-
if (!pack.pack || !stickers.has_value() ||
3584-
(stickers.value() ? pack.pack->is_sticker() : pack.pack->is_emoji())) {
3585-
ImagePackInfo info;
3586-
info.source_room = source_room;
3587-
info.state_key = state_key;
3588-
info.pack.pack = pack.pack;
3589-
3590-
for (const auto &img : pack.images) {
3591-
if (stickers.has_value() && img.second.overrides_usage() &&
3592-
(stickers ? !img.second.is_sticker() : !img.second.is_emoji()))
3593-
continue;
3594-
3595-
info.pack.images.insert(img);
3596-
}
3583+
bool pack_matches = !stickers.has_value() ||
3584+
(stickers.value() ? pack.pack->is_sticker() : pack.pack->is_emoji());
3585+
3586+
ImagePackInfo info;
3587+
info.source_room = source_room;
3588+
info.state_key = state_key;
3589+
info.pack.pack = pack.pack;
3590+
3591+
for (const auto &img : pack.images) {
3592+
if (stickers.has_value() &&
3593+
(img.second.overrides_usage()
3594+
? (!stickers.value() ? img.second.is_sticker() : img.second.is_emoji())
3595+
: !pack_matches))
3596+
continue;
35973597

3598-
if (!info.pack.images.empty())
3599-
infos.push_back(std::move(info));
3598+
info.pack.images.insert(img);
36003599
}
3600+
3601+
if (!info.pack.images.empty())
3602+
infos.push_back(std::move(info));
36013603
};
36023604

36033605
// packs from account data

src/CombinedImagePackModel.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ CombinedImagePackModel::data(const QModelIndex &index, int role) const
5656
if (hasIndex(index.row(), index.column(), index.parent())) {
5757
switch (role) {
5858
case CompletionModel::CompletionRole:
59-
return QString::fromStdString(images[index.row()].image.url);
59+
return QString("<img data-mx-emoticon height=32 src=\"%1\" alt=\"%2\" title=\"%2\">")
60+
.arg(QString::fromStdString(images[index.row()].image.url).toHtmlEscaped(),
61+
images[index.row()].shortcode);
6062
case Roles::Url:
6163
return QString::fromStdString(images[index.row()].image.url);
6264
case CompletionModel::SearchRole:

src/timeline/TimelineViewManager.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,11 @@ TimelineViewManager::completerFor(QString completerName, QString roomId)
550550
auto proxy = new CompletionProxyModel(stickerModel, 1, static_cast<size_t>(-1) / 4);
551551
stickerModel->setParent(proxy);
552552
return proxy;
553+
} else if (completerName == "customEmoji") {
554+
auto stickerModel = new CombinedImagePackModel(roomId.toStdString(), false);
555+
auto proxy = new CompletionProxyModel(stickerModel);
556+
stickerModel->setParent(proxy);
557+
return proxy;
553558
}
554559
return nullptr;
555560
}

0 commit comments

Comments
 (0)