toxygen/toxygen/mainscreen.py

725 lines
34 KiB
Python
Raw Normal View History

2016-02-23 21:26:37 +01:00
from menu import *
2016-07-06 15:25:04 +02:00
from profile import *
from list_items import *
2017-04-13 18:22:46 +02:00
from widgets import MultilineEdit, ComboBox
2016-05-28 12:06:13 +02:00
import plugin_support
2016-06-13 23:32:45 +02:00
from mainscreen_widgets import *
2016-08-05 14:58:25 +02:00
import settings
2016-11-20 12:12:27 +01:00
import platform
2017-02-11 18:07:28 +01:00
import toxes
2016-06-06 20:18:32 +02:00
2016-03-05 13:44:52 +01:00
2017-04-11 20:10:03 +02:00
class MainWindow(QtWidgets.QMainWindow, Singleton):
2016-02-17 21:47:43 +01:00
2016-06-03 12:48:41 +02:00
def __init__(self, tox, reset, tray):
2016-07-19 22:19:42 +02:00
super().__init__()
Singleton.__init__(self)
2016-03-15 18:05:19 +01:00
self.reset = reset
2016-06-03 12:48:41 +02:00
self.tray = tray
2016-06-06 20:18:32 +02:00
self.setAcceptDrops(True)
2016-03-15 18:05:19 +01:00
self.initUI(tox)
2016-10-01 22:06:15 +02:00
self._saved = False
2016-07-04 22:30:45 +02:00
if settings.Settings.get_instance()['show_welcome_screen']:
self.ws = WelcomeScreen()
2016-02-17 21:47:43 +01:00
2016-11-05 11:03:47 +01:00
def setup_menu(self, Form):
2017-04-11 20:10:03 +02:00
box = QtWidgets.QHBoxLayout()
2016-11-05 11:03:47 +01:00
box.setContentsMargins(0, 0, 0, 0)
box.setAlignment(QtCore.Qt.AlignLeft)
self.profile_button = MainMenuButton(Form)
box.addWidget(self.profile_button)
self.settings_button = MainMenuButton(Form)
box.addWidget(self.settings_button)
self.plugins_button = MainMenuButton(Form)
box.addWidget(self.plugins_button)
self.about_button = MainMenuButton(Form)
box.addWidget(self.about_button)
box.setSpacing(0)
2017-04-11 20:10:03 +02:00
self.menuProfile = QtWidgets.QMenu()
self.menuProfile.setObjectName("menuProfile")
2017-04-11 20:10:03 +02:00
self.menuSettings = QtWidgets.QMenu()
self.menuSettings.setObjectName("menuSettings")
2017-04-11 20:10:03 +02:00
self.menuPlugins = QtWidgets.QMenu()
2016-05-28 12:06:13 +02:00
self.menuPlugins.setObjectName("menuPlugins")
2017-04-11 20:10:03 +02:00
self.menuAbout = QtWidgets.QMenu()
self.menuAbout.setObjectName("menuAbout")
2016-05-28 12:06:13 +02:00
2017-04-11 20:10:03 +02:00
self.actionAdd_friend = QtWidgets.QAction(Form)
self.actionAdd_friend.setObjectName("actionAdd_friend")
2017-04-11 20:10:03 +02:00
self.actionprofilesettings = QtWidgets.QAction(Form)
2016-07-06 15:25:04 +02:00
self.actionprofilesettings.setObjectName("actionprofilesettings")
2017-04-11 20:10:03 +02:00
self.actionPrivacy_settings = QtWidgets.QAction(Form)
self.actionPrivacy_settings.setObjectName("actionPrivacy_settings")
2017-04-11 20:10:03 +02:00
self.actionInterface_settings = QtWidgets.QAction(Form)
self.actionInterface_settings.setObjectName("actionInterface_settings")
2017-04-11 20:10:03 +02:00
self.actionNotifications = QtWidgets.QAction(Form)
self.actionNotifications.setObjectName("actionNotifications")
2017-04-11 20:10:03 +02:00
self.actionNetwork = QtWidgets.QAction(Form)
self.actionNetwork.setObjectName("actionNetwork")
2017-04-11 20:10:03 +02:00
self.actionAbout_program = QtWidgets.QAction(Form)
self.actionAbout_program.setObjectName("actionAbout_program")
2017-04-11 20:10:03 +02:00
self.updateSettings = QtWidgets.QAction(Form)
self.actionSettings = QtWidgets.QAction(Form)
self.actionSettings.setObjectName("actionSettings")
2017-04-11 20:10:03 +02:00
self.audioSettings = QtWidgets.QAction(Form)
self.pluginData = QtWidgets.QAction(Form)
self.importPlugin = QtWidgets.QAction(Form)
self.reloadPlugins = QtWidgets.QAction(Form)
self.lockApp = QtWidgets.QAction(Form)
self.menuProfile.addAction(self.actionAdd_friend)
self.menuProfile.addAction(self.actionSettings)
2016-07-02 14:40:06 +02:00
self.menuProfile.addAction(self.lockApp)
self.menuSettings.addAction(self.actionPrivacy_settings)
self.menuSettings.addAction(self.actionInterface_settings)
self.menuSettings.addAction(self.actionNotifications)
self.menuSettings.addAction(self.actionNetwork)
2016-04-24 12:45:11 +02:00
self.menuSettings.addAction(self.audioSettings)
self.menuSettings.addAction(self.updateSettings)
2016-05-28 12:06:13 +02:00
self.menuPlugins.addAction(self.pluginData)
2016-07-07 12:54:02 +02:00
self.menuPlugins.addAction(self.importPlugin)
2017-03-15 21:17:38 +01:00
self.menuPlugins.addAction(self.reloadPlugins)
self.menuAbout.addAction(self.actionAbout_program)
2016-11-05 11:03:47 +01:00
self.profile_button.setMenu(self.menuProfile)
self.settings_button.setMenu(self.menuSettings)
self.plugins_button.setMenu(self.menuPlugins)
self.about_button.setMenu(self.menuAbout)
2016-02-23 21:26:37 +01:00
self.actionAbout_program.triggered.connect(self.about_program)
self.actionNetwork.triggered.connect(self.network_settings)
self.actionAdd_friend.triggered.connect(self.add_contact)
2016-07-28 22:00:04 +02:00
self.actionSettings.triggered.connect(self.profile_settings)
2016-02-23 21:26:37 +01:00
self.actionPrivacy_settings.triggered.connect(self.privacy_settings)
self.actionInterface_settings.triggered.connect(self.interface_settings)
self.actionNotifications.triggered.connect(self.notification_settings)
2016-04-24 12:45:11 +02:00
self.audioSettings.triggered.connect(self.audio_settings)
self.updateSettings.triggered.connect(self.update_settings)
2016-05-28 12:06:13 +02:00
self.pluginData.triggered.connect(self.plugins_menu)
2016-07-02 14:40:06 +02:00
self.lockApp.triggered.connect(self.lock_app)
2016-07-07 12:54:02 +02:00
self.importPlugin.triggered.connect(self.import_plugin)
2017-03-15 21:17:38 +01:00
self.reloadPlugins.triggered.connect(self.reload_plugins)
2016-11-05 11:03:47 +01:00
Form.setLayout(box)
QtCore.QMetaObject.connectSlotsByName(Form)
2016-04-04 11:20:32 +02:00
def languageChange(self, *args, **kwargs):
self.retranslateUi()
2016-02-23 21:26:37 +01:00
2016-06-03 12:48:41 +02:00
def event(self, event):
if event.type() == QtCore.QEvent.WindowActivate:
self.tray.setIcon(QtGui.QIcon(curr_directory() + '/images/icon.png'))
2016-08-01 14:26:11 +02:00
self.messages.repaint()
2016-06-03 12:48:41 +02:00
return super(MainWindow, self).event(event)
2016-04-04 11:20:32 +02:00
def retranslateUi(self):
2017-04-11 20:10:03 +02:00
self.lockApp.setText(QtWidgets.QApplication.translate("MainWindow", "Lock"))
self.plugins_button.setText(QtWidgets.QApplication.translate("MainWindow", "Plugins"))
self.pluginData.setText(QtWidgets.QApplication.translate("MainWindow", "List of plugins"))
self.profile_button.setText(QtWidgets.QApplication.translate("MainWindow", "Profile"))
self.settings_button.setText(QtWidgets.QApplication.translate("MainWindow", "Settings"))
self.about_button.setText(QtWidgets.QApplication.translate("MainWindow", "About"))
self.actionAdd_friend.setText(QtWidgets.QApplication.translate("MainWindow", "Add contact"))
self.actionprofilesettings.setText(QtWidgets.QApplication.translate("MainWindow", "Profile"))
self.actionPrivacy_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Privacy"))
self.actionInterface_settings.setText(QtWidgets.QApplication.translate("MainWindow", "Interface"))
self.actionNotifications.setText(QtWidgets.QApplication.translate("MainWindow", "Notifications"))
self.actionNetwork.setText(QtWidgets.QApplication.translate("MainWindow", "Network"))
self.actionAbout_program.setText(QtWidgets.QApplication.translate("MainWindow", "About program"))
self.actionSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Settings"))
self.audioSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Audio"))
self.updateSettings.setText(QtWidgets.QApplication.translate("MainWindow", "Updates"))
self.contact_name.setPlaceholderText(QtWidgets.QApplication.translate("MainWindow", "Search"))
self.sendMessageButton.setToolTip(QtWidgets.QApplication.translate("MainWindow", "Send message"))
self.callButton.setToolTip(QtWidgets.QApplication.translate("MainWindow", "Start audio call with friend"))
2016-05-18 23:38:21 +02:00
self.online_contacts.clear()
2017-04-11 20:10:03 +02:00
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "All"))
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online"))
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first"))
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Name"))
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online and by name"))
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first and by name"))
2016-10-30 16:13:12 +01:00
ind = Settings.get_instance()['sorting']
d = {0: 0, 1: 1, 2: 2, 3: 4, 1 | 4: 4, 2 | 4: 5}
self.online_contacts.setCurrentIndex(d[ind])
2017-04-11 20:10:03 +02:00
self.importPlugin.setText(QtWidgets.QApplication.translate("MainWindow", "Import plugin"))
self.reloadPlugins.setText(QtWidgets.QApplication.translate("MainWindow", "Reload plugins"))
2016-02-18 15:02:00 +01:00
def setup_right_bottom(self, Form):
2016-05-18 23:38:21 +02:00
Form.resize(650, 60)
2016-03-05 13:44:52 +01:00
self.messageEdit = MessageArea(Form, self)
2016-05-18 23:38:21 +02:00
self.messageEdit.setGeometry(QtCore.QRect(0, 3, 450, 55))
2016-02-18 15:02:00 +01:00
self.messageEdit.setObjectName("messageEdit")
2016-05-18 23:38:21 +02:00
font = QtGui.QFont()
2016-08-08 13:07:18 +02:00
font.setPointSize(11)
2016-08-05 14:58:25 +02:00
font.setFamily(settings.Settings.get_instance()['font'])
2016-05-18 23:38:21 +02:00
self.messageEdit.setFont(font)
2017-04-11 20:10:03 +02:00
self.sendMessageButton = QtWidgets.QPushButton(Form)
2016-05-18 23:38:21 +02:00
self.sendMessageButton.setGeometry(QtCore.QRect(565, 3, 60, 55))
2016-02-18 15:02:00 +01:00
self.sendMessageButton.setObjectName("sendMessageButton")
2016-06-14 20:47:03 +02:00
self.menuButton = MenuButton(Form, self.show_menu)
self.menuButton.setGeometry(QtCore.QRect(QtCore.QRect(455, 3, 55, 55)))
2016-06-11 23:40:58 +02:00
pixmap = QtGui.QPixmap('send.png')
icon = QtGui.QIcon(pixmap)
self.sendMessageButton.setIcon(icon)
2016-05-02 17:27:46 +02:00
self.sendMessageButton.setIconSize(QtCore.QSize(45, 60))
2016-06-14 20:47:03 +02:00
pixmap = QtGui.QPixmap('menu.png')
icon = QtGui.QIcon(pixmap)
2016-06-14 20:47:03 +02:00
self.menuButton.setIcon(icon)
self.menuButton.setIconSize(QtCore.QSize(40, 40))
self.sendMessageButton.clicked.connect(self.send_message)
2016-02-18 15:02:00 +01:00
QtCore.QMetaObject.connectSlotsByName(Form)
2016-05-18 23:38:21 +02:00
def setup_left_center_menu(self, Form):
Form.resize(270, 25)
2017-04-11 20:10:03 +02:00
self.search_label = QtWidgets.QLabel(Form)
self.search_label.setGeometry(QtCore.QRect(3, 2, 20, 20))
pixmap = QtGui.QPixmap()
2016-05-18 23:38:21 +02:00
pixmap.load(curr_directory() + '/images/search.png')
self.search_label.setScaledContents(False)
self.search_label.setPixmap(pixmap)
2016-05-18 23:38:21 +02:00
self.contact_name = LineEdit(Form)
self.contact_name.setGeometry(QtCore.QRect(0, 0, 150, 25))
2016-03-02 21:55:12 +01:00
self.contact_name.setObjectName("contact_name")
self.contact_name.textChanged.connect(self.filtering)
2016-10-30 16:13:12 +01:00
self.online_contacts = ComboBox(Form)
2016-05-18 23:38:21 +02:00
self.online_contacts.setGeometry(QtCore.QRect(150, 0, 120, 25))
self.online_contacts.activated[int].connect(lambda x: self.filtering())
self.search_label.raise_()
2016-05-18 23:38:21 +02:00
2016-02-18 15:02:00 +01:00
QtCore.QMetaObject.connectSlotsByName(Form)
2016-02-17 21:47:43 +01:00
def setup_left_top(self, Form):
2016-03-11 12:37:45 +01:00
Form.setCursor(QtCore.Qt.PointingHandCursor)
2016-11-05 11:03:47 +01:00
Form.setMinimumSize(QtCore.QSize(270, 75))
Form.setMaximumSize(QtCore.QSize(270, 75))
Form.setBaseSize(QtCore.QSize(270, 75))
2017-04-11 20:10:03 +02:00
self.avatar_label = Form.avatar_label = QtWidgets.QLabel(Form)
2016-11-05 11:03:47 +01:00
self.avatar_label.setGeometry(QtCore.QRect(5, 5, 64, 64))
2016-08-04 17:23:47 +02:00
self.avatar_label.setScaledContents(False)
2016-07-13 20:30:51 +02:00
self.avatar_label.setAlignment(QtCore.Qt.AlignCenter)
self.name = Form.name = DataLabel(Form)
2016-11-05 11:03:47 +01:00
Form.name.setGeometry(QtCore.QRect(75, 15, 150, 25))
2016-02-17 21:47:43 +01:00
font = QtGui.QFont()
2016-08-05 14:58:25 +02:00
font.setFamily(settings.Settings.get_instance()['font'])
font.setPointSize(14)
2016-02-17 21:47:43 +01:00
font.setBold(True)
Form.name.setFont(font)
Form.name.setObjectName("name")
self.status_message = Form.status_message = DataLabel(Form)
2016-11-05 11:03:47 +01:00
Form.status_message.setGeometry(QtCore.QRect(75, 35, 170, 25))
font.setPointSize(12)
2016-02-17 21:47:43 +01:00
font.setBold(False)
Form.status_message.setFont(font)
Form.status_message.setObjectName("status_message")
2016-06-13 18:28:17 +02:00
self.connection_status = Form.connection_status = StatusCircle(Form)
2016-11-05 11:03:47 +01:00
Form.connection_status.setGeometry(QtCore.QRect(230, 10, 32, 32))
2016-07-28 22:00:04 +02:00
self.avatar_label.mouseReleaseEvent = self.profile_settings
self.status_message.mouseReleaseEvent = self.profile_settings
self.name.mouseReleaseEvent = self.profile_settings
2016-03-11 12:37:45 +01:00
self.connection_status.raise_()
Form.connection_status.setObjectName("connection_status")
2016-02-23 13:07:15 +01:00
2016-02-18 15:02:00 +01:00
def setup_right_top(self, Form):
2016-11-05 11:03:47 +01:00
Form.resize(650, 75)
2017-04-11 20:10:03 +02:00
self.account_avatar = QtWidgets.QLabel(Form)
2016-11-05 11:03:47 +01:00
self.account_avatar.setGeometry(QtCore.QRect(10, 5, 64, 64))
2016-08-04 17:23:47 +02:00
self.account_avatar.setScaledContents(False)
self.account_name = DataLabel(Form)
2016-11-05 11:03:47 +01:00
self.account_name.setGeometry(QtCore.QRect(100, 0, 400, 25))
2016-04-28 19:06:02 +02:00
self.account_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse)
2016-02-18 15:02:00 +01:00
font = QtGui.QFont()
2016-08-05 14:58:25 +02:00
font.setFamily(settings.Settings.get_instance()['font'])
font.setPointSize(14)
2016-02-18 15:02:00 +01:00
font.setBold(True)
self.account_name.setFont(font)
self.account_name.setObjectName("account_name")
self.account_status = DataLabel(Form)
2016-11-05 11:03:47 +01:00
self.account_status.setGeometry(QtCore.QRect(100, 20, 400, 25))
2016-04-28 19:06:02 +02:00
self.account_status.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse)
font.setPointSize(12)
2016-02-18 15:02:00 +01:00
font.setBold(False)
self.account_status.setFont(font)
self.account_status.setObjectName("account_status")
2017-04-11 20:10:03 +02:00
self.callButton = QtWidgets.QPushButton(Form)
2016-11-05 11:03:47 +01:00
self.callButton.setGeometry(QtCore.QRect(550, 5, 50, 50))
2016-02-18 15:02:00 +01:00
self.callButton.setObjectName("callButton")
2016-06-07 21:43:25 +02:00
self.callButton.clicked.connect(lambda: self.profile.call_click(True))
2017-04-11 20:10:03 +02:00
self.videocallButton = QtWidgets.QPushButton(Form)
2016-11-05 11:03:47 +01:00
self.videocallButton.setGeometry(QtCore.QRect(550, 5, 50, 50))
2016-06-07 21:43:25 +02:00
self.videocallButton.setObjectName("videocallButton")
self.videocallButton.clicked.connect(lambda: self.profile.call_click(True, True))
2016-04-24 12:45:11 +02:00
self.update_call_state('call')
2017-04-11 20:10:03 +02:00
self.typing = QtWidgets.QLabel(Form)
2016-11-05 11:03:47 +01:00
self.typing.setGeometry(QtCore.QRect(500, 25, 50, 30))
2016-04-27 20:10:53 +02:00
pixmap = QtGui.QPixmap(QtCore.QSize(50, 30))
2016-06-14 20:47:03 +02:00
pixmap.load(curr_directory() + '/images/typing.png')
2016-04-27 20:10:53 +02:00
self.typing.setScaledContents(False)
self.typing.setPixmap(pixmap.scaled(50, 30, QtCore.Qt.KeepAspectRatio))
self.typing.setVisible(False)
2016-02-18 15:02:00 +01:00
QtCore.QMetaObject.connectSlotsByName(Form)
2016-02-17 21:47:43 +01:00
2016-03-09 19:45:38 +01:00
def setup_left_center(self, widget):
2017-04-11 20:10:03 +02:00
self.friends_list = QtWidgets.QListWidget(widget)
2016-03-24 19:52:27 +01:00
self.friends_list.setObjectName("friends_list")
2016-03-30 19:33:42 +02:00
self.friends_list.setGeometry(0, 0, 270, 310)
2016-02-25 21:40:00 +01:00
self.friends_list.clicked.connect(self.friend_click)
self.friends_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
2017-04-11 20:10:03 +02:00
self.friends_list.customContextMenuRequested.connect(self.friend_right_click)
self.friends_list.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
2016-10-30 16:13:12 +01:00
self.friends_list.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.friends_list.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
2016-11-05 22:08:01 +01:00
self.friends_list.verticalScrollBar().setContextMenuPolicy(QtCore.Qt.NoContextMenu)
2016-02-25 21:40:00 +01:00
2016-02-26 19:54:15 +01:00
def setup_right_center(self, widget):
2017-04-11 20:10:03 +02:00
self.messages = QtWidgets.QListWidget(widget)
2016-05-02 17:27:46 +02:00
self.messages.setGeometry(0, 0, 620, 310)
self.messages.setObjectName("messages")
self.messages.setSpacing(1)
2016-04-20 11:32:28 +02:00
self.messages.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)
self.messages.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
2016-08-08 21:11:43 +02:00
self.messages.focusOutEvent = lambda event: self.messages.clearSelection()
2016-11-05 22:08:01 +01:00
self.messages.verticalScrollBar().setContextMenuPolicy(QtCore.Qt.NoContextMenu)
2016-03-24 22:15:07 +01:00
def load(pos):
if not pos:
self.profile.load_history()
self.messages.verticalScrollBar().setValue(1)
self.messages.verticalScrollBar().valueChanged.connect(load)
2017-04-11 20:10:03 +02:00
self.messages.setVerticalScrollMode(QtWidgets.QAbstractItemView.ScrollPerPixel)
self.messages.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection)
2016-02-26 19:54:15 +01:00
2016-03-15 18:05:19 +01:00
def initUI(self, tox):
2016-03-30 19:33:42 +02:00
self.setMinimumSize(920, 500)
s = Settings.get_instance()
self.setGeometry(s['x'], s['y'], s['width'], s['height'])
2016-02-25 21:40:00 +01:00
self.setWindowTitle('Toxygen')
2016-05-12 19:45:01 +02:00
os.chdir(curr_directory() + '/images/')
2017-04-11 20:10:03 +02:00
menu = QtWidgets.QWidget()
main = QtWidgets.QWidget()
grid = QtWidgets.QGridLayout()
search = QtWidgets.QWidget()
name = QtWidgets.QWidget()
info = QtWidgets.QWidget()
main_list = QtWidgets.QWidget()
messages = QtWidgets.QWidget()
message_buttons = QtWidgets.QWidget()
2016-06-16 11:29:45 +02:00
self.setup_left_center_menu(search)
self.setup_left_top(name)
self.setup_right_center(messages)
self.setup_right_top(info)
self.setup_right_bottom(message_buttons)
self.setup_left_center(main_list)
2016-11-05 11:03:47 +01:00
self.setup_menu(menu)
2016-06-11 23:40:58 +02:00
if not Settings.get_instance()['mirror_mode']:
2016-11-05 11:03:47 +01:00
grid.addWidget(search, 2, 0)
grid.addWidget(name, 1, 0)
grid.addWidget(messages, 2, 1, 2, 1)
grid.addWidget(info, 1, 1)
grid.addWidget(message_buttons, 4, 1)
grid.addWidget(main_list, 3, 0, 2, 1)
2016-06-11 23:40:58 +02:00
grid.setColumnMinimumWidth(1, 500)
grid.setColumnMinimumWidth(0, 270)
else:
2016-11-05 11:03:47 +01:00
grid.addWidget(search, 2, 1)
grid.addWidget(name, 1, 1)
grid.addWidget(messages, 2, 0, 2, 1)
grid.addWidget(info, 1, 0)
grid.addWidget(message_buttons, 4, 0)
grid.addWidget(main_list, 3, 1, 2, 1)
2016-06-11 23:40:58 +02:00
grid.setColumnMinimumWidth(0, 500)
grid.setColumnMinimumWidth(1, 270)
2016-11-05 11:03:47 +01:00
grid.addWidget(menu, 0, 0, 1, 2)
grid.setSpacing(0)
grid.setContentsMargins(0, 0, 0, 0)
2016-11-05 11:03:47 +01:00
grid.setRowMinimumHeight(0, 25)
grid.setRowMinimumHeight(1, 75)
grid.setRowMinimumHeight(2, 25)
grid.setRowMinimumHeight(3, 320)
grid.setRowMinimumHeight(4, 55)
2016-05-02 17:27:46 +02:00
grid.setColumnStretch(1, 1)
2016-11-05 11:03:47 +01:00
grid.setRowStretch(3, 1)
main.setLayout(grid)
self.setCentralWidget(main)
2016-05-18 23:38:21 +02:00
self.messageEdit.setFocus()
2016-03-09 19:11:36 +01:00
self.user_info = name
self.friend_info = info
2016-04-04 11:20:32 +02:00
self.retranslateUi()
2016-05-18 23:38:21 +02:00
self.profile = Profile(tox, self)
2016-02-17 21:47:43 +01:00
2016-08-05 14:58:25 +02:00
def closeEvent(self, event):
s = Settings.get_instance()
2016-08-05 14:58:25 +02:00
if not s['close_to_tray'] or s.closing:
2016-10-01 22:06:15 +02:00
if not self._saved:
self._saved = True
self.profile.save_history()
self.profile.close()
s['x'] = self.geometry().x()
s['y'] = self.geometry().y()
s['width'] = self.width()
s['height'] = self.height()
s.save()
2017-04-11 20:10:03 +02:00
QtWidgets.QApplication.closeAllWindows()
2016-10-01 22:06:15 +02:00
event.accept()
2017-04-13 18:22:46 +02:00
elif QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
2016-08-05 14:58:25 +02:00
event.ignore()
self.hide()
2016-03-12 21:18:13 +01:00
2016-09-26 20:58:14 +02:00
def close_window(self):
Settings.get_instance().closing = True
self.close()
2016-05-02 17:27:46 +02:00
def resizeEvent(self, *args, **kwargs):
2016-11-20 12:12:27 +01:00
if platform.system() == 'Windows':
self.messages.setGeometry(0, 0, self.width() - 270, self.height() - 155)
self.friends_list.setGeometry(0, 0, 270, self.height() - 125)
else:
self.messages.setGeometry(0, 0, self.width() - 270, self.height() - 159)
self.friends_list.setGeometry(0, 0, 270, self.height() - 129)
2016-06-11 23:40:58 +02:00
2016-11-05 11:03:47 +01:00
self.videocallButton.setGeometry(QtCore.QRect(self.width() - 330, 10, 50, 50))
self.callButton.setGeometry(QtCore.QRect(self.width() - 390, 10, 50, 50))
self.typing.setGeometry(QtCore.QRect(self.width() - 450, 20, 50, 30))
2016-05-18 23:38:21 +02:00
self.messageEdit.setGeometry(QtCore.QRect(55, 0, self.width() - 395, 55))
self.menuButton.setGeometry(QtCore.QRect(0, 0, 55, 55))
self.sendMessageButton.setGeometry(QtCore.QRect(self.width() - 340, 0, 70, 55))
2016-05-18 23:38:21 +02:00
2016-11-05 11:03:47 +01:00
self.account_name.setGeometry(QtCore.QRect(100, 15, self.width() - 560, 25))
self.account_status.setGeometry(QtCore.QRect(100, 35, self.width() - 560, 25))
2016-06-02 22:33:38 +02:00
self.messageEdit.setFocus()
2016-05-02 17:27:46 +02:00
self.profile.update()
def keyPressEvent(self, event):
2017-04-13 18:22:46 +02:00
if event.key() == QtCore.Qt.Key_Escape and QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
self.hide()
2016-07-29 14:27:46 +02:00
elif event.key() == QtCore.Qt.Key_C and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes():
rows = list(map(lambda x: self.messages.row(x), self.messages.selectedItems()))
indexes = (rows[0] - self.messages.count(), rows[-1] - self.messages.count())
s = self.profile.export_history(self.profile.active_friend, True, indexes)
2017-04-11 20:10:03 +02:00
clipboard = QtWidgets.QApplication.clipboard()
2016-07-29 14:27:46 +02:00
clipboard.setText(s)
elif event.key() == QtCore.Qt.Key_Z and event.modifiers() & QtCore.Qt.ControlModifier and self.messages.selectedIndexes():
self.messages.clearSelection()
elif event.key() == QtCore.Qt.Key_F and event.modifiers() & QtCore.Qt.ControlModifier:
self.show_search_field()
else:
super(MainWindow, self).keyPressEvent(event)
2016-05-02 17:27:46 +02:00
2016-02-23 21:26:37 +01:00
# -----------------------------------------------------------------------------------------------------------------
# Functions which called when user click in menu
# -----------------------------------------------------------------------------------------------------------------
def about_program(self):
import util
2017-04-11 20:10:03 +02:00
msgBox = QtWidgets.QMessageBox()
msgBox.setWindowTitle(QtWidgets.QApplication.translate("MainWindow", "About"))
text = (QtWidgets.QApplication.translate("MainWindow", 'Toxygen is Tox client written on Python.\nVersion: '))
2016-07-28 17:04:02 +02:00
msgBox.setText(text + util.program_version + '\nGitHub: https://github.com/toxygen-project/toxygen/')
2016-02-23 21:26:37 +01:00
msgBox.exec_()
def network_settings(self):
2016-03-15 18:05:19 +01:00
self.n_s = NetworkSettings(self.reset)
2016-02-23 21:26:37 +01:00
self.n_s.show()
2016-05-28 12:06:13 +02:00
def plugins_menu(self):
self.p_s = PluginsSettings()
self.p_s.show()
2016-06-06 12:29:17 +02:00
def add_contact(self, link=''):
2016-07-26 20:03:18 +02:00
self.a_c = AddContact(link or '')
2016-02-23 21:26:37 +01:00
self.a_c.show()
2016-07-28 22:00:04 +02:00
def profile_settings(self, *args):
self.p_s = ProfileSettings()
2016-02-23 21:26:37 +01:00
self.p_s.show()
def privacy_settings(self):
self.priv_s = PrivacySettings()
self.priv_s.show()
def notification_settings(self):
self.notif_s = NotificationsSettings()
self.notif_s.show()
def interface_settings(self):
self.int_s = InterfaceSettings()
self.int_s.show()
2016-04-24 12:45:11 +02:00
def audio_settings(self):
self.audio_s = AudioSettings()
self.audio_s.show()
def update_settings(self):
self.update_s = UpdateSettings()
self.update_s.show()
2017-03-15 21:17:38 +01:00
def reload_plugins(self):
plugin_loader = plugin_support.PluginLoader.get_instance()
2017-03-25 16:21:25 +01:00
if plugin_loader is not None:
plugin_loader.reload()
2017-03-15 21:17:38 +01:00
2016-07-07 12:54:02 +02:00
def import_plugin(self):
import util
2017-04-11 20:10:03 +02:00
directory = QtWidgets.QFileDialog.getExistingDirectory(self,
QtWidgets.QApplication.translate("MainWindow", 'Choose folder with plugin'),
2016-07-07 12:54:02 +02:00
util.curr_directory(),
2017-04-11 20:10:03 +02:00
QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
2016-07-07 12:54:02 +02:00
if directory:
src = directory + '/'
dest = curr_directory() + '/plugins/'
util.copy(src, dest)
2017-04-11 20:10:03 +02:00
msgBox = QtWidgets.QMessageBox()
2016-07-07 12:54:02 +02:00
msgBox.setWindowTitle(
2017-04-11 20:10:03 +02:00
QtWidgets.QApplication.translate("MainWindow", "Restart Toxygen"))
2016-07-07 12:54:02 +02:00
msgBox.setText(
2017-04-11 20:10:03 +02:00
QtWidgets.QApplication.translate("MainWindow", 'Plugin will be loaded after restart'))
2016-07-07 12:54:02 +02:00
msgBox.exec_()
2016-07-02 14:40:06 +02:00
def lock_app(self):
2017-02-11 18:07:28 +01:00
if toxes.ToxES.get_instance().has_password():
2016-07-02 14:40:06 +02:00
Settings.get_instance().locked = True
self.hide()
else:
2017-04-11 20:10:03 +02:00
msgBox = QtWidgets.QMessageBox()
2016-07-02 14:40:06 +02:00
msgBox.setWindowTitle(
2017-04-11 20:10:03 +02:00
QtWidgets.QApplication.translate("MainWindow", "Cannot lock app"))
2016-07-02 14:40:06 +02:00
msgBox.setText(
QtWidgets.QApplication.translate("MainWindow", 'Error. Profile password is not set.'))
2016-07-02 14:40:06 +02:00
msgBox.exec_()
2016-06-14 20:47:03 +02:00
def show_menu(self):
2016-06-16 11:29:45 +02:00
if not hasattr(self, 'menu'):
self.menu = DropdownMenu(self)
2016-06-14 20:47:03 +02:00
self.menu.setGeometry(QtCore.QRect(0 if Settings.get_instance()['mirror_mode'] else 270,
2016-07-02 21:19:04 +02:00
self.height() - 120,
180,
120))
2016-06-14 20:47:03 +02:00
self.menu.show()
2016-03-13 13:06:06 +01:00
# -----------------------------------------------------------------------------------------------------------------
2016-04-24 12:45:11 +02:00
# Messages, calls and file transfers
2016-03-13 13:06:06 +01:00
# -----------------------------------------------------------------------------------------------------------------
2016-02-25 21:40:00 +01:00
def send_message(self):
text = self.messageEdit.toPlainText()
2016-03-09 19:11:36 +01:00
self.profile.send_message(text)
2016-02-25 21:40:00 +01:00
def send_file(self):
2016-06-14 20:47:03 +02:00
self.menu.hide()
if self.profile.active_friend + 1:
2017-04-11 20:10:03 +02:00
choose = QtWidgets.QApplication.translate("MainWindow", 'Choose file')
name = QtWidgets.QFileDialog.getOpenFileName(self, choose, options=QtWidgets.QFileDialog.DontUseNativeDialog)
if name[0]:
self.profile.send_file(name[0])
def send_screenshot(self, hide=False):
2016-06-14 20:47:03 +02:00
self.menu.hide()
if self.profile.active_friend + 1:
self.sw = ScreenShotWindow(self)
self.sw.show()
if hide:
self.hide()
2016-03-22 13:17:46 +01:00
2016-06-14 20:47:03 +02:00
def send_smiley(self):
self.menu.hide()
if self.profile.active_friend + 1:
2016-06-27 18:28:43 +02:00
self.smiley = SmileyWindow(self)
self.smiley.setGeometry(QtCore.QRect(self.x() if Settings.get_instance()['mirror_mode'] else 270 + self.x(),
self.y() + self.height() - 200,
self.smiley.width(),
self.smiley.height()))
self.smiley.show()
2016-06-14 20:47:03 +02:00
2016-06-14 22:55:41 +02:00
def send_sticker(self):
self.menu.hide()
if self.profile.active_friend + 1:
self.sticker = StickerWindow(self)
self.sticker.setGeometry(QtCore.QRect(self.x() if Settings.get_instance()['mirror_mode'] else 270 + self.x(),
2016-10-30 16:13:12 +01:00
self.y() + self.height() - 200,
self.sticker.width(),
self.sticker.height()))
self.sticker.show()
2016-06-14 22:55:41 +02:00
2016-04-24 12:45:11 +02:00
def active_call(self):
self.update_call_state('finish_call')
def incoming_call(self):
self.update_call_state('incoming_call')
def call_finished(self):
self.update_call_state('call')
def update_call_state(self, fl):
2016-06-07 21:43:25 +02:00
# TODO: do smth with video call button
2016-06-11 23:40:58 +02:00
os.chdir(curr_directory() + '/images/')
2016-06-14 20:47:03 +02:00
pixmap = QtGui.QPixmap(curr_directory() + '/images/{}.png'.format(fl))
2016-04-24 12:45:11 +02:00
icon = QtGui.QIcon(pixmap)
self.callButton.setIcon(icon)
self.callButton.setIconSize(QtCore.QSize(50, 50))
2016-06-14 20:47:03 +02:00
pixmap = QtGui.QPixmap(curr_directory() + '/images/videocall.png')
2016-06-07 21:43:25 +02:00
icon = QtGui.QIcon(pixmap)
self.videocallButton.setIcon(icon)
self.videocallButton.setIconSize(QtCore.QSize(35, 35))
2016-04-24 12:45:11 +02:00
2016-03-13 13:06:06 +01:00
# -----------------------------------------------------------------------------------------------------------------
# Functions which called when user open context menu in friends list
# -----------------------------------------------------------------------------------------------------------------
def friend_right_click(self, pos):
item = self.friends_list.itemAt(pos)
2016-03-18 17:33:54 +01:00
num = self.friends_list.indexFromItem(item).row()
2016-05-28 12:06:13 +02:00
friend = Profile.get_instance().get_friend(num)
2016-10-31 22:04:48 +01:00
if friend is None:
return
2016-03-18 17:33:54 +01:00
settings = Settings.get_instance()
allowed = friend.tox_id in settings['auto_accept_from_friends']
2017-04-11 20:10:03 +02:00
auto = QtWidgets.QApplication.translate("MainWindow", 'Disallow auto accept') if allowed else QtWidgets.QApplication.translate("MainWindow", 'Allow auto accept')
if item is not None:
2017-04-11 20:10:03 +02:00
self.listMenu = QtWidgets.QMenu()
set_alias_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Set alias'))
2016-07-28 22:00:04 +02:00
2017-04-11 20:10:03 +02:00
history_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Chat history'))
clear_history_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Clear history'))
export_to_text_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Export as text'))
export_to_html_item = history_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Export as HTML'))
2016-07-28 22:00:04 +02:00
2017-04-11 20:10:03 +02:00
copy_menu = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Copy'))
copy_name_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Name'))
copy_status_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Status message'))
copy_key_item = copy_menu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Public key'))
2016-07-04 23:24:44 +02:00
2016-03-18 17:33:54 +01:00
auto_accept_item = self.listMenu.addAction(auto)
2017-04-11 20:10:03 +02:00
remove_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Remove friend'))
block_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Block friend'))
notes_item = self.listMenu.addAction(QtWidgets.QApplication.translate("MainWindow", 'Notes'))
2016-06-04 14:19:15 +02:00
2017-03-15 21:17:38 +01:00
plugins_loader = plugin_support.PluginLoader.get_instance()
if plugins_loader is not None:
submenu = plugins_loader.get_menu(self.listMenu, num)
if len(submenu):
2017-04-11 20:10:03 +02:00
plug = self.listMenu.addMenu(QtWidgets.QApplication.translate("MainWindow", 'Plugins'))
2017-03-15 21:17:38 +01:00
plug.addActions(submenu)
2017-04-11 20:10:03 +02:00
set_alias_item.triggered.connect(lambda: self.set_alias(num))
remove_item.triggered.connect(lambda: self.remove_friend(num))
block_item.triggered.connect(lambda: self.block_friend(num))
copy_key_item.triggered.connect(lambda: self.copy_friend_key(num))
clear_history_item.triggered.connect(lambda: self.clear_history(num))
auto_accept_item.triggered.connect(lambda: self.auto_accept(num, not allowed))
notes_item.triggered.connect(lambda: self.show_note(friend))
copy_name_item.triggered.connect(lambda: self.copy_name(friend))
copy_status_item.triggered.connect(lambda: self.copy_status(friend))
export_to_text_item.triggered.connect(lambda: self.export_history(num))
export_to_html_item.triggered.connect(lambda: self.export_history(num, False))
parent_position = self.friends_list.mapToGlobal(QtCore.QPoint(0, 0))
self.listMenu.move(parent_position + pos)
self.listMenu.show()
2016-06-04 14:19:15 +02:00
def show_note(self, friend):
s = Settings.get_instance()
note = s['notes'][friend.tox_id] if friend.tox_id in s['notes'] else ''
2017-04-11 20:10:03 +02:00
user = QtWidgets.QApplication.translate("MainWindow", 'Notes about user')
2016-06-21 13:58:11 +02:00
user = '{} {}'.format(user, friend.name)
2016-06-04 14:19:15 +02:00
def save_note(text):
2016-06-13 23:32:45 +02:00
if friend.tox_id in s['notes']:
del s['notes'][friend.tox_id]
if text:
s['notes'][friend.tox_id] = text
2016-06-04 14:19:15 +02:00
s.save()
self.note = MultilineEdit(user, note, save_note)
self.note.show()
2016-07-29 14:27:46 +02:00
def export_history(self, num, as_text=True):
s = self.profile.export_history(num, as_text)
2017-04-11 20:10:03 +02:00
directory = QtWidgets.QFileDialog.getExistingDirectory(None,
QtWidgets.QApplication.translate("MainWindow",
'Choose folder'),
2016-07-29 14:27:46 +02:00
curr_directory(),
2017-04-11 20:10:03 +02:00
QtWidgets.QFileDialog.ShowDirsOnly | QtWidgets.QFileDialog.DontUseNativeDialog)
2016-07-29 14:27:46 +02:00
if directory:
name = 'exported_history_{}.{}'.format(convert_time(time.time()), 'txt' if as_text else 'html')
with open(directory + '/' + name, 'wt') as fl:
fl.write(s)
2016-03-18 17:33:54 +01:00
def set_alias(self, num):
self.profile.set_alias(num)
2016-03-18 17:33:54 +01:00
def remove_friend(self, num):
self.profile.delete_friend(num)
def block_friend(self, num):
friend = self.profile.get_friend(num)
self.profile.block_user(friend.tox_id)
2016-03-18 17:33:54 +01:00
def copy_friend_key(self, num):
tox_id = self.profile.friend_public_key(num)
2017-04-11 20:10:03 +02:00
clipboard = QtWidgets.QApplication.clipboard()
clipboard.setText(tox_id)
2016-07-04 23:24:44 +02:00
def copy_name(self, friend):
2017-04-11 20:10:03 +02:00
clipboard = QtWidgets.QApplication.clipboard()
2016-07-04 23:24:44 +02:00
clipboard.setText(friend.name)
def copy_status(self, friend):
2017-04-11 20:10:03 +02:00
clipboard = QtWidgets.QApplication.clipboard()
2016-07-04 23:24:44 +02:00
clipboard.setText(friend.status_message)
2016-03-18 17:33:54 +01:00
def clear_history(self, num):
2016-03-12 21:18:13 +01:00
self.profile.clear_history(num)
2016-03-18 17:33:54 +01:00
def auto_accept(self, num, value):
settings = Settings.get_instance()
tox_id = self.profile.friend_public_key(num)
if value:
settings['auto_accept_from_friends'].append(tox_id)
else:
2016-05-02 18:46:42 +02:00
settings['auto_accept_from_friends'].remove(tox_id)
2016-03-18 17:33:54 +01:00
settings.save()
2016-03-13 13:06:06 +01:00
# -----------------------------------------------------------------------------------------------------------------
# Functions which called when user click somewhere else
# -----------------------------------------------------------------------------------------------------------------
2016-02-25 21:40:00 +01:00
def friend_click(self, index):
num = index.row()
2016-03-09 19:11:36 +01:00
self.profile.set_active(num)
2016-03-02 17:05:03 +01:00
def mouseReleaseEvent(self, event):
pos = self.connection_status.pos()
2016-06-13 18:28:17 +02:00
x, y = pos.x() + self.user_info.pos().x(), pos.y() + self.user_info.pos().y()
if (x < event.x() < x + 32) and (y < event.y() < y + 32):
self.profile.change_status()
else:
2016-06-13 18:28:17 +02:00
super(MainWindow, self).mouseReleaseEvent(event)
2017-01-21 22:19:56 +01:00
def show(self):
super().show()
self.profile.update()
2016-03-02 17:05:03 +01:00
def filtering(self):
2016-10-30 16:13:12 +01:00
ind = self.online_contacts.currentIndex()
d = {0: 0, 1: 1, 2: 2, 3: 4, 4: 1 | 4, 5: 2 | 4}
self.profile.filtration_and_sorting(d[ind], self.contact_name.text())
def show_search_field(self):
if hasattr(self, 'search_field') and self.search_field.isVisible():
return
2017-02-12 17:46:53 +01:00
if self.profile.get_curr_friend() is None:
return
self.search_field = SearchScreen(self.messages, self.messages.width(), self.messages.parent())
x, y = self.messages.x(), self.messages.y() + self.messages.height() - 40
self.search_field.setGeometry(x, y, self.messages.width(), 40)
self.messages.setGeometry(x, self.messages.y(), self.messages.width(), self.messages.height() - 40)
self.search_field.show()