change GUI label to statusbar, imports/docs cleanup

This commit is contained in:
Xevion
2021-01-27 11:40:47 -06:00
parent 7410dbb01d
commit c51e573155
6 changed files with 124 additions and 112 deletions

View File

@@ -78,7 +78,6 @@ class Ui_ConnectionDialog(object):
self.connection_groupbox.setObjectName("connection_groupbox") self.connection_groupbox.setObjectName("connection_groupbox")
self.gridLayout_4 = QtWidgets.QGridLayout(self.connection_groupbox) self.gridLayout_4 = QtWidgets.QGridLayout(self.connection_groupbox)
self.gridLayout_4.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize) self.gridLayout_4.setSizeConstraint(QtWidgets.QLayout.SetMaximumSize)
self.gridLayout_4.setContentsMargins(-1, -1, -1, 0)
self.gridLayout_4.setObjectName("gridLayout_4") self.gridLayout_4.setObjectName("gridLayout_4")
self.nickname_layout = QtWidgets.QHBoxLayout() self.nickname_layout = QtWidgets.QHBoxLayout()
self.nickname_layout.setObjectName("nickname_layout") self.nickname_layout.setObjectName("nickname_layout")

View File

@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Form implementation generated from reading ui file '.\client\MainWindow.ui' # Form implementation generated from reading ui file '.\client\ui\MainWindow.ui'
# #
# Created by: PyQt5 UI code generator 5.15.2 # Created by: PyQt5 UI code generator 5.15.2
# #
@@ -14,7 +14,13 @@ from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow") MainWindow.setObjectName("MainWindow")
MainWindow.resize(800, 643) MainWindow.resize(800, 625)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
MainWindow.setSizePolicy(sizePolicy)
MainWindow.setMinimumSize(QtCore.QSize(0, 20))
self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget = QtWidgets.QWidget(MainWindow)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@@ -24,26 +30,12 @@ class Ui_MainWindow(object):
self.centralwidget.setObjectName("centralwidget") self.centralwidget.setObjectName("centralwidget")
self.gridLayout = QtWidgets.QGridLayout(self.centralwidget) self.gridLayout = QtWidgets.QGridLayout(self.centralwidget)
self.gridLayout.setObjectName("gridLayout") self.gridLayout.setObjectName("gridLayout")
self.messageBox = QtWidgets.QTextEdit(self.centralwidget) self.chat_history_label = QtWidgets.QLabel(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum) self.chat_history_label.setObjectName("chat_history_label")
sizePolicy.setHorizontalStretch(0) self.gridLayout.addWidget(self.chat_history_label, 0, 1, 1, 1)
sizePolicy.setVerticalStretch(0) self.connections_label = QtWidgets.QLabel(self.centralwidget)
sizePolicy.setHeightForWidth(self.messageBox.sizePolicy().hasHeightForWidth()) self.connections_label.setObjectName("connections_label")
self.messageBox.setSizePolicy(sizePolicy) self.gridLayout.addWidget(self.connections_label, 0, 2, 1, 1)
self.messageBox.setMaximumSize(QtCore.QSize(16777215, 80))
self.messageBox.setObjectName("messageBox")
self.gridLayout.addWidget(self.messageBox, 2, 1, 1, 2)
self.label = QtWidgets.QLabel(self.centralwidget)
self.label.setObjectName("label")
self.gridLayout.addWidget(self.label, 0, 2, 1, 1)
self.messageHistory = QtWidgets.QTextBrowser(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(5)
sizePolicy.setHeightForWidth(self.messageHistory.sizePolicy().hasHeightForWidth())
self.messageHistory.setSizePolicy(sizePolicy)
self.messageHistory.setObjectName("messageHistory")
self.gridLayout.addWidget(self.messageHistory, 1, 1, 1, 1)
self.connectionsList = QtWidgets.QListWidget(self.centralwidget) self.connectionsList = QtWidgets.QListWidget(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Expanding) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0) sizePolicy.setHorizontalStretch(0)
@@ -53,14 +45,23 @@ class Ui_MainWindow(object):
self.connectionsList.setMaximumSize(QtCore.QSize(200, 16777215)) self.connectionsList.setMaximumSize(QtCore.QSize(200, 16777215))
self.connectionsList.setObjectName("connectionsList") self.connectionsList.setObjectName("connectionsList")
self.gridLayout.addWidget(self.connectionsList, 1, 2, 1, 1) self.gridLayout.addWidget(self.connectionsList, 1, 2, 1, 1)
self.label_2 = QtWidgets.QLabel(self.centralwidget) self.messageBox = QtWidgets.QTextEdit(self.centralwidget)
self.label_2.setObjectName("label_2") sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Maximum)
self.gridLayout.addWidget(self.label_2, 0, 1, 1, 1) sizePolicy.setHorizontalStretch(0)
spacerItem = QtWidgets.QSpacerItem(100, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) sizePolicy.setVerticalStretch(0)
self.gridLayout.addItem(spacerItem, 3, 1, 1, 1) sizePolicy.setHeightForWidth(self.messageBox.sizePolicy().hasHeightForWidth())
self.data_stats = QtWidgets.QLabel(self.centralwidget) self.messageBox.setSizePolicy(sizePolicy)
self.data_stats.setObjectName("data_stats") self.messageBox.setMaximumSize(QtCore.QSize(16777215, 80))
self.gridLayout.addWidget(self.data_stats, 3, 2, 1, 1) self.messageBox.setObjectName("messageBox")
self.gridLayout.addWidget(self.messageBox, 2, 1, 1, 2)
self.messageHistory = QtWidgets.QTextBrowser(self.centralwidget)
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(5)
sizePolicy.setHeightForWidth(self.messageHistory.sizePolicy().hasHeightForWidth())
self.messageHistory.setSizePolicy(sizePolicy)
self.messageHistory.setObjectName("messageHistory")
self.gridLayout.addWidget(self.messageHistory, 1, 1, 1, 1)
MainWindow.setCentralWidget(self.centralwidget) MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26)) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 26))
@@ -68,6 +69,9 @@ class Ui_MainWindow(object):
self.menuFile = QtWidgets.QMenu(self.menubar) self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile") self.menuFile.setObjectName("menuFile")
MainWindow.setMenuBar(self.menubar) MainWindow.setMenuBar(self.menubar)
self.status_bar = QtWidgets.QStatusBar(MainWindow)
self.status_bar.setObjectName("status_bar")
MainWindow.setStatusBar(self.status_bar)
self.actionConnect_to = QtWidgets.QAction(MainWindow) self.actionConnect_to = QtWidgets.QAction(MainWindow)
self.actionConnect_to.setObjectName("actionConnect_to") self.actionConnect_to.setObjectName("actionConnect_to")
self.actionSave_chat_to = QtWidgets.QAction(MainWindow) self.actionSave_chat_to = QtWidgets.QAction(MainWindow)
@@ -85,9 +89,12 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "TCPChat")) MainWindow.setWindowTitle(_translate("MainWindow", "TCPChat"))
self.label.setText(_translate("MainWindow", "Connections")) self.chat_history_label.setText(_translate("MainWindow", "Chat History"))
self.label_2.setText(_translate("MainWindow", "Chat History")) self.connections_label.setText(_translate("MainWindow", "Connections"))
self.data_stats.setText(_translate("MainWindow", "0.00KB Sent, 0.00KB Received")) self.connectionsList.setStatusTip(_translate("MainWindow", "View and/or moderate all users connected to the server."))
self.messageBox.setStatusTip(_translate("MainWindow", "Type a message to send to the server."))
self.messageBox.setPlaceholderText(_translate("MainWindow", "Type your message here..."))
self.messageHistory.setStatusTip(_translate("MainWindow", "View all messages sent by the server and other users."))
self.menuFile.setTitle(_translate("MainWindow", "File")) self.menuFile.setTitle(_translate("MainWindow", "File"))
self.actionConnect_to.setText(_translate("MainWindow", "Connect to...")) self.actionConnect_to.setText(_translate("MainWindow", "Connect to..."))
self.actionSave_chat_to.setText(_translate("MainWindow", "Export chat...")) self.actionSave_chat_to.setText(_translate("MainWindow", "Export chat..."))

View File

@@ -1,9 +1,8 @@
import re import re
from typing import Tuple from typing import Tuple
from PyQt5 import QtCore, QtGui
from PyQt5.QtCore import QEvent from PyQt5.QtCore import QEvent
from PyQt5.QtWidgets import QDialog, QStatusBar, QWidget, QSpacerItem, QSizePolicy from PyQt5.QtWidgets import QDialog, QStatusBar
import constants import constants
from client.ConnectionDialog import Ui_ConnectionDialog from client.ConnectionDialog import Ui_ConnectionDialog

View File

@@ -1,17 +1,14 @@
import logging import logging
import socket import socket
from pprint import pprint from typing import List
from PyQt5.QtCore import Qt, QEvent, QTimer
from PyQt5.QtWidgets import QMainWindow
from PyQt5.QtCore import Qt, QEvent
from PyQt5.QtWidgets import QMainWindow, QLabel
from sortedcontainers import SortedList from sortedcontainers import SortedList
import constants import constants
import helpers import helpers
import re
from client.MainWindow import Ui_MainWindow from client.MainWindow import Ui_MainWindow
from client.dialog import NicknameDialog
from client.worker import ReceiveWorker from client.worker import ReceiveWorker
IP = '127.0.0.1' IP = '127.0.0.1'
@@ -44,12 +41,16 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.receiveThread.logs.connect(self.log) # Receiving logging messages from a thread self.receiveThread.logs.connect(self.log) # Receiving logging messages from a thread
self.receiveThread.data_stats.connect(self.count_stats) # Receiving data usage stats self.receiveThread.data_stats.connect(self.count_stats) # Receiving data usage stats
# TODO: Improve initial client/server data exchange # TODO: Improve initial client/server data exchange
self.receiveThread.sent_nick.connect(self._ready)
self.receiveThread.start() self.receiveThread.start()
self.messageBox.setPlaceholderText('Type your message here...') # Setup message box return key logic
self.messageBox.installEventFilter(self) self.messageBox.installEventFilter(self)
self.data_stats = QLabel("0.00KB Sent, 0.00KB Received")
self.data_stats.setAlignment(Qt.AlignVCenter)
self.status_bar.addPermanentWidget(self.data_stats)
# Variables for managing
self.messages = SortedList(key=lambda message: message['time']) self.messages = SortedList(key=lambda message: message['time'])
self.added_messages = [] self.added_messages = []
self.max_message_id = -1 self.max_message_id = -1
@@ -57,20 +58,22 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.sent, self.received = 0, 0 self.sent, self.received = 0, 0
def count_stats(self, sent: bool, change: int) -> None: def count_stats(self, sent: bool, change: int) -> None:
"""Handler for counting data statistics."""
if change != 0:
if sent: if sent:
self.sent += change self.sent += change
else: else:
self.received += change self.received += change
self.data_stats.setText(f'{helpers.sizeof_fmt(self.sent)} Sent, {helpers.sizeof_fmt(self.received)} Received') self.data_stats.setText(f'{helpers.sizeof_fmt(self.sent)} Sent, '
f'{helpers.sizeof_fmt(self. received)} Received')
def log(self, log_data: dict) -> None: @staticmethod
def log(log_data: dict) -> None:
"""Handler for data logging from a thread."""
logger.log(level=log_data['level'], msg=log_data['message'], exc_info=log_data['error']) logger.log(level=log_data['level'], msg=log_data['message'], exc_info=log_data['error'])
def _ready(self):
logger.debug('Nickname sent. Ready to communicate with server further...')
self.get_message_history()
def closeEvent(self, event): def closeEvent(self, event):
"""Handle closing by stopping the receive thread."""
self.receiveThread.stop() self.receiveThread.stop()
event.accept() # let the window close event.accept() # let the window close
@@ -89,14 +92,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def refresh_messages(self) -> None: def refresh_messages(self) -> None:
"""Completely refresh the chat box text.""" """Completely refresh the chat box text."""
scrollbar = self.messageHistory.verticalScrollBar() scrollbar = self.messageHistory.verticalScrollBar()
lastPosition = scrollbar.value() last_position = scrollbar.value()
atMaximum = lastPosition == scrollbar.maximum() at_maximum = last_position == scrollbar.maximum()
self.messageHistory.setText('<br>'.join( self.messageHistory.setText('<br>'.join(
msg['compiled'] for msg in self.messages msg['compiled'] for msg in self.messages
)) ))
scrollbar.setValue(scrollbar.maximum() if atMaximum else lastPosition) scrollbar.setValue(scrollbar.maximum() if at_maximum else last_position)
def send(self, data: bytes, **kwargs) -> None: def send(self, data: bytes, **kwargs) -> None:
self.count_stats(True, len(data)) self.count_stats(True, len(data))
@@ -129,15 +132,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
} }
)) ))
def get_message_history(self) -> None: def update_connections(self, users: List[dict]):
logger.info('Requesting message history') """Update the Connections List widget"""
self.send(helpers.prepare_json(
{
'type': constants.Types.REQUEST,
'request': constants.Requests.GET_MESSAGE_HISTORY
}
))
def update_connections(self, users):
self.connectionsList.clear() self.connectionsList.clear()
self.connectionsList.addItems([user['nickname'] for user in users]) self.connectionsList.addItems([user['nickname'] for user in users])

View File

@@ -17,5 +17,5 @@ def main(nickname: str = None):
if connect_dialog.connect_pressed: if connect_dialog.connect_pressed:
settings = connect_dialog.settings settings = connect_dialog.settings
m = MainWindow(settings.ip, settings.port, settings.nickname) window = MainWindow(settings.ip, settings.port, settings.nickname)
app.exec_() app.exec_()

View File

@@ -7,9 +7,21 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>800</width> <width>800</width>
<height>643</height> <height>625</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
<property name="windowTitle"> <property name="windowTitle">
<string>TCPChat</string> <string>TCPChat</string>
</property> </property>
@@ -21,39 +33,20 @@
</sizepolicy> </sizepolicy>
</property> </property>
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="2" column="1" colspan="2"> <item row="0" column="1">
<widget class="QTextEdit" name="messageBox"> <widget class="QLabel" name="chat_history_label">
<property name="sizePolicy"> <property name="text">
<sizepolicy hsizetype="Expanding" vsizetype="Maximum"> <string>Chat History</string>
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="maximumSize">
<size>
<width>16777215</width>
<height>80</height>
</size>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="2"> <item row="0" column="2">
<widget class="QLabel" name="label"> <widget class="QLabel" name="connections_label">
<property name="text"> <property name="text">
<string>Connections</string> <string>Connections</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1">
<widget class="QTextBrowser" name="messageHistory">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>5</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="2"> <item row="1" column="2">
<widget class="QListWidget" name="connectionsList"> <widget class="QListWidget" name="connectionsList">
<property name="sizePolicy"> <property name="sizePolicy">
@@ -68,32 +61,43 @@
<height>16777215</height> <height>16777215</height>
</size> </size>
</property> </property>
</widget> <property name="statusTip">
</item> <string>View and/or moderate all users connected to the server.</string>
<item row="0" column="1">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Chat History</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="3" column="1"> <item row="2" column="1" colspan="2">
<spacer name="horizontalSpacer"> <widget class="QTextEdit" name="messageBox">
<property name="orientation"> <property name="sizePolicy">
<enum>Qt::Horizontal</enum> <sizepolicy hsizetype="Expanding" vsizetype="Maximum">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="maximumSize">
<size> <size>
<width>100</width> <width>16777215</width>
<height>20</height> <height>80</height>
</size> </size>
</property> </property>
</spacer> <property name="statusTip">
<string>Type a message to send to the server.</string>
</property>
<property name="placeholderText">
<string>Type your message here...</string>
</property>
</widget>
</item> </item>
<item row="3" column="2"> <item row="1" column="1">
<widget class="QLabel" name="data_stats"> <widget class="QTextBrowser" name="messageHistory">
<property name="text"> <property name="sizePolicy">
<string>0.00KB Sent, 0.00KB Received</string> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>5</verstretch>
</sizepolicy>
</property>
<property name="statusTip">
<string>View all messages sent by the server and other users.</string>
</property> </property>
</widget> </widget>
</item> </item>
@@ -118,6 +122,14 @@
</widget> </widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
</widget> </widget>
<widget class="QStatusBar" name="status_bar">
<property name="minimumSize">
<size>
<width>0</width>
<height>20</height>
</size>
</property>
</widget>
<action name="actionConnect_to"> <action name="actionConnect_to">
<property name="text"> <property name="text">
<string>Connect to...</string> <string>Connect to...</string>