2
0
mirror of https://github.com/telegramdesktop/tdesktop synced 2025-09-02 15:35:51 +00:00

New main menu in DialogsWidget.

Also "flip_horizontal" and "flip_vertical" modifiers support added.
Also moving parts of MainWindow to Window::MainWindow.
This commit is contained in:
John Preston
2016-11-04 14:14:47 +03:00
parent 0cbb0014db
commit 3a599e0752
86 changed files with 565 additions and 774 deletions

View File

@@ -36,10 +36,12 @@ Copyright (c) 2014-2016 John Preston, https://desktop.telegram.org
#include "boxes/addcontactbox.h"
#include "boxes/contactsbox.h"
#include "boxes/confirmbox.h"
#include "boxes/aboutbox.h"
#include "localstorage.h"
#include "apiwrap.h"
#include "ui/widgets/dropdown_menu.h"
DialogsInner::DialogsInner(QWidget *parent, MainWidget *main) : SplittedWidget(parent)
DialogsInner::DialogsInner(QWidget *parent, QWidget *main) : SplittedWidget(parent)
, dialogs(std_::make_unique<Dialogs::IndexedList>(Dialogs::SortMode::Date))
, contactsNoDialogs(std_::make_unique<Dialogs::IndexedList>(Dialogs::SortMode::Name))
, contacts(std_::make_unique<Dialogs::IndexedList>(Dialogs::SortMode::Name))
@@ -1770,28 +1772,13 @@ MsgId DialogsInner::lastSearchMigratedId() const {
return _lastSearchMigratedId;
}
DialogsWidget::DialogsWidget(MainWidget *parent) : TWidget(parent)
, _dragInScroll(false)
, _dragForward(false)
, _dialogsFull(false)
, _dialogsOffsetDate(0)
, _dialogsOffsetId(0)
, _dialogsOffsetPeer(0)
, _dialogsRequest(0)
, _contactsRequest(0)
, _filter(this, st::dlgFilter, lang(lng_dlg_filter))
, _newGroup(this, st::dialogsNewChatButton)
, _addContact(this, st::dialogsAddContact)
DialogsWidget::DialogsWidget(QWidget *parent) : TWidget(parent)
, _mainMenuToggle(this, st::dialogsMenuToggle)
, _filter(this, st::dialogsFilter, lang(lng_dlg_filter))
, _cancelSearch(this, st::dialogsCancelSearch)
, _scroll(this, st::dialogsScroll)
, _inner(&_scroll, parent)
, _a_show(animation(this, &DialogsWidget::step_show))
, _searchInPeer(0)
, _searchInMigrated(0)
, _searchFull(false)
, _searchFullMigrated(false)
, _peopleFull(false)
{
, _a_show(animation(this, &DialogsWidget::step_show)) {
_scroll.setWidget(&_inner);
_scroll.setFocusPolicy(Qt::NoFocus);
connect(&_inner, SIGNAL(mustScrollTo(int,int)), &_scroll, SLOT(scrollToY(int,int)));
@@ -1803,14 +1790,13 @@ DialogsWidget::DialogsWidget(MainWidget *parent) : TWidget(parent)
connect(&_inner, SIGNAL(cancelSearchInPeer()), this, SLOT(onCancelSearchInPeer()));
connect(&_scroll, SIGNAL(geometryChanged()), &_inner, SLOT(onParentGeometryChanged()));
connect(&_scroll, SIGNAL(scrolled()), this, SLOT(onListScroll()));
connect(&_filter, SIGNAL(cancelled()), this, SLOT(onCancel()));
connect(&_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate()));
connect(&_filter, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(onFilterCursorMoved(int,int)));
connect(parent, SIGNAL(dialogsUpdated()), this, SLOT(onListScroll()));
connect(_addContact, SIGNAL(clicked()), this, SLOT(onAddContact()));
connect(_newGroup, SIGNAL(clicked()), this, SLOT(onNewGroup()));
connect(_filter, SIGNAL(cancelled()), this, SLOT(onCancel()));
connect(_filter, SIGNAL(changed()), this, SLOT(onFilterUpdate()));
connect(_filter, SIGNAL(cursorPositionChanged(int,int)), this, SLOT(onFilterCursorMoved(int,int)));
connect(_cancelSearch, SIGNAL(clicked()), this, SLOT(onCancelSearch()));
_mainMenuToggle->setClickedCallback([this] { showMainMenu(); });
_chooseByDragTimer.setSingleShot(true);
connect(&_chooseByDragTimer, SIGNAL(timeout()), this, SLOT(onChooseByDrag()));
@@ -1819,21 +1805,13 @@ DialogsWidget::DialogsWidget(MainWidget *parent) : TWidget(parent)
_searchTimer.setSingleShot(true);
connect(&_searchTimer, SIGNAL(timeout()), this, SLOT(onSearchMessages()));
_scroll.show();
_filter.show();
_filter.move(st::dialogsPadding.x(), st::dialogsFilterPadding);
_filter.setFocusPolicy(Qt::StrongFocus);
_filter.customUpDown(true);
_addContact->hide();
_newGroup->show();
_filter->setFocusPolicy(Qt::StrongFocus);
_filter->customUpDown(true);
_cancelSearch->hide();
_newGroup->move(width() - _newGroup->width() - st::dialogsPadding.x(), 0);
_addContact->move(width() - _addContact->width() - st::dialogsPadding.x(), 0);
_cancelSearch->move(width() - _cancelSearch->width() - st::dialogsPadding.x(), 0);
}
void DialogsWidget::activate() {
_filter.setFocus();
_filter->setFocus();
_inner.activate();
}
@@ -1858,7 +1836,7 @@ void DialogsWidget::dlgUpdated(History *row, MsgId msgId) {
}
void DialogsWidget::dialogsToUp() {
if (_filter.getLastText().trimmed().isEmpty()) {
if (_filter->getLastText().trimmed().isEmpty()) {
_scroll.scrollToY(0);
}
}
@@ -1873,9 +1851,8 @@ void DialogsWidget::showAnimated(Window::SlideDirection direction, const Window:
_a_show.stop();
_scroll.hide();
_filter.hide();
_filter->hide();
_cancelSearch->hide();
_newGroup->hide();
int delta = st::slideShift;
if (direction == Window::SlideDirection::FromLeft) {
@@ -1903,7 +1880,7 @@ void DialogsWidget::step_show(float64 ms, bool timer) {
_cacheUnder = _cacheOver = QPixmap();
_scroll.show();
_filter.show();
_filter->show();
_a_show.stop();
onFilterUpdate();
@@ -1930,8 +1907,8 @@ void DialogsWidget::updateNotifySettings(PeerData *peer) {
void DialogsWidget::notify_userIsContactChanged(UserData *user, bool fromThisApp) {
if (fromThisApp) {
_filter.setText(QString());
_filter.updatePlaceholder();
_filter->setText(QString());
_filter->updatePlaceholder();
onFilterUpdate();
}
_inner.notify_userIsContactChanged(user, fromThisApp);
@@ -2031,7 +2008,7 @@ bool DialogsWidget::dialogsFailed(const RPCError &error, mtpRequestId req) {
}
bool DialogsWidget::onSearchMessages(bool searchCache) {
QString q = _filter.getLastText().trimmed();
QString q = _filter->getLastText().trimmed();
if (q.isEmpty()) {
if (_searchRequest) {
MTP::cancel(_searchRequest);
@@ -2098,16 +2075,39 @@ void DialogsWidget::onChooseByDrag() {
_inner.choosePeer();
}
void DialogsWidget::showMainMenu() {
if (!_mainMenu) {
_mainMenu.create(this, st::dialogsMenu);
_mainMenu->addAction(lang(lng_create_group_title), [] {
App::wnd()->onShowNewGroup();
}, &st::dialogsMenuNewGroup);
_mainMenu->addAction(lang(lng_create_channel_title), [] {
App::wnd()->onShowNewChannel();
}, &st::dialogsMenuNewChannel);
_mainMenu->addAction(lang(lng_menu_contacts), [] {
Ui::showLayer(new ContactsBox());
}, &st::dialogsMenuContacts);
_mainMenu->addAction(lang(lng_menu_settings), [] {
App::wnd()->showSettings();
}, &st::dialogsMenuSettings);
_mainMenu->addAction(lang(lng_settings_faq), [] {
QDesktopServices::openUrl(telegramFaqLink());
}, &st::dialogsMenuHelp);
}
updateMainMenuGeometry();
_mainMenu->showAnimated();
}
void DialogsWidget::searchMessages(const QString &query, PeerData *inPeer) {
if ((_filter.getLastText() != query) || (inPeer && inPeer != _searchInPeer && inPeer->migrateTo() != _searchInPeer)) {
if ((_filter->getLastText() != query) || (inPeer && inPeer != _searchInPeer && inPeer->migrateTo() != _searchInPeer)) {
if (inPeer) {
onCancelSearch();
_searchInPeer = inPeer->migrateTo() ? inPeer->migrateTo() : inPeer;
_searchInMigrated = _searchInPeer ? _searchInPeer->migrateFrom() : 0;
_inner.searchInPeer(_searchInPeer);
}
_filter.setText(query);
_filter.updatePlaceholder();
_filter->setText(query);
_filter->updatePlaceholder();
onFilterUpdate(true);
_searchTimer.stop();
onSearchMessages();
@@ -2371,17 +2371,15 @@ void DialogsWidget::onListScroll() {
void DialogsWidget::onFilterUpdate(bool force) {
if (_a_show.animating() && !force) return;
QString filterText = _filter.getLastText();
QString filterText = _filter->getLastText();
_inner.onFilterUpdate(filterText, force);
if (filterText.isEmpty()) {
_searchCache.clear();
_searchQueries.clear();
_searchQuery = QString();
_cancelSearch->hide();
_newGroup->show();
} else if (_cancelSearch->isHidden()) {
_cancelSearch->show();
_newGroup->hide();
}
if (filterText.size() < MinUsernameLength) {
_peopleCache.clear();
@@ -2399,8 +2397,8 @@ void DialogsWidget::searchInPeer(PeerData *peer) {
}
void DialogsWidget::onFilterCursorMoved(int from, int to) {
if (to < 0) to = _filter.cursorPosition();
QString t = _filter.getLastText();
if (to < 0) to = _filter->cursorPosition();
QString t = _filter->getLastText();
QStringRef r;
for (int start = to; start > 0;) {
--start;
@@ -2415,8 +2413,8 @@ void DialogsWidget::onFilterCursorMoved(int from, int to) {
}
void DialogsWidget::onCompleteHashtag(QString tag) {
QString t = _filter.getLastText(), r;
int cur = _filter.cursorPosition();
QString t = _filter->getLastText(), r;
int cur = _filter->cursorPosition();
for (int start = cur; start > 0;) {
--start;
if (t.size() <= start) break;
@@ -2427,8 +2425,8 @@ void DialogsWidget::onCompleteHashtag(QString tag) {
}
if (cur - start - 1 == tag.size() && cur < t.size() && t.at(cur) == ' ') ++cur;
r = t.mid(0, start + 1) + tag + ' ' + t.mid(cur);
_filter.setText(r);
_filter.setCursorPosition(start + 1 + tag.size() + 1);
_filter->setText(r);
_filter->setCursorPosition(start + 1 + tag.size() + 1);
onFilterUpdate(true);
return;
}
@@ -2436,22 +2434,23 @@ void DialogsWidget::onCompleteHashtag(QString tag) {
}
if (!t.at(start).isLetterOrNumber() && t.at(start) != '_') break;
}
_filter.setText(t.mid(0, cur) + '#' + tag + ' ' + t.mid(cur));
_filter.setCursorPosition(cur + 1 + tag.size() + 1);
_filter->setText(t.mid(0, cur) + '#' + tag + ' ' + t.mid(cur));
_filter->setCursorPosition(cur + 1 + tag.size() + 1);
onFilterUpdate(true);
}
void DialogsWidget::resizeEvent(QResizeEvent *e) {
int32 w = width();
_filter.setGeometry(st::dialogsPadding.x(), st::dialogsFilterPadding, w - 2 * st::dialogsPadding.x(), _filter.height());
_newGroup->move(w - _newGroup->width() - st::dialogsPadding.x(), _filter.y());
_addContact->move(w - _addContact->width() - st::dialogsPadding.x(), _filter.y());
_cancelSearch->move(w - _cancelSearch->width() - st::dialogsPadding.x(), _filter.y());
_scroll.move(0, _filter.height() + 2 * st::dialogsFilterPadding);
_filter->setGeometryToLeft(st::dialogsFilterPadding.x() * 2 + _mainMenuToggle->width(), st::dialogsFilterPadding.y(), w - 3 * st::dialogsFilterPadding.x() - _mainMenuToggle->width(), _filter->height());
_mainMenuToggle->moveToLeft(st::dialogsFilterPadding.x(), _filter->y());
_cancelSearch->moveToRight(st::dialogsFilterPadding.x(), _filter->y());
_scroll.move(0, _filter->height() + 2 * st::dialogsFilterPadding.y());
updateMainMenuGeometry();
int32 addToY = App::main() ? App::main()->contentScrollAddToY() : 0;
int32 newScrollY = _scroll.scrollTop() + addToY;
_scroll.resize(w, height() - _filter.y() - _filter.height() - st::dialogsFilterPadding - st::dialogsPadding.y());
_scroll.resize(w, height() - _filter->y() - _filter->height() - st::dialogsFilterPadding.y() - st::dialogsPadding.y());
if (addToY) {
_scroll.scrollToY(newScrollY);
} else {
@@ -2459,6 +2458,12 @@ void DialogsWidget::resizeEvent(QResizeEvent *e) {
}
}
void DialogsWidget::updateMainMenuGeometry() {
if (!_mainMenu) return;
_mainMenu->moveToLeft(st::dialogsMenuPosition.x(), st::dialogsMenuPosition.y());
}
void DialogsWidget::keyPressEvent(QKeyEvent *e) {
if (e->key() == Qt::Key_Escape) {
e->ignore();
@@ -2548,16 +2553,8 @@ Dialogs::IndexedList *DialogsWidget::dialogsList() {
return _inner.dialogsList();
}
void DialogsWidget::onAddContact() {
Ui::showLayer(new AddContactBox(), KeepOtherLayers);
}
void DialogsWidget::onNewGroup() {
Ui::showLayer(new NewGroupBox());
}
bool DialogsWidget::onCancelSearch() {
bool clearing = !_filter.getLastText().isEmpty();
bool clearing = !_filter->getLastText().isEmpty();
if (_searchRequest) {
MTP::cancel(_searchRequest);
_searchRequest = 0;
@@ -2571,8 +2568,8 @@ bool DialogsWidget::onCancelSearch() {
clearing = true;
}
_inner.clearFilter();
_filter.clear();
_filter.updatePlaceholder();
_filter->clear();
_filter->updatePlaceholder();
onFilterUpdate();
return clearing;
}
@@ -2590,8 +2587,8 @@ void DialogsWidget::onCancelSearchInPeer() {
_inner.searchInPeer(0);
}
_inner.clearFilter();
_filter.clear();
_filter.updatePlaceholder();
_filter->clear();
_filter->updatePlaceholder();
onFilterUpdate();
if (!Adaptive::OneColumn() && !App::main()->selectingPeer()) {
emit cancelled();