Source code for aiogbclient.ui.windows

import time
from PyQt5 import QtCore, QtWidgets

from aiogbclient.ui.login_ui import Ui_Login_Dialog as login_ui_class
from aiogbclient.ui.contacts_ui import Ui_ContactsWindow as contacts_ui_class
from aiogbclient.ui.chat_ui import Ui_ChatMainWindow as chat_ui_class
# pyuic5 -x login.ui -o login_ui.py  # update UI file


[docs]class LoginWindow(QtWidgets.QDialog): """Login Window (user interface)""" def __init__(self, auth_instance=None, parent=None): """ :param auth_instance: instance of client.client_proto.ClientAuth :param parent: default None """ super().__init__(parent) self.username = None self.password = None self.auth_instance = auth_instance self.ui = login_ui_class() self.ui.setupUi(self)
[docs] def on_login_btn_pressed(self): """ Slot, which is using when login button is pressed (syntactic sugar for slot connecting: login_btn.pressed.connect(self.press)) """ self.username = self.ui.username_text.text() self.password = self.ui.password_text.text() self.auth_instance.username = self.username self.auth_instance.password = self.password is_auth = self.auth_instance.authenticate() if is_auth: self.accept() print('{} logged in'.format(self.username)) else: self.ui.username_text.clear() self.ui.password_text.clear()
QtWidgets.QMessageBox.warning(self, 'Error', 'Bad user or password')
[docs]class ContactsWindow(QtWidgets.QMainWindow): """Contacts Window (user interface)""" def __init__(self, client_instance, user_name=None, parent=None): """ :param client_instance: instance of client.client_proto.ChatClientProtocol :param user_name: client's username :param chat_ins: instance of ChatWindow :param parent: """ super().__init__(parent) self.client_instance = client_instance self.username = user_name self.chat_ins = None self.ui = contacts_ui_class() self.ui.setupUi(self) self.ui.actionExit.triggered.connect(self.actionExit) self.after_start()
[docs] def keyPressEvent(self, event): """Events after pressing key buttons""" if event.key() == QtCore.Qt.Key_Enter: # here accept the event and do something self.on_add_new_contact_btn_pressed() event.accept() else:
event.ignore()
[docs] def after_start(self): """do appropriate things after starting the App"""
self.update_contacts(self.username) # update list
[docs] def update_contacts(self, client_username): """Update of contacts list""" contacts = self.client_instance.get_contacts(client_username) self.ui.all_contacts.clear()
self.ui.all_contacts.addItems([contact.contact.username for contact in contacts])
[docs] def on_add_new_contact_btn_pressed(self): """Event, which is triggered after new contact button is clicked""" contact_username = self.ui.new_contact_name.text() if contact_username: _resp = self.client_instance.add_contact(self.username, contact_username) if not _resp: # если контакт успешно добавлен self.update_contacts(self.username) self.ui.new_contact_name.clear() else: print(_resp) else:
QtWidgets.QMessageBox.warning(self, 'Error', 'wrong Name')
[docs] def on_delete_contact_btn_pressed(self): """Event, which is triggered after delete contact button is clicked""" try: selected_contact = self.ui.all_contacts.currentItem().text() _resp = self.client_instance.del_contact(self.username, selected_contact) if not _resp: # контакт успешно удален self.update_contacts(self.username) else: print(_resp) except AttributeError:
QtWidgets.QMessageBox.warning(self, 'Error', 'Please pick the contact')
[docs] def on_all_contacts_itemDoubleClicked(self): """Event, when double clicked to item from contact list, ChatWindow will be appeared""" chat_wnd = ChatWindow(self)
chat_wnd.show()
[docs] def actionExit(self): """Exit button, from file menu""" print('exit')
self.close()
[docs]class ChatWindow(QtWidgets.QMainWindow): """Chat Window (user interface)""" def __init__(self, parent=None): super().__init__(parent) self.ui = chat_ui_class() self.ui.setupUi(self) self.parent_window = parent # bind parent's window attributes self.after_start()
[docs] def after_start(self): """do appropriate things after starting this window""" self.contact_username = self.parent_window.ui.all_contacts.currentItem().text() self.username = self.parent_window.username self.client_instance = self.parent_window.client_instance self.parent_window.chat_ins = self.update_chat
self.update_chat()
[docs] def keyPressEvent(self, event): """Events after pressing key buttons""" if event.key() == QtCore.Qt.Key_Enter: # here accept the event and do something self.on_send_btn_pressed() event.accept() elif event.key() == QtCore.Qt.Key_Escape: self.close() else:
event.ignore()
[docs] def update_chat(self, quantity=20): """Receive client's messages from Database :param quantity: how many messages we want to show """ #print('update chat for {}'.format(self.username)) self.ui.chat_window.clear() client_msgs = [c for c in self.client_instance.get_client_messages(self.username) if c.contact.username == self.contact_username] contact_msgs = [c for c in self.client_instance.get_client_messages(self.contact_username) if c.contact.username == self.username] msgs = sorted(client_msgs + contact_msgs, key=lambda x: x.time) # all messages between client and contact for msg in msgs[-quantity:]: # show last 20 messages sender = msg.client.username if msg.client.username == self.username: sender = 'me' self.ui.chat_window.addItem('{} from {}: {}'.format(msg.time.strftime("%Y-%m-%d %H:%M:%S"),
sender, msg.message))
[docs] def on_send_btn_pressed(self): """After send button clicked, send message to the server and update chat window""" msg = self.ui.send_text.text() if msg: self.client_instance.send_msg(to_user=self.contact_username, content=msg) time.sleep(0.1) self.update_chat()
self.ui.send_text.clear()