/
Shymer123
/
Messenger
Обзор
Документация
Войти
/
Shymer123
/
Messenger
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
UI_Client/SourceFiles/Ui/MainWindow.cpp
487 строк
16 KB
Shymer123
The code has been refactored, now there are no incomprehensible UserRole, etc.
19 май 2025, 13:22
19 май 2025, 13:22
f8b3525
Код
Авторство
О чём код?
#include "MainWindow.h" #include "DataModels/current_chat_data.h" #include "Processes/ContactsMenu/ContactsMenuProcess.h" #include "Ui/AddMembersMenu/AddMembersMenu.h" #include "DataModels/user_data.h" #include "Ui/Widgets/listViews/MessagesListView.h" #include "Ui/Widgets/listViews/ChatListView.h" #include "UiStateManager/UiStateManager.h" #include <QJsonObject> #include <QPainter> #include <QMouseEvent> #include <QPushButton> namespace Ui { MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent) { resize(1000, 800); setObjectName("main_client_window"); m_userID = UserData::instance().getID(); m_userName = UserData::instance().getUserName(); m_mainSplitter = new MainSplitter::MainSplitter(this); setCentralWidget(m_mainSplitter); setupOverlay(); setupNavigationMenu(); setupMainProcesses(); setupMainConnection(); m_chatProcesses->renderingChats(); } MainWindow::~MainWindow() {} void MainWindow::closeEvent(QCloseEvent* event) { m_chatProcesses->deleteLater(); deleteLater(); event->accept(); } void MainWindow::paintEvent(QPaintEvent* event) { Q_UNUSED(event); QStyleOption opt; opt.initFrom(this); QPainter p(this); style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); } void MainWindow::resizeEvent(QResizeEvent* event) { if(m_navigationMenu) { m_navigationMenu->updateGeometry(); } if(m_contactsMenu) { m_contactsMenu->updateGeometry(); ContactsMenu::AddContact* addContactWidget = m_contactsMenu->getAddContactWidget(); if(addContactWidget) { addContactWidget->updateGeometry(); } if(addContactWidget) { ContactsMenu::NotExistPhoneNumber* notExistPhoneNumberWidget = m_contactsMenu->getAddContactWidget() ->getNotExistPhoneNumberWidget(); if(notExistPhoneNumberWidget) { notExistPhoneNumberWidget->updateGeometry(); } } } if(m_groupMenu) { m_groupMenu->updateGeometry(); AddMembersMenu::AddMembersMenu* addMembersMenu = m_groupMenu->getAddMembersMenu(); if(addMembersMenu) { addMembersMenu->updateGeometry(); } } if(m_menuSendingFiles) { m_menuSendingFiles->updateGeometry(); } if(m_generalOverlay) { m_generalOverlay->resize(size()); } if(m_navigationMenuOverlay) { m_navigationMenuOverlay->resize(size()); } QMainWindow::resizeEvent(event); } void MainWindow::mousePressEvent(QMouseEvent* event) { if(m_navigationMenu && m_navigationMenu->isVisible() && !m_navigationMenu->geometry().contains(event->pos())) { m_navigationMenu->animateNavigationMenu(false); m_navigationMenuOverlay->hideOverlay(); } else if(m_contactsMenu && m_contactsMenu->isVisible() && !m_contactsMenu->geometry().contains(event->pos())) { m_contactsMenu->animateContactsMenu(false); connect(m_contactsMenu, &ContactsMenu::StartInterfaceContactsMenu::animatedFinishedSignal, this, [this]() { m_contactsMenu->deleteLater(); m_contactsMenu = nullptr; }); m_generalOverlay->hideOverlay(); } else if(m_groupMenu && m_groupMenu->isVisible() && !m_groupMenu->geometry().contains(event->pos())) { m_groupMenu->animateGroupMenu(false); connect(m_groupMenu, &GroupMenu::GroupMenu::animatedFinishedSignal, this, [this]() { m_groupMenu->deleteLater(); m_groupMenu = nullptr; }); m_generalOverlay->hideOverlay(); } else if(m_menuSendingFiles && m_menuSendingFiles->isVisible() && !m_menuSendingFiles->geometry().contains(event->pos())) { disconnect(m_menuSendingFiles, nullptr, m_chatProcesses, nullptr); disconnect(m_menuSendingFiles, nullptr, this, nullptr); disconnect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::destroyed, this, nullptr); connect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::destroyed, this, [this]() { m_menuSendingFiles = nullptr; }); m_menuSendingFiles->deleteLater(); m_generalOverlay->hideOverlay(); } if(m_contactsMenu) { ContactsMenu::AddContact* addContactWidget = m_contactsMenu->getAddContactWidget(); if(addContactWidget) { ContactsMenu::NotExistPhoneNumber* notExistPhoneNumberWidget = m_contactsMenu->getAddContactWidget() ->getNotExistPhoneNumberWidget(); if(notExistPhoneNumberWidget && notExistPhoneNumberWidget->isVisible() && !notExistPhoneNumberWidget->geometry().contains(event->pos())) { notExistPhoneNumberWidget->animateNotExistPhoneNumber(false); connect(notExistPhoneNumberWidget, &ContactsMenu::NotExistPhoneNumber::animatedFinishedSignal, this, [notExistPhoneNumberWidget, this, addContactWidget]() { notExistPhoneNumberWidget->deleteLater(); addContactWidget->deleteLater(); m_contactsMenu->deleteLater(); m_contactsMenu = nullptr; }); m_generalOverlay->hideOverlay(); } } if(addContactWidget && addContactWidget->isVisible() && !addContactWidget->geometry().contains(event->pos())) { addContactWidget->animateAddContact(false); connect(addContactWidget, &ContactsMenu::AddContact::animatedFinishedSignal, this, [addContactWidget, this]() { addContactWidget->deleteLater(); m_contactsMenu->deleteLater(); m_contactsMenu = nullptr; }); m_generalOverlay->hideOverlay(); } } if(m_groupMenu) { AddMembersMenu::AddMembersMenu* addMembersMenuWidget = m_groupMenu->getAddMembersMenu(); if(addMembersMenuWidget && addMembersMenuWidget->isVisible() && !addMembersMenuWidget->geometry().contains(event->pos())) { addMembersMenuWidget->animateAddMembersMenu(false); connect(addMembersMenuWidget, &AddMembersMenu::AddMembersMenu::animatedFinishedSignal, this, [addMembersMenuWidget, this]() { addMembersMenuWidget->deleteLater(); m_groupMenu->deleteLater(); m_groupMenu = nullptr; }); m_generalOverlay->hideOverlay(); } } QMainWindow::mousePressEvent(event); } void MainWindow::keyPressEvent(QKeyEvent* event) { int key = event->key(); UiStateManager& stateManager = UiStateManager::instance(); if((key == Qt::Key_Enter || key == Qt::Key_Return) && stateManager.isWidgetActive("chatAreaWidget")) { QPushButton* sendButton = m_mainSplitter->getChatArea()->getMessageInput()->getSendButton(); if(sendButton) { emit sendButton->clicked(); } return; } else if(key == Qt::Key_Escape && stateManager.isWidgetActive("chatAreaWidget")) { m_mainSplitter->changeChatOnWidget(); UserData::instance().resetChatInfo(); CurrentChatData::instance().resetFull(); QAbstractItemModel* model = m_mainSplitter->getChatArea()->getMessageArea() ->getMessageList()->model(); if(model) { delete model; } } QMainWindow::keyPressEvent(event); } void MainWindow::setupMainConnection() { QPushButton* menuButton = m_mainSplitter->getSideBar()->getMenuButton(); Widgets::ChatListView* chatList = m_mainSplitter->getSideBar()->getChatList(); QPushButton* openInfoPanelButton = m_mainSplitter->getChatArea()->getHeader()->getOpenInfoButton(); QPushButton* attachButton = m_mainSplitter->getChatArea()->getMessageInput()->getAttachButton(); QPushButton* sendButton = m_mainSplitter->getChatArea()->getMessageInput()->getSendButton(); connect(menuButton, &QPushButton::clicked, this, [this]() { m_navigationMenuOverlay->showOverlay(); m_navigationMenu->animateNavigationMenu(true); }); connect(chatList, &QAbstractItemView::clicked, this, [this](const QModelIndex& index) { m_mainSplitter->changeWidgetOnChat(); connect(this, &MainWindow::changeChatSignal, m_chatProcesses, &Processes::ChatProcess::onChangeChat, Qt::UniqueConnection); emit changeChatSignal(index); }); if(!m_infoPanelProcesses) { m_infoPanelProcesses = new Processes::InfoPanelProcess(this); m_mainSplitter->getChatArea()->setupInfoPanel(m_infoPanelProcesses); } connect(openInfoPanelButton, &QPushButton::clicked, this, [this]() { if(!m_infoPanelProcesses) return; if(UserData::instance().getChatType() == ChatTypes::Group) { if(m_infoPanelProcesses->getGroupInfoPanel()) { m_infoPanelProcesses->closePanel(InfoPanelType::GroupInfo); } else { m_infoPanelProcesses->openPanel(InfoPanelType::GroupInfo); } } else if(UserData::instance().getChatType() == ChatTypes::Dialog) { if(m_infoPanelProcesses->getUserInfoPanel()) { m_infoPanelProcesses->closePanel(InfoPanelType::UserInfo); } else { m_infoPanelProcesses->openPanel(InfoPanelType::UserInfo); } } }); connect(attachButton, &QPushButton::clicked, this, [this]() { disconnect(m_chatProcesses, &Processes::ChatProcess::attachmentFinished, this, nullptr); connect(m_chatProcesses, &Processes::ChatProcess::attachmentFinished, this, [this](const QStringList& filePaths) { m_menuSendingFiles = new ChatArea::ContextMenuSendingFiles(filePaths, this); m_menuSendingFiles->updateGeometry(); m_menuSendingFiles->show(); m_generalOverlay->showOverlay(); connect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::sendFile, m_chatProcesses, &Processes::ChatProcess::onClickedSendFilesButton); disconnect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::clickedCloseSignal, this, nullptr); connect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::clickedCloseSignal, this, [this]() { m_menuSendingFiles->close(); m_generalOverlay->hideOverlay(); m_menuSendingFiles->deleteLater(); }); disconnect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::destroyed, this, nullptr); connect(m_menuSendingFiles, &ChatArea::ContextMenuSendingFiles::destroyed, this, [this]() { m_menuSendingFiles = nullptr; }); }); m_chatProcesses->onClickedAttachButton(); }); connect(sendButton, &QPushButton::clicked, m_chatProcesses, &Processes::ChatProcess::onClickedSendButton); } void MainWindow::setupMainProcesses() { m_chatProcesses = Processes::ChatProcess::instance(m_chatIndex, m_chatID, m_chatName); m_chatProcesses->setChatList(m_mainSplitter->getSideBar()->getChatList()); m_chatProcesses->setChatArea(m_mainSplitter->getChatArea()); m_chatProcesses->setMessageList(m_mainSplitter->getChatArea()->getMessageArea()->getMessageList()); m_chatProcesses->setHeaderChatNameLabel(m_mainSplitter->getChatArea()->getHeader()->getChatNameLabel()); m_chatProcesses->setInputField(m_mainSplitter->getChatArea()->getMessageInput()->getInputField()); m_chatProcesses->setParentWidget(this); connect(m_chatProcesses, &Processes::ChatProcess::changeWidgetOnChat, m_mainSplitter, &MainSplitter::MainSplitter::changeWidgetOnChat); } void MainWindow::setupOverlay() { m_generalOverlay = new Overlay::GeneralOverlay(this); m_navigationMenuOverlay = new Overlay::NavigationMenuOverlay(this); } void MainWindow::setupNavigationMenu() { m_navigationMenu = new NavigationMenu::NavigationMenu(this); m_navigationMenu->setUserName(m_userName); connect(m_navigationMenu, &NavigationMenu::NavigationMenu::onClickedCreateGroupSignal, this, &MainWindow::onClickedCreateGroup); connect(m_navigationMenu, &NavigationMenu::NavigationMenu::onClickedContactsSignal, this, &MainWindow::onClickedContactsMenu); connect(m_navigationMenu, &NavigationMenu::NavigationMenu::onClickedFavouritesSignal, this, [this]() { m_navigationMenu->animateNavigationMenu(false); m_navigationMenuOverlay->hideOverlay(); m_mainSplitter->changeWidgetOnChat(); m_chatProcesses->onClickedFavouritesButton(); }); } void MainWindow::setupContactsMenu() { m_contactsMenu = new ContactsMenu::StartInterfaceContactsMenu(this); Processes::ContactsMenuProcess* contactsMenuProcesses = new Processes::ContactsMenuProcess(m_chatID, m_chatIndex, m_chatName); contactsMenuProcesses->setGeneralOverlay(m_generalOverlay); contactsMenuProcesses->setMainSplitter(m_mainSplitter); contactsMenuProcesses->setChatProcess(m_chatProcesses); contactsMenuProcesses->setStartInterfaceContactMenu(m_contactsMenu); m_contactsMenu->setContactsMenuProcess(contactsMenuProcesses); connect(m_contactsMenu, &QObject::destroyed, this, [this]() { m_contactsMenu = nullptr; }); connect(m_contactsMenu, &ContactsMenu::StartInterfaceContactsMenu::clickedCloseSignal, this, [this]() { if(m_contactsMenu->getAddContactWidget()) { if(m_contactsMenu->getAddContactWidget()->getNotExistPhoneNumberWidget()) { m_contactsMenu->getAddContactWidget()->getNotExistPhoneNumberWidget()->deleteLater(); } m_contactsMenu->getAddContactWidget()->deleteLater(); } m_contactsMenu->animateContactsMenu(false); connect(m_contactsMenu, &ContactsMenu::StartInterfaceContactsMenu::animatedFinishedSignal, this, [this]() { m_contactsMenu->deleteLater(); }); m_generalOverlay->hideOverlay(); }); } void MainWindow::setupGroupMenu() { m_groupMenu = new GroupMenu::GroupMenu(this); m_groupProcesses = new Processes::GroupProcess; m_groupProcesses->setGroupMenuWidget(m_groupMenu); m_groupProcesses->setGeneralOverlay(m_generalOverlay); m_groupMenu->setChatProcess(m_chatProcesses); m_groupMenu->setGroupMenuProcess(m_groupProcesses); connect(m_groupMenu, &QObject::destroyed, this, [this]() { m_groupMenu = nullptr; }); connect(m_groupProcesses, &QObject::destroyed, this, [this]() { m_groupProcesses = nullptr; }); connect(m_groupMenu, &GroupMenu::GroupMenu::clickedCloseSignal, this, [this]() { if(m_groupMenu->getAddMembersMenu()) { m_groupMenu->getAddMembersMenu()->deleteLater(); } m_groupMenu->animateGroupMenu(false); connect(m_groupMenu, &GroupMenu::GroupMenu::animatedFinishedSignal, this, [this]() { m_groupMenu->deleteLater(); m_groupProcesses->deleteLater(); }); m_generalOverlay->hideOverlay(); }); } void MainWindow::onClickedCreateGroup() { m_navigationMenuOverlay->hideOverlay(); m_navigationMenu->animateNavigationMenu(false); setupGroupMenu(); m_generalOverlay->showOverlay(); m_groupMenu->animateGroupMenu(true); } void MainWindow::onClickedContactsMenu() { m_navigationMenuOverlay->hideOverlay(); m_navigationMenu->animateNavigationMenu(false); setupContactsMenu(); m_generalOverlay->showOverlay(); m_contactsMenu->animateContactsMenu(true); } } // namespace Ui