mirror of https://github.com/procxx/kepka.git
improved mentions dropdown, version 0.8.28.dev
This commit is contained in:
parent
391b370b0f
commit
11384743bc
|
@ -1,9 +1,9 @@
|
||||||
@echo OFF
|
@echo OFF
|
||||||
|
|
||||||
set "AppVersion=8027"
|
set "AppVersion=8028"
|
||||||
set "AppVersionStrSmall=0.8.27"
|
set "AppVersionStrSmall=0.8.28"
|
||||||
set "AppVersionStr=0.8.27"
|
set "AppVersionStr=0.8.28"
|
||||||
set "AppVersionStrFull=0.8.27.0"
|
set "AppVersionStrFull=0.8.28.0"
|
||||||
set "DevChannel=1"
|
set "DevChannel=1"
|
||||||
|
|
||||||
if %DevChannel% neq 0 goto preparedev
|
if %DevChannel% neq 0 goto preparedev
|
||||||
|
|
|
@ -1053,7 +1053,7 @@ textRectMargins: margins(-2px, -1px, -2px, -1px);
|
||||||
taMsgField: flatTextarea(taDefFlat) {
|
taMsgField: flatTextarea(taDefFlat) {
|
||||||
font: msgFont;
|
font: msgFont;
|
||||||
}
|
}
|
||||||
maxFieldHeight: 265px;
|
maxFieldHeight: 223px;
|
||||||
|
|
||||||
newMsgSound: ':/gui/art/newmsg.wav';
|
newMsgSound: ':/gui/art/newmsg.wav';
|
||||||
|
|
||||||
|
@ -1664,8 +1664,9 @@ stickerPanPadding: 11px;
|
||||||
stickerPanDelete: sprite(123px, 132px, 12px, 12px);
|
stickerPanDelete: sprite(123px, 132px, 12px, 12px);
|
||||||
stickerPanDeleteOpacity: 0.5;
|
stickerPanDeleteOpacity: 0.5;
|
||||||
stickerIconPadding: 3px;
|
stickerIconPadding: 3px;
|
||||||
stickerIconHover: #e8ecef;
|
stickerIconOpacity: 0.7;
|
||||||
stickerIconSel: #dfe3e6;
|
stickerIconSel: 2px;
|
||||||
|
stickerIconSelColor: #58b2ed;
|
||||||
stickerIconRecent: sprite(342px, 50px, 21px, 22px);
|
stickerIconRecent: sprite(342px, 50px, 21px, 22px);
|
||||||
stickerIconLeft: sprite(342px, 72px, 40px, 1px);
|
stickerIconLeft: sprite(342px, 72px, 40px, 1px);
|
||||||
stickerIconRight: sprite(342px, 73px, 40px, 1px);
|
stickerIconRight: sprite(342px, 73px, 40px, 1px);
|
||||||
|
@ -1680,9 +1681,9 @@ botKbFont: font(16px);
|
||||||
botKbButton: botKeyboardButton {
|
botKbButton: botKeyboardButton {
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
height: 46px;
|
height: 36px;
|
||||||
textTop: 13px;
|
textTop: 8px;
|
||||||
downTextTop: 14px;
|
downTextTop: 9px;
|
||||||
}
|
}
|
||||||
botKbTinyButton: botKeyboardButton {
|
botKbTinyButton: botKeyboardButton {
|
||||||
margin: 4px;
|
margin: 4px;
|
||||||
|
|
|
@ -540,6 +540,8 @@ namespace App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!chat->participants.isEmpty()) {
|
if (!chat->participants.isEmpty()) {
|
||||||
|
History *h = App::historyLoaded(chat->id);
|
||||||
|
bool found = !h || !h->lastKeyboardFrom;
|
||||||
int32 botStatus = -1;
|
int32 botStatus = -1;
|
||||||
for (ChatData::Participants::iterator i = chat->participants.begin(), e = chat->participants.end(); i != e;) {
|
for (ChatData::Participants::iterator i = chat->participants.begin(), e = chat->participants.end(); i != e;) {
|
||||||
if (i.value() < pversion) {
|
if (i.value() < pversion) {
|
||||||
|
@ -549,10 +551,18 @@ namespace App {
|
||||||
botStatus = (botStatus > 0/* || i.key()->botInfo->readsAllHistory*/) ? 2 : 1;
|
botStatus = (botStatus > 0/* || i.key()->botInfo->readsAllHistory*/) ? 2 : 1;
|
||||||
if (requestBotInfos && !i.key()->botInfo->inited) App::api()->requestFullPeer(i.key());
|
if (requestBotInfos && !i.key()->botInfo->inited) App::api()->requestFullPeer(i.key());
|
||||||
}
|
}
|
||||||
|
if (!found && i.key()->id == h->lastKeyboardFrom) {
|
||||||
|
found = true;
|
||||||
|
}
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chat->botStatus = botStatus;
|
chat->botStatus = botStatus;
|
||||||
|
if (!found) {
|
||||||
|
h->lastKeyboardId = 0;
|
||||||
|
h->lastKeyboardFrom = 0;
|
||||||
|
if (App::main()) App::main()->updateBotKeyboard();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (App::main()) App::main()->peerUpdated(chat);
|
if (App::main()) App::main()->peerUpdated(chat);
|
||||||
}
|
}
|
||||||
|
@ -604,6 +614,13 @@ namespace App {
|
||||||
if (i != chat->participants.end()) {
|
if (i != chat->participants.end()) {
|
||||||
chat->participants.erase(i);
|
chat->participants.erase(i);
|
||||||
chat->count--;
|
chat->count--;
|
||||||
|
|
||||||
|
History *h = App::historyLoaded(chat->id);
|
||||||
|
if (h && h->lastKeyboardFrom == user->id) {
|
||||||
|
h->lastKeyboardId = 0;
|
||||||
|
h->lastKeyboardFrom = 0;
|
||||||
|
if (App::main()) App::main()->updateBotKeyboard();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (chat->botStatus > 0 && user->botInfo) {
|
if (chat->botStatus > 0 && user->botInfo) {
|
||||||
int32 botStatus = -1;
|
int32 botStatus = -1;
|
||||||
|
|
|
@ -17,8 +17,8 @@ Copyright (c) 2014 John Preston, https://desktop.telegram.org
|
||||||
*/
|
*/
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
static const int32 AppVersion = 8027;
|
static const int32 AppVersion = 8028;
|
||||||
static const wchar_t *AppVersionStr = L"0.8.27";
|
static const wchar_t *AppVersionStr = L"0.8.28";
|
||||||
static const bool DevChannel = true;
|
static const bool DevChannel = true;
|
||||||
|
|
||||||
static const wchar_t *AppNameOld = L"Telegram Win (Unofficial)";
|
static const wchar_t *AppNameOld = L"Telegram Win (Unofficial)";
|
||||||
|
|
|
@ -1670,7 +1670,7 @@ _travel(this , qsl("emoji_group"), dbietTravel , QString(), false, st::r
|
||||||
_objects(this , qsl("emoji_group"), dbietObjects , QString(), false, st::rbEmojiObjects),
|
_objects(this , qsl("emoji_group"), dbietObjects , QString(), false, st::rbEmojiObjects),
|
||||||
_iconOver(-1), _iconSel(0), _iconDown(-1), _iconsDragging(false),
|
_iconOver(-1), _iconSel(0), _iconDown(-1), _iconsDragging(false),
|
||||||
_iconAnim(animFunc(this, &EmojiPan::iconAnim)),
|
_iconAnim(animFunc(this, &EmojiPan::iconAnim)),
|
||||||
_iconsLeft(0), _iconsTop(0), _iconsStartX(0), _iconsMax(0), _iconsX(0, 0), _iconsStartAnim(0),
|
_iconsLeft(0), _iconsTop(0), _iconsStartX(0), _iconsMax(0), _iconsX(0, 0), _iconSelX(0, 0), _iconsStartAnim(0),
|
||||||
_stickersShown(false), _moveStart(0),
|
_stickersShown(false), _moveStart(0),
|
||||||
e_scroll(this, st::emojiScroll), e_inner(), s_scroll(this, st::emojiScroll), s_inner(), _removingSetId(0) {
|
e_scroll(this, st::emojiScroll), e_inner(), s_scroll(this, st::emojiScroll), s_inner(), _removingSetId(0) {
|
||||||
setFocusPolicy(Qt::NoFocus);
|
setFocusPolicy(Qt::NoFocus);
|
||||||
|
@ -1765,16 +1765,21 @@ void EmojiPan::paintEvent(QPaintEvent *e) {
|
||||||
if (_stickersShown) {
|
if (_stickersShown) {
|
||||||
p.fillRect(r.left(), _iconsTop, r.width(), st::rbEmoji.height, st::emojiPanCategories->b);
|
p.fillRect(r.left(), _iconsTop, r.width(), st::rbEmoji.height, st::emojiPanCategories->b);
|
||||||
if (!_icons.isEmpty()) {
|
if (!_icons.isEmpty()) {
|
||||||
int32 x = _iconsLeft, i = 0;
|
int32 x = _iconsLeft, i = 0, selxrel = _iconSelX.current(), selx = x + selxrel - _iconsX.current();
|
||||||
if (!_icons.at(i).sticker) {
|
if (!_icons.at(i).sticker) {
|
||||||
if (_iconSel == i) {
|
if (selxrel > 0) {
|
||||||
p.fillRect(rtl() ? (width() - x - st::rbEmoji.width) : x, _iconsTop, st::rbEmoji.width, st::rbEmoji.height, st::stickerIconSel->b);
|
if (_iconHovers.at(i) < 1) {
|
||||||
} else if (_iconHovers.at(i) > 0) {
|
p.drawSpriteLeft(x + st::rbEmojiRecent.imagePos.x(), _iconsTop + st::rbEmojiRecent.imagePos.y(), width(), st::rbEmojiRecent.imageRect);
|
||||||
p.setOpacity(_iconHovers.at(i));
|
}
|
||||||
p.fillRect(rtl() ? (width() - x - st::rbEmoji.width) : x, _iconsTop, st::rbEmoji.width, st::rbEmoji.height, st::stickerIconHover->b);
|
if (_iconHovers.at(i) > 0) {
|
||||||
|
p.drawSpriteLeft(x + st::rbEmojiRecent.imagePos.x(), _iconsTop + st::rbEmojiRecent.imagePos.y(), width(), st::rbEmojiRecent.overImageRect);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (selxrel < st::rbEmoji.width) {
|
||||||
|
p.setOpacity(1 - (selxrel / st::rbEmoji.width));
|
||||||
|
p.drawSpriteLeft(x + st::rbEmojiRecent.imagePos.x(), _iconsTop + st::rbEmojiRecent.imagePos.y(), width(), st::rbEmojiRecent.chkImageRect);
|
||||||
p.setOpacity(1);
|
p.setOpacity(1);
|
||||||
}
|
}
|
||||||
p.drawSpriteLeft(x + st::rbEmojiRecent.imagePos.x(), _iconsTop + st::rbEmojiRecent.imagePos.y(), width(), st::stickerIconRecent);
|
|
||||||
x += st::rbEmoji.width;
|
x += st::rbEmoji.width;
|
||||||
++i;
|
++i;
|
||||||
}
|
}
|
||||||
|
@ -1790,15 +1795,19 @@ void EmojiPan::paintEvent(QPaintEvent *e) {
|
||||||
s.sticker->thumb->load();
|
s.sticker->thumb->load();
|
||||||
QPixmap pix(s.sticker->thumb->pix(s.pixw, s.pixh));
|
QPixmap pix(s.sticker->thumb->pix(s.pixw, s.pixh));
|
||||||
if (_iconSel == i) {
|
if (_iconSel == i) {
|
||||||
p.fillRect(rtl() ? (width() - x - st::rbEmoji.width) : x, _iconsTop, st::rbEmoji.width, st::rbEmoji.height, st::stickerIconSel->b);
|
|
||||||
} else if (_iconHovers.at(i) > 0) {
|
|
||||||
p.setOpacity(_iconHovers.at(i));
|
|
||||||
p.fillRect(rtl() ? (width() - x - st::rbEmoji.width) : x, _iconsTop, st::rbEmoji.width, st::rbEmoji.height, st::stickerIconHover->b);
|
|
||||||
p.setOpacity(1);
|
p.setOpacity(1);
|
||||||
|
} else {
|
||||||
|
p.setOpacity(1. * _iconHovers.at(i) + st::stickerIconOpacity * (1 - _iconHovers.at(i)));
|
||||||
}
|
}
|
||||||
p.drawPixmapLeft(x + (st::rbEmoji.width - s.pixw) / 2, _iconsTop + (st::rbEmoji.height - s.pixh) / 2, width(), pix);
|
p.drawPixmapLeft(x + (st::rbEmoji.width - s.pixw) / 2, _iconsTop + (st::rbEmoji.height - s.pixh) / 2, width(), pix);
|
||||||
x += st::rbEmoji.width;
|
x += st::rbEmoji.width;
|
||||||
|
p.setOpacity(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rtl()) selx = width() - selx - st::rbEmoji.width;
|
||||||
|
p.setOpacity(_icons.at(0).sticker ? 1. : qMax(1., selx / st::rbEmoji.width));
|
||||||
|
p.fillRect(selx, _iconsTop + st::rbEmoji.height - st::stickerIconPadding, st::rbEmoji.width, st::stickerIconSel, st::stickerIconSelColor->b);
|
||||||
|
|
||||||
float64 o_left = snap(float64(_iconsX.current()) / st::stickerIconLeft.pxWidth(), 0., 1.);
|
float64 o_left = snap(float64(_iconsX.current()) / st::stickerIconLeft.pxWidth(), 0., 1.);
|
||||||
if (o_left > 0) {
|
if (o_left > 0) {
|
||||||
p.setOpacity(o_left);
|
p.setOpacity(o_left);
|
||||||
|
@ -1983,6 +1992,7 @@ void EmojiPan::onRefreshIcons() {
|
||||||
_iconAnimations.clear();
|
_iconAnimations.clear();
|
||||||
s_inner.fillIcons(_icons);
|
s_inner.fillIcons(_icons);
|
||||||
_iconsX = anim::ivalue(0, 0);
|
_iconsX = anim::ivalue(0, 0);
|
||||||
|
_iconSelX.finish();
|
||||||
_iconsStartAnim = 0;
|
_iconsStartAnim = 0;
|
||||||
_iconAnim.stop();
|
_iconAnim.stop();
|
||||||
if (_icons.isEmpty()) {
|
if (_icons.isEmpty()) {
|
||||||
|
@ -2076,8 +2086,10 @@ bool EmojiPan::iconAnim(float64 ms) {
|
||||||
if (dt >= 1) {
|
if (dt >= 1) {
|
||||||
_iconsStartAnim = 0;
|
_iconsStartAnim = 0;
|
||||||
_iconsX.finish();
|
_iconsX.finish();
|
||||||
|
_iconSelX.finish();
|
||||||
} else {
|
} else {
|
||||||
_iconsX.update(dt, anim::linear);
|
_iconsX.update(dt, anim::linear);
|
||||||
|
_iconSelX.update(dt, anim::linear);
|
||||||
}
|
}
|
||||||
updateSelected();
|
updateSelected();
|
||||||
}
|
}
|
||||||
|
@ -2161,6 +2173,7 @@ void EmojiPan::hideFinish() {
|
||||||
_iconOver = _iconDown = -1;
|
_iconOver = _iconDown = -1;
|
||||||
_iconSel = 0;
|
_iconSel = 0;
|
||||||
_iconsX = anim::ivalue(0, 0);
|
_iconsX = anim::ivalue(0, 0);
|
||||||
|
_iconSelX = anim::ivalue(0, 0);
|
||||||
_iconsStartAnim = 0;
|
_iconsStartAnim = 0;
|
||||||
_iconAnim.stop();
|
_iconAnim.stop();
|
||||||
_iconHovers = _icons.isEmpty() ? QVector<float64>() : QVector<float64>(_icons.size(), 0);
|
_iconHovers = _icons.isEmpty() ? QVector<float64>() : QVector<float64>(_icons.size(), 0);
|
||||||
|
@ -2319,6 +2332,7 @@ void EmojiPan::onScroll() {
|
||||||
}
|
}
|
||||||
if (newSel != _iconSel) {
|
if (newSel != _iconSel) {
|
||||||
_iconSel = newSel;
|
_iconSel = newSel;
|
||||||
|
_iconSelX.start(newSel * st::rbEmoji.width);
|
||||||
_iconsX.start(snap((2 * newSel - 7 - ((_icons.isEmpty() || _icons.at(0).sticker) ? 0 : 1)) * int(st::rbEmoji.width) / 2, 0, _iconsMax));
|
_iconsX.start(snap((2 * newSel - 7 - ((_icons.isEmpty() || _icons.at(0).sticker) ? 0 : 1)) * int(st::rbEmoji.width) / 2, 0, _iconsMax));
|
||||||
_iconsStartAnim = getms();
|
_iconsStartAnim = getms();
|
||||||
_iconAnim.start();
|
_iconAnim.start();
|
||||||
|
@ -2426,7 +2440,7 @@ void MentionsInner::paintEvent(QPaintEvent *e) {
|
||||||
}
|
}
|
||||||
p.setPen(st::black->p);
|
p.setPen(st::black->p);
|
||||||
if (!_rows->isEmpty()) {
|
if (!_rows->isEmpty()) {
|
||||||
UserData *user = _rows->at(last - i - 1);
|
UserData *user = _rows->at(i);
|
||||||
QString first = (_parent->filter().size() < 2) ? QString() : ('@' + user->username.mid(0, _parent->filter().size() - 1)), second = (_parent->filter().size() < 2) ? ('@' + user->username) : user->username.mid(_parent->filter().size() - 1);
|
QString first = (_parent->filter().size() < 2) ? QString() : ('@' + user->username.mid(0, _parent->filter().size() - 1)), second = (_parent->filter().size() < 2) ? ('@' + user->username) : user->username.mid(_parent->filter().size() - 1);
|
||||||
int32 firstwidth = st::mentionFont->m.width(first), secondwidth = st::mentionFont->m.width(second), unamewidth = firstwidth + secondwidth, namewidth = user->nameText.maxWidth();
|
int32 firstwidth = st::mentionFont->m.width(first), secondwidth = st::mentionFont->m.width(second), unamewidth = firstwidth + secondwidth, namewidth = user->nameText.maxWidth();
|
||||||
if (availwidth < unamewidth + namewidth) {
|
if (availwidth < unamewidth + namewidth) {
|
||||||
|
@ -2455,7 +2469,8 @@ void MentionsInner::paintEvent(QPaintEvent *e) {
|
||||||
p.drawText(2 * st::mentionPadding.left() + st::mentionPhotoSize + namewidth + st::mentionPadding.right() + firstwidth, i * st::mentionHeight + st::mentionTop + st::mentionFont->ascent, second);
|
p.drawText(2 * st::mentionPadding.left() + st::mentionPhotoSize + namewidth + st::mentionPadding.right() + firstwidth, i * st::mentionHeight + st::mentionTop + st::mentionFont->ascent, second);
|
||||||
}
|
}
|
||||||
} else if (!_hrows->isEmpty()) {
|
} else if (!_hrows->isEmpty()) {
|
||||||
QString first = (_parent->filter().size() < 2) ? QString() : ('#' + _hrows->at(last - i - 1).mid(0, _parent->filter().size() - 1)), second = (_parent->filter().size() < 2) ? ('#' + _hrows->at(last - i - 1)) : _hrows->at(last - i - 1).mid(_parent->filter().size() - 1);
|
QString hrow = _hrows->at(i);
|
||||||
|
QString first = (_parent->filter().size() < 2) ? QString() : ('#' + hrow.mid(0, _parent->filter().size() - 1)), second = (_parent->filter().size() < 2) ? ('#' + hrow) : hrow.mid(_parent->filter().size() - 1);
|
||||||
int32 firstwidth = st::mentionFont->m.width(first), secondwidth = st::mentionFont->m.width(second);
|
int32 firstwidth = st::mentionFont->m.width(first), secondwidth = st::mentionFont->m.width(second);
|
||||||
if (htagwidth < firstwidth + secondwidth) {
|
if (htagwidth < firstwidth + secondwidth) {
|
||||||
if (htagwidth < firstwidth + st::mentionFont->elidew) {
|
if (htagwidth < firstwidth + st::mentionFont->elidew) {
|
||||||
|
@ -2476,9 +2491,9 @@ void MentionsInner::paintEvent(QPaintEvent *e) {
|
||||||
p.drawText(htagleft + firstwidth, i * st::mentionHeight + st::mentionTop + st::mentionFont->ascent, second);
|
p.drawText(htagleft + firstwidth, i * st::mentionHeight + st::mentionTop + st::mentionFont->ascent, second);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
UserData *user = _crows->at(last - i - 1).first;
|
UserData *user = _crows->at(i).first;
|
||||||
|
|
||||||
const BotCommand &command = _crows->at(last - i - 1).second;
|
const BotCommand &command = _crows->at(i).second;
|
||||||
QString toHighlight = command.command;
|
QString toHighlight = command.command;
|
||||||
int32 botStatus = _parent->chat() ? _parent->chat()->botStatus : -1;
|
int32 botStatus = _parent->chat() ? _parent->chat()->botStatus : -1;
|
||||||
if (hasUsername || botStatus == 0 || botStatus == 2) {
|
if (hasUsername || botStatus == 0 || botStatus == 2) {
|
||||||
|
@ -2551,19 +2566,21 @@ void MentionsInner::mouseMoveEvent(QMouseEvent *e) {
|
||||||
|
|
||||||
void MentionsInner::clearSel() {
|
void MentionsInner::clearSel() {
|
||||||
_mouseSel = _overDelete = false;
|
_mouseSel = _overDelete = false;
|
||||||
setSel(-1);
|
setSel((_rows->isEmpty() && _crows->isEmpty() && _hrows->isEmpty()) ? -1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MentionsInner::moveSel(int direction) {
|
bool MentionsInner::moveSel(int direction) {
|
||||||
_mouseSel = false;
|
_mouseSel = false;
|
||||||
int32 maxSel = (_rows->isEmpty() ? (_hrows->isEmpty() ? _crows->size() : _hrows->size()) : _rows->size());
|
int32 maxSel = (_rows->isEmpty() ? (_hrows->isEmpty() ? _crows->size() : _hrows->size()) : _rows->size());
|
||||||
if (_sel >= maxSel || _sel < 0) {
|
if (_sel >= maxSel || _sel < 0) {
|
||||||
if (direction < 0) setSel(maxSel - 1, true);
|
if (direction < 0) {
|
||||||
|
setSel(maxSel - 1, true);
|
||||||
|
} else {
|
||||||
|
setSel(0, true);
|
||||||
|
}
|
||||||
return (_sel >= 0 && _sel < maxSel);
|
return (_sel >= 0 && _sel < maxSel);
|
||||||
}
|
}
|
||||||
if (_sel > 0 || direction > 0) {
|
|
||||||
setSel((_sel + direction >= maxSel) ? -1 : (_sel + direction), true);
|
setSel((_sel + direction >= maxSel) ? -1 : (_sel + direction), true);
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2572,12 +2589,12 @@ bool MentionsInner::select() {
|
||||||
if (_sel >= 0 && _sel < maxSel) {
|
if (_sel >= 0 && _sel < maxSel) {
|
||||||
QString result;
|
QString result;
|
||||||
if (!_rows->isEmpty()) {
|
if (!_rows->isEmpty()) {
|
||||||
result = '@' + _rows->at(_rows->size() - _sel - 1)->username;
|
result = '@' + _rows->at(_sel)->username;
|
||||||
} else if (!_hrows->isEmpty()) {
|
} else if (!_hrows->isEmpty()) {
|
||||||
result = '#' + _hrows->at(_hrows->size() - _sel - 1);
|
result = '#' + _hrows->at(_sel);
|
||||||
} else {
|
} else {
|
||||||
UserData *user = _crows->at(_crows->size() - _sel - 1).first;
|
UserData *user = _crows->at(_sel).first;
|
||||||
const BotCommand &command(_crows->at(_crows->size() - _sel - 1).second);
|
const BotCommand &command(_crows->at(_sel).second);
|
||||||
int32 botStatus = _parent->chat() ? _parent->chat()->botStatus : -1;
|
int32 botStatus = _parent->chat() ? _parent->chat()->botStatus : -1;
|
||||||
if (botStatus == 0 || botStatus == 2 || _parent->filter().indexOf('@') > 1) {
|
if (botStatus == 0 || botStatus == 2 || _parent->filter().indexOf('@') > 1) {
|
||||||
result = '/' + command.command + '@' + user->username;
|
result = '/' + command.command + '@' + user->username;
|
||||||
|
@ -2599,7 +2616,7 @@ void MentionsInner::mousePressEvent(QMouseEvent *e) {
|
||||||
if (_overDelete && _sel >= 0 && _sel < _hrows->size()) {
|
if (_overDelete && _sel >= 0 && _sel < _hrows->size()) {
|
||||||
_mousePos = mapToGlobal(e->pos());
|
_mousePos = mapToGlobal(e->pos());
|
||||||
|
|
||||||
QString toRemove = _hrows->at(_hrows->size() - _sel - 1);
|
QString toRemove = _hrows->at(_sel);
|
||||||
RecentHashtagPack recent(cRecentWriteHashtags());
|
RecentHashtagPack recent(cRecentWriteHashtags());
|
||||||
for (RecentHashtagPack::iterator i = recent.begin(); i != recent.cend();) {
|
for (RecentHashtagPack::iterator i = recent.begin(); i != recent.cend();) {
|
||||||
if (i->first == toRemove) {
|
if (i->first == toRemove) {
|
||||||
|
@ -2851,7 +2868,7 @@ void MentionsDropdown::recount(bool toDown) {
|
||||||
_inner.resize(width(), h);
|
_inner.resize(width(), h);
|
||||||
}
|
}
|
||||||
if (h > _boundings.height()) h = _boundings.height();
|
if (h > _boundings.height()) h = _boundings.height();
|
||||||
if (h > 5 * st::mentionHeight) h = 5 * st::mentionHeight;
|
if (h > 4.5 * st::mentionHeight) h = 4.5 * st::mentionHeight;
|
||||||
if (height() != h) {
|
if (height() != h) {
|
||||||
st += _scroll.height() - h;
|
st += _scroll.height() - h;
|
||||||
setGeometry(0, _boundings.height() - h, width(), h);
|
setGeometry(0, _boundings.height() - h, width(), h);
|
||||||
|
@ -2859,7 +2876,7 @@ void MentionsDropdown::recount(bool toDown) {
|
||||||
} else if (y() != _boundings.height() - h) {
|
} else if (y() != _boundings.height() - h) {
|
||||||
move(0, _boundings.height() - h);
|
move(0, _boundings.height() - h);
|
||||||
}
|
}
|
||||||
if (toDown) st = _scroll.scrollTopMax();
|
if (toDown) st = 0;// _scroll.scrollTopMax();
|
||||||
if (st != oldst) _scroll.scrollToY(st);
|
if (st != oldst) _scroll.scrollToY(st);
|
||||||
if (toDown) _inner.clearSel();
|
if (toDown) _inner.clearSel();
|
||||||
}
|
}
|
||||||
|
@ -2953,7 +2970,7 @@ bool MentionsDropdown::eventFilter(QObject *obj, QEvent *e) {
|
||||||
return true;
|
return true;
|
||||||
} else if (ev->key() == Qt::Key_Down) {
|
} else if (ev->key() == Qt::Key_Down) {
|
||||||
return _inner.moveSel(1);
|
return _inner.moveSel(1);
|
||||||
} else if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return || ev->key() == Qt::Key_Space) {
|
} else if (ev->key() == Qt::Key_Enter || ev->key() == Qt::Key_Return) {
|
||||||
return _inner.select();
|
return _inner.select();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -447,7 +447,7 @@ private:
|
||||||
QPoint _iconsMousePos, _iconsMouseDown;
|
QPoint _iconsMousePos, _iconsMouseDown;
|
||||||
int32 _iconsLeft, _iconsTop;
|
int32 _iconsLeft, _iconsTop;
|
||||||
int32 _iconsStartX, _iconsMax;
|
int32 _iconsStartX, _iconsMax;
|
||||||
anim::ivalue _iconsX;
|
anim::ivalue _iconsX, _iconSelX;
|
||||||
uint64 _iconsStartAnim;
|
uint64 _iconsStartAnim;
|
||||||
|
|
||||||
bool _stickersShown;
|
bool _stickersShown;
|
||||||
|
|
|
@ -783,8 +783,8 @@ void HashtagLink::onClick(Qt::MouseButton button) const {
|
||||||
|
|
||||||
void BotCommandLink::onClick(Qt::MouseButton button) const {
|
void BotCommandLink::onClick(Qt::MouseButton button) const {
|
||||||
if (button == Qt::LeftButton || button == Qt::MiddleButton) {
|
if (button == Qt::LeftButton || button == Qt::MiddleButton) {
|
||||||
App::insertBotCommand(_cmd);
|
// App::insertBotCommand(_cmd);
|
||||||
// App::sendBotCommand(_cmd);
|
App::sendBotCommand(_cmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -631,6 +631,11 @@ HistoryItem *History::createItem(HistoryBlock *block, const MTPmessage &msg, boo
|
||||||
|
|
||||||
case mtpc_messageActionChatDeleteUser: {
|
case mtpc_messageActionChatDeleteUser: {
|
||||||
const MTPDmessageActionChatDeleteUser &d(action.c_messageActionChatDeleteUser());
|
const MTPDmessageActionChatDeleteUser &d(action.c_messageActionChatDeleteUser());
|
||||||
|
if (lastKeyboardFrom == App::peerFromUser(d.vuser_id)) {
|
||||||
|
lastKeyboardInited = true;
|
||||||
|
lastKeyboardId = 0;
|
||||||
|
lastKeyboardFrom = 0;
|
||||||
|
}
|
||||||
// App::peer(App::peerFromUser(d.vuser_id)); left
|
// App::peer(App::peerFromUser(d.vuser_id)); left
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
@ -825,6 +830,10 @@ HistoryItem *History::doAddToBack(HistoryBlock *to, bool newBlock, HistoryItem *
|
||||||
lastKeyboardId = 0;
|
lastKeyboardId = 0;
|
||||||
lastKeyboardFrom = 0;
|
lastKeyboardFrom = 0;
|
||||||
}
|
}
|
||||||
|
} else if (peer->chat && (peer->asChat()->count < 1 || !peer->asChat()->participants.isEmpty()) && !peer->asChat()->participants.contains(adding->from())) {
|
||||||
|
lastKeyboardInited = true;
|
||||||
|
lastKeyboardId = 0;
|
||||||
|
lastKeyboardFrom = 0;
|
||||||
} else {
|
} else {
|
||||||
lastKeyboardInited = true;
|
lastKeyboardInited = true;
|
||||||
lastKeyboardId = adding->id;
|
lastKeyboardId = adding->id;
|
||||||
|
@ -947,7 +956,7 @@ void History::addToFront(const QVector<MTPMessage> &slice) {
|
||||||
if (!(App::replyMarkup(item->id).flags & MTPDreplyKeyboardMarkup_flag_ZERO)) {
|
if (!(App::replyMarkup(item->id).flags & MTPDreplyKeyboardMarkup_flag_ZERO)) {
|
||||||
if (!lastKeyboardInited) {
|
if (!lastKeyboardInited) {
|
||||||
lastKeyboardInited = true;
|
lastKeyboardInited = true;
|
||||||
if (wasKeyboardHide) {
|
if (wasKeyboardHide || ((peer->asChat()->count < 1 || !peer->asChat()->participants.isEmpty()) && !peer->asChat()->participants.contains(item->from()))) {
|
||||||
lastKeyboardId = 0;
|
lastKeyboardId = 0;
|
||||||
lastKeyboardFrom = 0;
|
lastKeyboardFrom = 0;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2032,7 +2032,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent)
|
||||||
, _field(this, st::taMsgField, lang(lng_message_ph))
|
, _field(this, st::taMsgField, lang(lng_message_ph))
|
||||||
, _recordAnim(animFunc(this, &HistoryWidget::recordStep))
|
, _recordAnim(animFunc(this, &HistoryWidget::recordStep))
|
||||||
, _recordingAnim(animFunc(this, &HistoryWidget::recordingStep))
|
, _recordingAnim(animFunc(this, &HistoryWidget::recordingStep))
|
||||||
, _recording(false), _inRecord(false), _inField(false)
|
, _recording(false), _inRecord(false), _inField(false), _inReply(false)
|
||||||
, a_recordingLevel(0, 0), _recordingSamples(0)
|
, a_recordingLevel(0, 0), _recordingSamples(0)
|
||||||
, a_recordOver(0, 0), a_recordDown(0, 0), a_recordCancel(st::recordCancel->c, st::recordCancel->c)
|
, a_recordOver(0, 0), a_recordDown(0, 0), a_recordCancel(st::recordCancel->c, st::recordCancel->c)
|
||||||
, _recordCancelWidth(st::recordFont->m.width(lang(lng_record_cancel)))
|
, _recordCancelWidth(st::recordFont->m.width(lang(lng_record_cancel)))
|
||||||
|
@ -2118,6 +2118,7 @@ HistoryWidget::HistoryWidget(QWidget *parent) : TWidget(parent)
|
||||||
updateScrollColors();
|
updateScrollColors();
|
||||||
|
|
||||||
_toHistoryEnd.hide();
|
_toHistoryEnd.hide();
|
||||||
|
_toHistoryEnd.installEventFilter(this);
|
||||||
|
|
||||||
_attachMention.hide();
|
_attachMention.hide();
|
||||||
connect(&_attachMention, SIGNAL(chosen(QString)), &_field, SLOT(onMentionHashtagOrBotCommandInsert(QString)));
|
connect(&_attachMention, SIGNAL(chosen(QString)), &_field, SLOT(onMentionHashtagOrBotCommandInsert(QString)));
|
||||||
|
@ -2632,7 +2633,7 @@ void HistoryWidget::showPeer(const PeerId &peer, MsgId msgId, bool force, bool l
|
||||||
}
|
}
|
||||||
if (_previewData && _previewData->pendingTill >= 0) {
|
if (_previewData && _previewData->pendingTill >= 0) {
|
||||||
_previewData = 0;
|
_previewData = 0;
|
||||||
if (!App::main()->hasForwardingItems()) _replyForwardPreviewCancel.hide();
|
_replyForwardPreviewCancel.hide();
|
||||||
}
|
}
|
||||||
_previewCache.clear();
|
_previewCache.clear();
|
||||||
_scroll.setWidget(0);
|
_scroll.setWidget(0);
|
||||||
|
@ -2786,13 +2787,13 @@ void HistoryWidget::updateControlsVisibility() {
|
||||||
_kbScroll.hide();
|
_kbScroll.hide();
|
||||||
_send.hide();
|
_send.hide();
|
||||||
_botStart.hide();
|
_botStart.hide();
|
||||||
_toHistoryEnd.hide();
|
|
||||||
_attachMention.hide();
|
_attachMention.hide();
|
||||||
_field.hide();
|
_field.hide();
|
||||||
_replyForwardPreviewCancel.hide();
|
_replyForwardPreviewCancel.hide();
|
||||||
_attachDocument.hide();
|
_attachDocument.hide();
|
||||||
_attachPhoto.hide();
|
_attachPhoto.hide();
|
||||||
_attachEmoji.hide();
|
_attachEmoji.hide();
|
||||||
|
_toHistoryEnd.hide();
|
||||||
_kbShow.hide();
|
_kbShow.hide();
|
||||||
_kbHide.hide();
|
_kbHide.hide();
|
||||||
_attachType.hide();
|
_attachType.hide();
|
||||||
|
@ -2800,12 +2801,8 @@ void HistoryWidget::updateControlsVisibility() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateToEndVisibility();
|
||||||
if (hist->readyForWork()) {
|
if (hist->readyForWork()) {
|
||||||
if (hist->loadedAtBottom() && !_replyReturn) {
|
|
||||||
_toHistoryEnd.hide();
|
|
||||||
} else {
|
|
||||||
_toHistoryEnd.show();
|
|
||||||
}
|
|
||||||
if (!histPeer->chat || !histPeer->asChat()->forbidden) {
|
if (!histPeer->chat || !histPeer->asChat()->forbidden) {
|
||||||
checkMentionDropdown();
|
checkMentionDropdown();
|
||||||
bool botStart = !histPeer->chat && histPeer->asUser()->botInfo && (!histPeer->asUser()->botInfo->startToken.isEmpty() || hist->isEmpty() && !hist->lastMsg);
|
bool botStart = !histPeer->chat && histPeer->asUser()->botInfo && (!histPeer->asUser()->botInfo->startToken.isEmpty() || hist->isEmpty() && !hist->lastMsg);
|
||||||
|
@ -2873,7 +2870,7 @@ void HistoryWidget::updateControlsVisibility() {
|
||||||
_attachPhoto.hide();
|
_attachPhoto.hide();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ((_replyToId || App::main()->hasForwardingItems() || (_previewData && _previewData->pendingTill >= 0))) {
|
if (_replyToId || App::main()->hasForwardingItems() || (_previewData && _previewData->pendingTill >= 0) || _kbReplyTo) {
|
||||||
if (_replyForwardPreviewCancel.isHidden()) {
|
if (_replyForwardPreviewCancel.isHidden()) {
|
||||||
_replyForwardPreviewCancel.show();
|
_replyForwardPreviewCancel.show();
|
||||||
resizeEvent(0);
|
resizeEvent(0);
|
||||||
|
@ -2919,7 +2916,6 @@ void HistoryWidget::updateControlsVisibility() {
|
||||||
_kbHide.hide();
|
_kbHide.hide();
|
||||||
_attachType.hide();
|
_attachType.hide();
|
||||||
_emojiPan.hide();
|
_emojiPan.hide();
|
||||||
_toHistoryEnd.hide();
|
|
||||||
_replyForwardPreviewCancel.hide();
|
_replyForwardPreviewCancel.hide();
|
||||||
if (!_field.isHidden()) {
|
if (!_field.isHidden()) {
|
||||||
_field.hide();
|
_field.hide();
|
||||||
|
@ -3205,6 +3201,8 @@ void HistoryWidget::onListScroll() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateToEndVisibility();
|
||||||
|
|
||||||
int st = _scroll.scrollTop(), stm = _scroll.scrollTopMax(), sh = _scroll.height();
|
int st = _scroll.scrollTop(), stm = _scroll.scrollTopMax(), sh = _scroll.height();
|
||||||
if (hist->readyForWork() && (st + PreloadHeightsCount * sh > stm)) {
|
if (hist->readyForWork() && (st + PreloadHeightsCount * sh > stm)) {
|
||||||
loadMessagesDown();
|
loadMessagesDown();
|
||||||
|
@ -3245,12 +3243,9 @@ QString HistoryWidget::prepareMessage(QString result) {
|
||||||
void HistoryWidget::onHistoryToEnd() {
|
void HistoryWidget::onHistoryToEnd() {
|
||||||
if (_replyReturn) {
|
if (_replyReturn) {
|
||||||
showPeer(histPeer->id, _replyReturn->id);
|
showPeer(histPeer->id, _replyReturn->id);
|
||||||
} else {
|
} else if (hist) {
|
||||||
_toHistoryEnd.hide();
|
|
||||||
if (hist && !hist->loadedAtBottom()) {
|
|
||||||
showPeer(histPeer->id, 0);
|
showPeer(histPeer->id, 0);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryWidget::onSend(bool ctrlShiftEnter, MsgId replyTo) {
|
void HistoryWidget::onSend(bool ctrlShiftEnter, MsgId replyTo) {
|
||||||
|
@ -3555,6 +3550,7 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) {
|
||||||
QPoint pos(e ? e->pos() : mapFromGlobal(QCursor::pos()));
|
QPoint pos(e ? e->pos() : mapFromGlobal(QCursor::pos()));
|
||||||
bool inRecord = _send.geometry().contains(pos);
|
bool inRecord = _send.geometry().contains(pos);
|
||||||
bool inField = pos.y() >= (_scroll.y() + _scroll.height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width();
|
bool inField = pos.y() >= (_scroll.y() + _scroll.height()) && pos.y() < height() && pos.x() >= 0 && pos.x() < width();
|
||||||
|
bool inReply = QRect(st::replySkip, _field.y() - st::sendPadding - st::replyHeight, width() - st::replySkip - _replyForwardPreviewCancel.width(), st::replyHeight).contains(pos) && (_replyToId || _kbReplyTo);
|
||||||
bool startAnim = false;
|
bool startAnim = false;
|
||||||
if (inRecord != _inRecord) {
|
if (inRecord != _inRecord) {
|
||||||
_inRecord = inRecord;
|
_inRecord = inRecord;
|
||||||
|
@ -3570,6 +3566,10 @@ void HistoryWidget::mouseMoveEvent(QMouseEvent *e) {
|
||||||
a_recordCancel.start(_inField ? st::recordCancel->c : st::recordCancelActive->c);
|
a_recordCancel.start(_inField ? st::recordCancel->c : st::recordCancelActive->c);
|
||||||
startAnim = true;
|
startAnim = true;
|
||||||
}
|
}
|
||||||
|
if (inReply != _inReply) {
|
||||||
|
_inReply = inReply;
|
||||||
|
setCursor(inReply ? style::cur_pointer : style::cur_default);
|
||||||
|
}
|
||||||
if (startAnim) _recordAnim.start();
|
if (startAnim) _recordAnim.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3616,8 +3616,15 @@ void HistoryWidget::sendBotCommand(const QString &cmd, MsgId replyTo) { // reply
|
||||||
App::main()->readServerHistory(hist, false);
|
App::main()->readServerHistory(hist, false);
|
||||||
hist->loadAround(0);
|
hist->loadAround(0);
|
||||||
|
|
||||||
|
QString toSend = cmd;
|
||||||
|
UserData *bot = histPeer->chat ? (App::hoveredLinkItem() ? (App::hoveredLinkItem()->toHistoryForwarded() ? App::hoveredLinkItem()->toHistoryForwarded()->fromForwarded() : App::hoveredLinkItem()->from()) : 0) : histPeer->asUser();
|
||||||
|
QString username = (bot && bot->botInfo) ? bot->username : QString();
|
||||||
|
if (!replyTo && toSend.indexOf('@') < 2 && histPeer->chat && !username.isEmpty() && (histPeer->asChat()->botStatus == 0 || histPeer->asChat()->botStatus == 2)) {
|
||||||
|
toSend += '@' + username;
|
||||||
|
}
|
||||||
|
|
||||||
int32 botStatus = histPeer->chat ? histPeer->asChat()->botStatus : -1;
|
int32 botStatus = histPeer->chat ? histPeer->asChat()->botStatus : -1;
|
||||||
App::main()->sendPreparedText(hist, cmd, replyTo ? ((histPeer->chat/* && (botStatus == 0 || botStatus == 2)*/) ? replyTo : -1) : 0);
|
App::main()->sendPreparedText(hist, toSend, replyTo ? ((histPeer->chat/* && (botStatus == 0 || botStatus == 2)*/) ? replyTo : -1) : 0);
|
||||||
if (replyTo) {
|
if (replyTo) {
|
||||||
cancelReply();
|
cancelReply();
|
||||||
if (_keyboard.hasMarkup() && _keyboard.singleUse() && _keyboard.forMsgId() == replyTo) {
|
if (_keyboard.hasMarkup() && _keyboard.singleUse() && _keyboard.forMsgId() == replyTo) {
|
||||||
|
@ -3633,7 +3640,7 @@ void HistoryWidget::insertBotCommand(const QString &cmd) {
|
||||||
QString toInsert = cmd;
|
QString toInsert = cmd;
|
||||||
UserData *bot = histPeer->chat ? (App::hoveredLinkItem() ? (App::hoveredLinkItem()->toHistoryForwarded() ? App::hoveredLinkItem()->toHistoryForwarded()->fromForwarded() : App::hoveredLinkItem()->from()) : 0) : histPeer->asUser();
|
UserData *bot = histPeer->chat ? (App::hoveredLinkItem() ? (App::hoveredLinkItem()->toHistoryForwarded() ? App::hoveredLinkItem()->toHistoryForwarded()->fromForwarded() : App::hoveredLinkItem()->from()) : 0) : histPeer->asUser();
|
||||||
QString username = (bot && bot->botInfo) ? bot->username : QString();
|
QString username = (bot && bot->botInfo) ? bot->username : QString();
|
||||||
if (cmd.indexOf('@') < 2 && histPeer->chat && !username.isEmpty() && (histPeer->asChat()->botStatus == 0 || histPeer->asChat()->botStatus == 2)) {
|
if (toInsert.indexOf('@') < 2 && histPeer->chat && !username.isEmpty() && (histPeer->asChat()->botStatus == 0 || histPeer->asChat()->botStatus == 2)) {
|
||||||
toInsert += '@' + username;
|
toInsert += '@' + username;
|
||||||
}
|
}
|
||||||
toInsert += ' ';
|
toInsert += ' ';
|
||||||
|
@ -3652,6 +3659,13 @@ void HistoryWidget::insertBotCommand(const QString &cmd) {
|
||||||
_field.setTextCursor(cur);
|
_field.setTextCursor(cur);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HistoryWidget::eventFilter(QObject *obj, QEvent *e) {
|
||||||
|
if (obj == &_toHistoryEnd && e->type() == QEvent::Wheel) {
|
||||||
|
return _scroll.viewportEvent(e);
|
||||||
|
}
|
||||||
|
return TWidget::eventFilter(obj, e);
|
||||||
|
}
|
||||||
|
|
||||||
DragState HistoryWidget::getDragState(const QMimeData *d) {
|
DragState HistoryWidget::getDragState(const QMimeData *d) {
|
||||||
if (!d) return DragStateNone;
|
if (!d) return DragStateNone;
|
||||||
|
|
||||||
|
@ -3744,17 +3758,28 @@ void HistoryWidget::onKbToggle(bool manual) {
|
||||||
_kbShow.show();
|
_kbShow.show();
|
||||||
_kbScroll.hide();
|
_kbScroll.hide();
|
||||||
_kbShown = false;
|
_kbShown = false;
|
||||||
|
|
||||||
|
_field.setMaxHeight(st::maxFieldHeight);
|
||||||
|
|
||||||
_kbReplyTo = 0;
|
_kbReplyTo = 0;
|
||||||
|
if (!App::main()->hasForwardingItems() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId) {
|
||||||
|
_replyForwardPreviewCancel.hide();
|
||||||
|
}
|
||||||
if (manual) _kbWasHidden = true;
|
if (manual) _kbWasHidden = true;
|
||||||
} else {
|
} else {
|
||||||
_kbHide.show();
|
_kbHide.show();
|
||||||
_kbShow.hide();
|
_kbShow.hide();
|
||||||
_kbScroll.show();
|
_kbScroll.show();
|
||||||
_kbShown = true;
|
_kbShown = true;
|
||||||
|
|
||||||
|
int32 maxh = qMin(_keyboard.height(), int(st::maxFieldHeight) - (int(st::maxFieldHeight) / 2));
|
||||||
|
_field.setMaxHeight(st::maxFieldHeight - maxh);
|
||||||
|
|
||||||
_kbReplyTo = hist->peer->chat ? App::histItemById(_keyboard.forMsgId()) : 0;
|
_kbReplyTo = hist->peer->chat ? App::histItemById(_keyboard.forMsgId()) : 0;
|
||||||
if (_kbReplyTo && !_replyToId) {
|
if (_kbReplyTo && !_replyToId) {
|
||||||
updateReplyToName();
|
updateReplyToName();
|
||||||
_replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
_replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
||||||
|
_replyForwardPreviewCancel.show();
|
||||||
}
|
}
|
||||||
if (manual) _kbWasHidden = false;
|
if (manual) _kbWasHidden = false;
|
||||||
}
|
}
|
||||||
|
@ -4502,6 +4527,7 @@ void HistoryWidget::updateBotKeyboard() {
|
||||||
if (_kbReplyTo && !_replyToId) {
|
if (_kbReplyTo && !_replyToId) {
|
||||||
updateReplyToName();
|
updateReplyToName();
|
||||||
_replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
_replyToText.setText(st::msgFont, _kbReplyTo->inDialogsText(), _textDlgOptions);
|
||||||
|
_replyForwardPreviewCancel.show();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!_showAnim.animating()) {
|
if (!_showAnim.animating()) {
|
||||||
|
@ -4513,6 +4539,9 @@ void HistoryWidget::updateBotKeyboard() {
|
||||||
_field.setMaxHeight(st::maxFieldHeight);
|
_field.setMaxHeight(st::maxFieldHeight);
|
||||||
_kbShown = false;
|
_kbShown = false;
|
||||||
_kbReplyTo = 0;
|
_kbReplyTo = 0;
|
||||||
|
if (!App::main()->hasForwardingItems() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId) {
|
||||||
|
_replyForwardPreviewCancel.hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!_scroll.isHidden()) {
|
if (!_scroll.isHidden()) {
|
||||||
|
@ -4524,13 +4553,25 @@ void HistoryWidget::updateBotKeyboard() {
|
||||||
_field.setMaxHeight(st::maxFieldHeight);
|
_field.setMaxHeight(st::maxFieldHeight);
|
||||||
_kbShown = false;
|
_kbShown = false;
|
||||||
_kbReplyTo = 0;
|
_kbReplyTo = 0;
|
||||||
|
if (!App::main()->hasForwardingItems() && (!_previewData || _previewData->pendingTill < 0) && !_replyToId) {
|
||||||
|
_replyForwardPreviewCancel.hide();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resizeEvent(0);
|
resizeEvent(0);
|
||||||
update();
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void HistoryWidget::updateToEndVisibility() {
|
||||||
|
bool toEndVisible = !_showAnim.animating() && hist && hist->readyForWork() && (!hist->loadedAtBottom() || _replyReturn || _scroll.scrollTop() + st::wndMinHeight < _scroll.scrollTopMax());
|
||||||
|
if (toEndVisible && _toHistoryEnd.isHidden()) {
|
||||||
|
_toHistoryEnd.show();
|
||||||
|
} else if (!toEndVisible && !_toHistoryEnd.isHidden()) {
|
||||||
|
_toHistoryEnd.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void HistoryWidget::mousePressEvent(QMouseEvent *e) {
|
void HistoryWidget::mousePressEvent(QMouseEvent *e) {
|
||||||
_replyForwardPressed = QRect(0, _field.y() - st::replyHeight, st::replySkip, st::replyHeight).contains(e->pos());
|
_replyForwardPressed = QRect(0, _field.y() - st::sendPadding - st::replyHeight, st::replySkip, st::replyHeight).contains(e->pos());
|
||||||
if (_replyForwardPressed && !_replyForwardPreviewCancel.isHidden()) {
|
if (_replyForwardPressed && !_replyForwardPreviewCancel.isHidden()) {
|
||||||
updateField();
|
updateField();
|
||||||
} else if (_inRecord && cHasAudioCapture()) {
|
} else if (_inRecord && cHasAudioCapture()) {
|
||||||
|
@ -4545,6 +4586,8 @@ void HistoryWidget::mousePressEvent(QMouseEvent *e) {
|
||||||
a_recordDown.start(1);
|
a_recordDown.start(1);
|
||||||
a_recordOver.restart();
|
a_recordOver.restart();
|
||||||
_recordAnim.start();
|
_recordAnim.start();
|
||||||
|
} else if (_inReply) {
|
||||||
|
App::main()->showPeer(histPeer->id, _replyToId ? _replyToId : _kbReplyTo->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4628,6 +4671,8 @@ void HistoryWidget::onStickerSend(DocumentData *sticker) {
|
||||||
App::main()->finishForwarding(hist);
|
App::main()->finishForwarding(hist);
|
||||||
cancelReply();
|
cancelReply();
|
||||||
|
|
||||||
|
if (sticker->sticker) App::main()->incrementSticker(sticker);
|
||||||
|
|
||||||
App::historyRegRandom(randomId, newId);
|
App::historyRegRandom(randomId, newId);
|
||||||
App::main()->historyToDown(hist);
|
App::main()->historyToDown(hist);
|
||||||
|
|
||||||
|
@ -4683,8 +4728,9 @@ void HistoryWidget::cancelReply() {
|
||||||
if (!_replyToId) return;
|
if (!_replyToId) return;
|
||||||
_replyTo = 0;
|
_replyTo = 0;
|
||||||
_replyToId = 0;
|
_replyToId = 0;
|
||||||
if (!App::main()->hasForwardingItems()) {
|
mouseMoveEvent(0);
|
||||||
if (!_previewData || _previewData->pendingTill < 0) _replyForwardPreviewCancel.hide();
|
if (!App::main()->hasForwardingItems() && (!_previewData || _previewData->pendingTill < 0) && !_kbReplyTo) {
|
||||||
|
_replyForwardPreviewCancel.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateBotKeyboard();
|
updateBotKeyboard();
|
||||||
|
@ -4712,9 +4758,12 @@ void HistoryWidget::onReplyForwardPreviewCancel() {
|
||||||
_saveDraftText = true;
|
_saveDraftText = true;
|
||||||
_saveDraftStart = getms();
|
_saveDraftStart = getms();
|
||||||
onDraftSave();
|
onDraftSave();
|
||||||
} else {
|
} else if (App::main()->hasForwardingItems()) {
|
||||||
App::main()->cancelForwarding();
|
App::main()->cancelForwarding();
|
||||||
|
} else if (_replyToId) {
|
||||||
cancelReply();
|
cancelReply();
|
||||||
|
} else if (_kbReplyTo) {
|
||||||
|
onKbToggle();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4734,7 +4783,7 @@ void HistoryWidget::previewCancel() {
|
||||||
_previewData = 0;
|
_previewData = 0;
|
||||||
_previewLinks.clear();
|
_previewLinks.clear();
|
||||||
updatePreview();
|
updatePreview();
|
||||||
if (!_replyToId && !App::main()->hasForwardingItems()) _replyForwardPreviewCancel.hide();
|
if (!_replyToId && !App::main()->hasForwardingItems() && !_kbReplyTo) _replyForwardPreviewCancel.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
void HistoryWidget::onPreviewParse() {
|
void HistoryWidget::onPreviewParse() {
|
||||||
|
@ -4828,7 +4877,7 @@ void HistoryWidget::updatePreview() {
|
||||||
_previewTitle.setText(st::msgServiceNameFont, title, _textNameOptions);
|
_previewTitle.setText(st::msgServiceNameFont, title, _textNameOptions);
|
||||||
_previewDescription.setText(st::msgFont, desc, _textDlgOptions);
|
_previewDescription.setText(st::msgFont, desc, _textDlgOptions);
|
||||||
}
|
}
|
||||||
} else if (!App::main()->hasForwardingItems() && !_replyToId) {
|
} else if (!App::main()->hasForwardingItems() && !_replyToId && !_kbReplyTo) {
|
||||||
_replyForwardPreviewCancel.hide();
|
_replyForwardPreviewCancel.hide();
|
||||||
}
|
}
|
||||||
resizeEvent(0);
|
resizeEvent(0);
|
||||||
|
|
|
@ -452,6 +452,9 @@ public:
|
||||||
void sendBotCommand(const QString &cmd, MsgId replyTo);
|
void sendBotCommand(const QString &cmd, MsgId replyTo);
|
||||||
void insertBotCommand(const QString &cmd);
|
void insertBotCommand(const QString &cmd);
|
||||||
|
|
||||||
|
bool eventFilter(QObject *obj, QEvent *e);
|
||||||
|
void updateBotKeyboard();
|
||||||
|
|
||||||
~HistoryWidget();
|
~HistoryWidget();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
@ -572,7 +575,7 @@ private:
|
||||||
void addMessagesToFront(const QVector<MTPMessage> &messages);
|
void addMessagesToFront(const QVector<MTPMessage> &messages);
|
||||||
void addMessagesToBack(const QVector<MTPMessage> &messages);
|
void addMessagesToBack(const QVector<MTPMessage> &messages);
|
||||||
|
|
||||||
void updateBotKeyboard();
|
void updateToEndVisibility();
|
||||||
|
|
||||||
void stickersGot(const MTPmessages_AllStickers &stickers);
|
void stickersGot(const MTPmessages_AllStickers &stickers);
|
||||||
bool stickersFailed(const RPCError &error);
|
bool stickersFailed(const RPCError &error);
|
||||||
|
@ -611,7 +614,7 @@ private:
|
||||||
IconedButton _attachDocument, _attachPhoto, _attachEmoji, _kbShow, _kbHide;
|
IconedButton _attachDocument, _attachPhoto, _attachEmoji, _kbShow, _kbHide;
|
||||||
MessageField _field;
|
MessageField _field;
|
||||||
Animation _recordAnim, _recordingAnim;
|
Animation _recordAnim, _recordingAnim;
|
||||||
bool _recording, _inRecord, _inField;
|
bool _recording, _inRecord, _inField, _inReply;
|
||||||
anim::ivalue a_recordingLevel;
|
anim::ivalue a_recordingLevel;
|
||||||
int32 _recordingSamples;
|
int32 _recordingSamples;
|
||||||
anim::fvalue a_recordOver, a_recordDown;
|
anim::fvalue a_recordOver, a_recordDown;
|
||||||
|
|
|
@ -1718,6 +1718,10 @@ void MainWidget::updateReplyTo() {
|
||||||
history.updateReplyTo(true);
|
history.updateReplyTo(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainWidget::updateBotKeyboard() {
|
||||||
|
history.updateBotKeyboard();
|
||||||
|
}
|
||||||
|
|
||||||
void MainWidget::pushReplyReturn(HistoryItem *item) {
|
void MainWidget::pushReplyReturn(HistoryItem *item) {
|
||||||
history.pushReplyReturn(item);
|
history.pushReplyReturn(item);
|
||||||
}
|
}
|
||||||
|
|
|
@ -333,6 +333,7 @@ public:
|
||||||
|
|
||||||
ApiWrap *api();
|
ApiWrap *api();
|
||||||
void updateReplyTo();
|
void updateReplyTo();
|
||||||
|
void updateBotKeyboard();
|
||||||
|
|
||||||
void pushReplyReturn(HistoryItem *item);
|
void pushReplyReturn(HistoryItem *item);
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
<key>CFBundlePackageType</key>
|
<key>CFBundlePackageType</key>
|
||||||
<string>APPL</string>
|
<string>APPL</string>
|
||||||
<key>CFBundleShortVersionString</key>
|
<key>CFBundleShortVersionString</key>
|
||||||
<string>0.8.27</string>
|
<string>0.8.28</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
<string>$(MACOSX_DEPLOYMENT_TARGET)</string>
|
||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
|
|
Binary file not shown.
|
@ -1701,7 +1701,7 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 0.8.27;
|
CURRENT_PROJECT_VERSION = 0.8.28;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
|
@ -1719,7 +1719,7 @@
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||||
COPY_PHASE_STRIP = YES;
|
COPY_PHASE_STRIP = YES;
|
||||||
CURRENT_PROJECT_VERSION = 0.8.27;
|
CURRENT_PROJECT_VERSION = 0.8.28;
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = NO;
|
||||||
GCC_OPTIMIZATION_LEVEL = fast;
|
GCC_OPTIMIZATION_LEVEL = fast;
|
||||||
GCC_PREFIX_HEADER = ./SourceFiles/stdafx.h;
|
GCC_PREFIX_HEADER = ./SourceFiles/stdafx.h;
|
||||||
|
@ -1745,10 +1745,10 @@
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 0.8.27;
|
CURRENT_PROJECT_VERSION = 0.8.28;
|
||||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||||
DYLIB_COMPATIBILITY_VERSION = 0.8;
|
DYLIB_COMPATIBILITY_VERSION = 0.8;
|
||||||
DYLIB_CURRENT_VERSION = 0.8.27;
|
DYLIB_CURRENT_VERSION = 0.8.28;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "";
|
FRAMEWORK_SEARCH_PATHS = "";
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||||
|
@ -1888,10 +1888,10 @@
|
||||||
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
|
||||||
CODE_SIGN_IDENTITY = "";
|
CODE_SIGN_IDENTITY = "";
|
||||||
COPY_PHASE_STRIP = NO;
|
COPY_PHASE_STRIP = NO;
|
||||||
CURRENT_PROJECT_VERSION = 0.8.27;
|
CURRENT_PROJECT_VERSION = 0.8.28;
|
||||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 0.8;
|
DYLIB_COMPATIBILITY_VERSION = 0.8;
|
||||||
DYLIB_CURRENT_VERSION = 0.8.27;
|
DYLIB_CURRENT_VERSION = 0.8.28;
|
||||||
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
ENABLE_STRICT_OBJC_MSGSEND = YES;
|
||||||
FRAMEWORK_SEARCH_PATHS = "";
|
FRAMEWORK_SEARCH_PATHS = "";
|
||||||
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
GCC_GENERATE_DEBUGGING_SYMBOLS = YES;
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
echo 8027 0.8.27 1
|
echo 8028 0.8.28 1
|
||||||
# AppVersion AppVersionStr DevChannel
|
# AppVersion AppVersionStr DevChannel
|
||||||
|
|
Loading…
Reference in New Issue