create profile screen, main screen opens now
This commit is contained in:
parent
85467e1885
commit
91d3f885c0
15 changed files with 286 additions and 118 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,6 +1,5 @@
|
||||||
*.pyc
|
*.pyc
|
||||||
*.pyo
|
*.pyo
|
||||||
*.ui
|
|
||||||
toxygen/toxcore
|
toxygen/toxcore
|
||||||
tests/tests
|
tests/tests
|
||||||
tests/libs
|
tests/libs
|
||||||
|
|
131
toxygen/app.py
131
toxygen/app.py
|
@ -2,20 +2,24 @@ import communication.callbacks
|
||||||
import threads
|
import threads
|
||||||
from PyQt5 import QtWidgets, QtGui, QtCore
|
from PyQt5 import QtWidgets, QtGui, QtCore
|
||||||
import ui.password_screen as passwordscreen
|
import ui.password_screen as passwordscreen
|
||||||
from util.util import curr_directory, get_platform, get_images_directory, get_styles_directory, log
|
from util.util import *
|
||||||
import updater.updater as updater
|
import updater.updater as updater
|
||||||
import os
|
import os
|
||||||
from communication.tox_factory import tox_factory
|
from communication.tox_factory import tox_factory
|
||||||
import wrapper.libtox as libtox
|
import wrapper.toxencryptsave as tox_encrypt_save
|
||||||
import user_data.toxes
|
import user_data.toxes
|
||||||
from user_data.settings import Settings
|
from user_data.settings import Settings
|
||||||
from ui.login_screen import LoginScreen
|
from ui.login_screen import LoginScreen
|
||||||
from user_data.profile_manager import ProfileManager
|
from user_data.profile_manager import ProfileManager
|
||||||
|
from plugin_support.plugin_support import PluginLoader
|
||||||
|
from ui.main_screen import MainWindow
|
||||||
|
|
||||||
|
|
||||||
class App:
|
class App:
|
||||||
|
|
||||||
def __init__(self, path_to_profile=None, uri=None):
|
def __init__(self, version, path_to_profile=None, uri=None):
|
||||||
|
self._version = version
|
||||||
|
self._app = None
|
||||||
self.tox = self.ms = self.init = self.app = self.tray = self.mainloop = self.avloop = None
|
self.tox = self.ms = self.init = self.app = self.tray = self.mainloop = self.avloop = None
|
||||||
self.uri = self.path = self.toxes = None
|
self.uri = self.path = self.toxes = None
|
||||||
if uri is not None and uri.startswith('tox:'):
|
if uri is not None and uri.startswith('tox:'):
|
||||||
|
@ -44,7 +48,7 @@ class App:
|
||||||
app = QtWidgets.QApplication([])
|
app = QtWidgets.QApplication([])
|
||||||
icon_file = os.path.join(get_images_directory(), 'icon.png')
|
icon_file = os.path.join(get_images_directory(), 'icon.png')
|
||||||
app.setWindowIcon(QtGui.QIcon(icon_file))
|
app.setWindowIcon(QtGui.QIcon(icon_file))
|
||||||
self.app = app
|
self._app = app
|
||||||
|
|
||||||
if get_platform() == 'Linux':
|
if get_platform() == 'Linux':
|
||||||
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
|
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_X11InitThreads)
|
||||||
|
@ -53,17 +57,18 @@ class App:
|
||||||
style = fl.read()
|
style = fl.read()
|
||||||
app.setStyleSheet(style)
|
app.setStyleSheet(style)
|
||||||
|
|
||||||
encrypt_save = libtox.LibToxEncryptSave()
|
encrypt_save = tox_encrypt_save.ToxEncryptSave()
|
||||||
toxes = user_data.toxes.ToxES(encrypt_save)
|
self._toxes = user_data.toxes.ToxES(encrypt_save)
|
||||||
|
|
||||||
if self.path is not None:
|
if self.path is not None:
|
||||||
path = os.path.dirname(self.path) + '/'
|
path = os.path.dirname(self.path) + '/'
|
||||||
name = os.path.basename(self.path)[:-4]
|
name = os.path.basename(self.path)[:-4]
|
||||||
data = ProfileManager(path, name).open_profile()
|
self._settings = Settings(self._toxes, self.path.replace('.tox', '.json'))
|
||||||
|
self._profile_manager = ProfileManager(self._settings, self._toxes, path)
|
||||||
|
data = self._profile_manager.open_profile()
|
||||||
if encrypt_save.is_data_encrypted(data):
|
if encrypt_save.is_data_encrypted(data):
|
||||||
data = self.enter_pass(data)
|
data = self.enter_pass(data)
|
||||||
settings = Settings(name)
|
self.tox = tox_factory(data, self._settings)
|
||||||
self.tox = profile.tox_factory(data, settings)
|
|
||||||
else:
|
else:
|
||||||
auto_profile = Settings.get_auto_profile()
|
auto_profile = Settings.get_auto_profile()
|
||||||
if not auto_profile[0]:
|
if not auto_profile[0]:
|
||||||
|
@ -87,7 +92,7 @@ class App:
|
||||||
if result is None:
|
if result is None:
|
||||||
return
|
return
|
||||||
elif result.is_new_profile(): # create new profile
|
elif result.is_new_profile(): # create new profile
|
||||||
name = _login.name if _login.name else 'toxygen_user'
|
name = get_profile_name_from_path(result.profile_path) or 'toxygen_user'
|
||||||
pr = map(lambda x: x[1], ProfileManager.find_profiles())
|
pr = map(lambda x: x[1], ProfileManager.find_profiles())
|
||||||
if name in list(pr):
|
if name in list(pr):
|
||||||
msgBox = QtWidgets.QMessageBox()
|
msgBox = QtWidgets.QMessageBox()
|
||||||
|
@ -98,8 +103,8 @@ class App:
|
||||||
msgBox.setText(text)
|
msgBox.setText(text)
|
||||||
msgBox.exec_()
|
msgBox.exec_()
|
||||||
return
|
return
|
||||||
self.tox = profile.tox_factory()
|
self.tox = tox_factory()
|
||||||
self.tox.self_set_name(bytes(_login.name, 'utf-8') if _login.name else b'Toxygen User')
|
self.tox.self_set_name(bytes(name, 'utf-8') if name else b'Toxygen User')
|
||||||
self.tox.self_set_status_message(b'Toxing on Toxygen')
|
self.tox.self_set_status_message(b'Toxing on Toxygen')
|
||||||
reply = QtWidgets.QMessageBox.question(None,
|
reply = QtWidgets.QMessageBox.question(None,
|
||||||
'Profile {}'.format(name),
|
'Profile {}'.format(name),
|
||||||
|
@ -133,28 +138,30 @@ class App:
|
||||||
msgBox.exec_()
|
msgBox.exec_()
|
||||||
return
|
return
|
||||||
path = Settings.get_default_path()
|
path = Settings.get_default_path()
|
||||||
settings = Settings(name)
|
self._settings = Settings()
|
||||||
if curr_lang in langs:
|
if curr_lang in langs:
|
||||||
settings['language'] = curr_lang
|
self._settings['language'] = curr_lang
|
||||||
settings.save()
|
self._settings.save()
|
||||||
else: # load existing profile
|
else: # load existing profile
|
||||||
path = result.profile_path
|
path = result.profile_path
|
||||||
if result.load_as_default:
|
if result.load_as_default:
|
||||||
Settings.set_auto_profile(path)
|
Settings.set_auto_profile(path)
|
||||||
settings = Settings(toxes, path)
|
self._settings = Settings(self._toxes, path.replace('.tox', '.json'))
|
||||||
data = ProfileManager(settings, toxes, path).open_profile()
|
self._profile_manager = ProfileManager(self._settings, self._toxes, path)
|
||||||
if toxes.is_data_encrypted(data):
|
data = self._profile_manager.open_profile()
|
||||||
|
if self._toxes.is_data_encrypted(data):
|
||||||
data = self.enter_pass(data)
|
data = self.enter_pass(data)
|
||||||
self.tox = communication.tox_factory.tox_factory(data, settings)
|
self._tox = tox_factory(data, self._settings)
|
||||||
else:
|
else:
|
||||||
path, name = auto_profile
|
path, name = auto_profile
|
||||||
data = ProfileManager(path, name).open_profile()
|
self._settings = Settings(self._toxes, path + name + '.json')
|
||||||
|
self._profile_manager = ProfileManager(self._settings, self._toxes, path)
|
||||||
|
data = self._profile_manager.open_profile()
|
||||||
if encrypt_save.is_data_encrypted(data):
|
if encrypt_save.is_data_encrypted(data):
|
||||||
data = self.enter_pass(data)
|
data = self.enter_pass(data)
|
||||||
settings = Settings(name)
|
self.tox = tox_factory(data, self._settings)
|
||||||
self.tox = profile.tox_factory(data, settings)
|
|
||||||
|
|
||||||
if Settings.is_active_profile(path, name): # profile is in use
|
if Settings.is_active_profile(path, get_profile_name_from_path(path)): # profile is in use
|
||||||
reply = QtWidgets.QMessageBox.question(None,
|
reply = QtWidgets.QMessageBox.question(None,
|
||||||
'Profile {}'.format(name),
|
'Profile {}'.format(name),
|
||||||
QtWidgets.QApplication.translate("login", 'Other instance of Toxygen uses this profile or profile was not properly closed. Continue?'),
|
QtWidgets.QApplication.translate("login", 'Other instance of Toxygen uses this profile or profile was not properly closed. Continue?'),
|
||||||
|
@ -163,63 +170,36 @@ class App:
|
||||||
if reply != QtWidgets.QMessageBox.Yes:
|
if reply != QtWidgets.QMessageBox.Yes:
|
||||||
return
|
return
|
||||||
else:
|
else:
|
||||||
settings.set_active_profile()
|
self._settings.set_active_profile()
|
||||||
|
|
||||||
# application color scheme
|
self.load_app_styles()
|
||||||
for theme in settings.built_in_themes().keys():
|
self.load_app_translations()
|
||||||
if settings['theme'] == theme:
|
|
||||||
with open(curr_directory() + settings.built_in_themes()[theme]) as fl:
|
|
||||||
style = fl.read()
|
|
||||||
app.setStyleSheet(style)
|
|
||||||
|
|
||||||
lang = Settings.supported_languages()[settings['language']]
|
|
||||||
translator = QtCore.QTranslator()
|
|
||||||
translator.load(curr_directory() + '/translations/' + lang)
|
|
||||||
app.installTranslator(translator)
|
|
||||||
app.translator = translator
|
|
||||||
|
|
||||||
# tray icon
|
# tray icon
|
||||||
|
|
||||||
|
self.ms = MainWindow(self._settings, self._tox, self.reset, self.tray)
|
||||||
|
self._profile = self.ms.profile
|
||||||
self.ms.show()
|
self.ms.show()
|
||||||
|
|
||||||
updating = False
|
updating = updater.start_update_if_needed(self._version, self._settings)
|
||||||
if settings['update'] and updater.updater_available() and updater.connection_available(): # auto update
|
|
||||||
version = updater.check_for_updates()
|
|
||||||
if version is not None:
|
|
||||||
if settings['update'] == 2:
|
|
||||||
updater.download(version)
|
|
||||||
updating = True
|
|
||||||
else:
|
|
||||||
reply = QtWidgets.QMessageBox.question(None,
|
|
||||||
'Toxygen',
|
|
||||||
QtWidgets.QApplication.translate("login",
|
|
||||||
'Update for Toxygen was found. Download and install it?'),
|
|
||||||
QtWidgets.QMessageBox.Yes,
|
|
||||||
QtWidgets.QMessageBox.No)
|
|
||||||
if reply == QtWidgets.QMessageBox.Yes:
|
|
||||||
updater.download(version)
|
|
||||||
updating = True
|
|
||||||
|
|
||||||
if updating:
|
if updating:
|
||||||
data = self.tox.get_savedata()
|
data = self.tox.get_savedata()
|
||||||
ProfileManager.get_instance().save_profile(data)
|
self._profile_manager.save_profile(data)
|
||||||
settings.close()
|
self._settings.close()
|
||||||
del self.tox
|
del self.tox
|
||||||
return
|
return
|
||||||
|
|
||||||
plugin_helper = PluginLoader(self.tox, settings) # plugin support
|
plugin_helper = PluginLoader(self._tox, self._toxes, self._profile, self._settings) # plugin support
|
||||||
plugin_helper.load()
|
plugin_helper.load()
|
||||||
|
|
||||||
start()
|
|
||||||
# init thread
|
# init thread
|
||||||
self.init = self.InitThread(self.tox, self.ms, self.tray)
|
self.init = threads.InitThread(self.tox, self.ms, self.tray)
|
||||||
self.init.start()
|
self.init.start()
|
||||||
|
|
||||||
# starting threads for tox iterate and toxav iterate
|
# starting threads for tox iterate and toxav iterate
|
||||||
self.mainloop = self.ToxIterateThread(self.tox)
|
self.mainloop = threads.ToxIterateThread(self._tox)
|
||||||
self.mainloop.start()
|
self.mainloop.start()
|
||||||
self.avloop = self.ToxAVIterateThread(self.tox.AV)
|
self.avloop = threads.ToxAVIterateThread(self._tox.AV)
|
||||||
self.avloop.start()
|
self.avloop.start()
|
||||||
|
|
||||||
if self.uri is not None:
|
if self.uri is not None:
|
||||||
|
@ -232,14 +212,13 @@ class App:
|
||||||
self.mainloop.stop = True
|
self.mainloop.stop = True
|
||||||
self.avloop.stop = True
|
self.avloop.stop = True
|
||||||
plugin_helper.stop()
|
plugin_helper.stop()
|
||||||
stop()
|
|
||||||
self.mainloop.wait()
|
self.mainloop.wait()
|
||||||
self.init.wait()
|
self.init.wait()
|
||||||
self.avloop.wait()
|
self.avloop.wait()
|
||||||
self.tray.hide()
|
self.tray.hide()
|
||||||
data = self.tox.get_savedata()
|
data = self.tox.get_savedata()
|
||||||
ProfileManager.get_instance().save_profile(data)
|
self._profile_manager.save_profile(data)
|
||||||
settings.close()
|
self._settings.close()
|
||||||
del self.tox
|
del self.tox
|
||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
|
@ -254,10 +233,10 @@ class App:
|
||||||
self.init.wait()
|
self.init.wait()
|
||||||
self.avloop.wait()
|
self.avloop.wait()
|
||||||
data = self.tox.get_savedata()
|
data = self.tox.get_savedata()
|
||||||
ProfileManager.get_instance().save_profile(data)
|
self._profile_manager.save_profile(data)
|
||||||
del self.tox
|
del self.tox
|
||||||
# create new tox instance
|
# create new tox instance
|
||||||
self.tox = profile.tox_factory(data, Settings.get_instance())
|
self.tox = tox_factory(data, self._settings)
|
||||||
# init thread
|
# init thread
|
||||||
self.init = threads.InitThread(self.tox, self.ms, self.tray)
|
self.init = threads.InitThread(self.tox, self.ms, self.tray)
|
||||||
self.init.start()
|
self.init.start()
|
||||||
|
@ -269,7 +248,21 @@ class App:
|
||||||
self.avloop = threads.ToxAVIterateThread(self.tox.AV)
|
self.avloop = threads.ToxAVIterateThread(self.tox.AV)
|
||||||
self.avloop.start()
|
self.avloop.start()
|
||||||
|
|
||||||
plugin_helper = PluginLoader.get_instance()
|
self._plugin_loader.set_tox(self.tox)
|
||||||
plugin_helper.set_tox(self.tox)
|
|
||||||
|
|
||||||
return self.tox
|
return self.tox
|
||||||
|
|
||||||
|
def load_app_styles(self):
|
||||||
|
# application color scheme
|
||||||
|
for theme in self._settings.built_in_themes().keys():
|
||||||
|
if self._settings['theme'] == theme:
|
||||||
|
with open(curr_directory(__file__) + self._settings.built_in_themes()[theme]) as fl:
|
||||||
|
style = fl.read()
|
||||||
|
self._app.setStyleSheet(style)
|
||||||
|
|
||||||
|
def load_app_translations(self):
|
||||||
|
lang = Settings.supported_languages()[self._settings['language']]
|
||||||
|
translator = QtCore.QTranslator()
|
||||||
|
translator.load(curr_directory(__file__) + '/translations/' + lang)
|
||||||
|
self._app.installTranslator(translator)
|
||||||
|
self._app.translator = translator
|
||||||
|
|
|
@ -81,6 +81,7 @@ class BaseContact:
|
||||||
"""
|
"""
|
||||||
Tries to load avatar of contact or uses default avatar
|
Tries to load avatar of contact or uses default avatar
|
||||||
"""
|
"""
|
||||||
|
return
|
||||||
prefix = ProfileManager.get_path() + 'avatars/'
|
prefix = ProfileManager.get_path() + 'avatars/'
|
||||||
avatar_path = prefix + '{}.png'.format(self._tox_id[:TOX_PUBLIC_KEY_SIZE * 2])
|
avatar_path = prefix + '{}.png'.format(self._tox_id[:TOX_PUBLIC_KEY_SIZE * 2])
|
||||||
if not os.path.isfile(avatar_path) or not os.path.getsize(avatar_path): # load default image
|
if not os.path.isfile(avatar_path) or not os.path.getsize(avatar_path): # load default image
|
||||||
|
|
|
@ -39,8 +39,7 @@ class Profile(basecontact.BaseContact):
|
||||||
self._load_history = True
|
self._load_history = True
|
||||||
self._waiting_for_reconnection = False
|
self._waiting_for_reconnection = False
|
||||||
self._factory = items_factory.ItemsFactory(self._screen.friends_list, self._messages)
|
self._factory = items_factory.ItemsFactory(self._screen.friends_list, self._messages)
|
||||||
settings = Settings.get_instance()
|
#self._show_avatars = settings['show_avatars']
|
||||||
self._show_avatars = settings['show_avatars']
|
|
||||||
|
|
||||||
|
|
||||||
# -----------------------------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -42,7 +42,7 @@ def main():
|
||||||
reset()
|
reset()
|
||||||
return
|
return
|
||||||
|
|
||||||
toxygen = app.App(path_to_profile=args.profile_path)
|
toxygen = app.App(__version__, path_to_profile=args.profile_path)
|
||||||
toxygen.main()
|
toxygen.main()
|
||||||
|
|
||||||
|
|
||||||
|
|
43
toxygen/ui/create_profile_screen.py
Normal file
43
toxygen/ui/create_profile_screen.py
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
from ui.widgets import *
|
||||||
|
from PyQt5 import uic
|
||||||
|
import util.util as util
|
||||||
|
import util.ui as util_ui
|
||||||
|
|
||||||
|
|
||||||
|
class CreateProfileScreenResult:
|
||||||
|
|
||||||
|
def __init__(self, save_into_default_folder, password):
|
||||||
|
self._save_into_default_folder = save_into_default_folder
|
||||||
|
self._password = password
|
||||||
|
|
||||||
|
def get_save_into_default_folder(self):
|
||||||
|
return self._save_into_default_folder
|
||||||
|
|
||||||
|
save_into_default_folder = property(get_save_into_default_folder)
|
||||||
|
|
||||||
|
def get_password(self):
|
||||||
|
return self._password
|
||||||
|
|
||||||
|
password = property(get_password)
|
||||||
|
|
||||||
|
|
||||||
|
class CreateProfileScreen(CenteredWidget, DialogWithResult):
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
CenteredWidget.__init__(self)
|
||||||
|
DialogWithResult.__init__(self)
|
||||||
|
uic.loadUi(util.get_views_path('create_profile_screen'))
|
||||||
|
self.center()
|
||||||
|
self.createProfile.clicked.connect(self.create_profile)
|
||||||
|
|
||||||
|
def retranslateUi(self):
|
||||||
|
self.defaultFolder.setPlaceholderText(util_ui.tr('Save in default folder'))
|
||||||
|
self.programFolder.setPlaceholderText(util_ui.tr('Save in program folder'))
|
||||||
|
self.createProfile.setText(util_ui.tr('Create profile'))
|
||||||
|
self.passwordLabel.setText(util_ui.tr('Password:'))
|
||||||
|
|
||||||
|
def create_profile(self):
|
||||||
|
if self.password.text() != self.confirmPassword.text():
|
||||||
|
return # TODO : error
|
||||||
|
result = CreateProfileScreenResult(self.defaultFolder.isChecked(), self.password.text())
|
||||||
|
self.close_with_result(result)
|
|
@ -5,7 +5,7 @@ import os.path
|
||||||
class NickEdit(LineEdit):
|
class NickEdit(LineEdit):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
super(NickEdit, self).__init__(parent)
|
super().__init__(parent)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
|
||||||
def keyPressEvent(self, event):
|
def keyPressEvent(self, event):
|
||||||
|
@ -108,7 +108,7 @@ class LoginScreen(CenteredWidget, DialogWithResult):
|
||||||
def load_existing_profile(self):
|
def load_existing_profile(self):
|
||||||
index = self.comboBox.currentIndex()
|
index = self.comboBox.currentIndex()
|
||||||
load_as_default = self.default.isChecked()
|
load_as_default = self.default.isChecked()
|
||||||
path = os.path.join(self._profiles[index][0], self._profiles[index][1] + '.tox')
|
path = os.path.join(self._profiles[index][0], self._profiles[index][1] + '.tox')
|
||||||
result = LoginScreenResult(path, load_as_default)
|
result = LoginScreenResult(path, load_as_default)
|
||||||
self.close_with_result(result)
|
self.close_with_result(result)
|
||||||
|
|
||||||
|
@ -118,9 +118,3 @@ class LoginScreen(CenteredWidget, DialogWithResult):
|
||||||
self.comboBox.addItems(list(map(lambda p: p[1], profiles)))
|
self.comboBox.addItems(list(map(lambda p: p[1], profiles)))
|
||||||
self.load_profile.setEnabled(len(profiles) > 0)
|
self.load_profile.setEnabled(len(profiles) > 0)
|
||||||
|
|
||||||
def update_on_close(self, func):
|
|
||||||
self.onclose = func
|
|
||||||
|
|
||||||
def closeEvent(self, event):
|
|
||||||
self.onclose(self.type, self.number, self.load_as_default, self.name)
|
|
||||||
event.accept()
|
|
||||||
|
|
|
@ -5,19 +5,20 @@ from ui.widgets import MultilineEdit, ComboBox
|
||||||
import plugin_support
|
import plugin_support
|
||||||
from ui.main_screen_widgets import *
|
from ui.main_screen_widgets import *
|
||||||
from user_data import toxes, settings
|
from user_data import toxes, settings
|
||||||
|
import util.util as util
|
||||||
|
|
||||||
|
|
||||||
class MainWindow(QtWidgets.QMainWindow, Singleton):
|
class MainWindow(QtWidgets.QMainWindow):
|
||||||
|
|
||||||
def __init__(self, tox, reset, tray):
|
def __init__(self, settings, tox, reset, tray):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
Singleton.__init__(self)
|
self._settings = settings
|
||||||
self.reset = reset
|
self.reset = reset
|
||||||
self.tray = tray
|
self.tray = tray
|
||||||
self.setAcceptDrops(True)
|
self.setAcceptDrops(True)
|
||||||
self.initUI(tox)
|
self.initUI(tox)
|
||||||
self._saved = False
|
self._saved = False
|
||||||
if settings.Settings.get_instance()['show_welcome_screen']:
|
if settings['show_welcome_screen']:
|
||||||
self.ws = WelcomeScreen()
|
self.ws = WelcomeScreen()
|
||||||
|
|
||||||
def setup_menu(self, window):
|
def setup_menu(self, window):
|
||||||
|
@ -137,7 +138,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Name"))
|
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 and by name"))
|
||||||
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first and by name"))
|
self.online_contacts.addItem(QtWidgets.QApplication.translate("MainWindow", "Online first and by name"))
|
||||||
ind = Settings.get_instance()['sorting']
|
ind = self._settings['sorting']
|
||||||
d = {0: 0, 1: 1, 2: 2, 3: 4, 1 | 4: 4, 2 | 4: 5}
|
d = {0: 0, 1: 1, 2: 2, 3: 4, 1 | 4: 4, 2 | 4: 5}
|
||||||
self.online_contacts.setCurrentIndex(d[ind])
|
self.online_contacts.setCurrentIndex(d[ind])
|
||||||
self.importPlugin.setText(QtWidgets.QApplication.translate("MainWindow", "Import plugin"))
|
self.importPlugin.setText(QtWidgets.QApplication.translate("MainWindow", "Import plugin"))
|
||||||
|
@ -150,7 +151,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.messageEdit.setObjectName("messageEdit")
|
self.messageEdit.setObjectName("messageEdit")
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setPointSize(11)
|
font.setPointSize(11)
|
||||||
font.setFamily(settings.Settings.get_instance()['font'])
|
font.setFamily(self._settings['font'])
|
||||||
self.messageEdit.setFont(font)
|
self.messageEdit.setFont(font)
|
||||||
|
|
||||||
self.sendMessageButton = QtWidgets.QPushButton(Form)
|
self.sendMessageButton = QtWidgets.QPushButton(Form)
|
||||||
|
@ -207,7 +208,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.name = Form.name = DataLabel(Form)
|
self.name = Form.name = DataLabel(Form)
|
||||||
Form.name.setGeometry(QtCore.QRect(75, 15, 150, 25))
|
Form.name.setGeometry(QtCore.QRect(75, 15, 150, 25))
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setFamily(settings.Settings.get_instance()['font'])
|
font.setFamily(self._settings['font'])
|
||||||
font.setPointSize(14)
|
font.setPointSize(14)
|
||||||
font.setBold(True)
|
font.setBold(True)
|
||||||
Form.name.setFont(font)
|
Form.name.setFont(font)
|
||||||
|
@ -235,7 +236,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.account_name.setGeometry(QtCore.QRect(100, 0, 400, 25))
|
self.account_name.setGeometry(QtCore.QRect(100, 0, 400, 25))
|
||||||
self.account_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse)
|
self.account_name.setTextInteractionFlags(QtCore.Qt.LinksAccessibleByMouse)
|
||||||
font = QtGui.QFont()
|
font = QtGui.QFont()
|
||||||
font.setFamily(settings.Settings.get_instance()['font'])
|
font.setFamily(self._settings['font'])
|
||||||
font.setPointSize(14)
|
font.setPointSize(14)
|
||||||
font.setBold(True)
|
font.setBold(True)
|
||||||
self.account_name.setFont(font)
|
self.account_name.setFont(font)
|
||||||
|
@ -297,10 +298,9 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
|
|
||||||
def initUI(self, tox):
|
def initUI(self, tox):
|
||||||
self.setMinimumSize(920, 500)
|
self.setMinimumSize(920, 500)
|
||||||
s = Settings.get_instance()
|
s = self._settings
|
||||||
self.setGeometry(s['x'], s['y'], s['width'], s['height'])
|
self.setGeometry(s['x'], s['y'], s['width'], s['height'])
|
||||||
self.setWindowTitle('Toxygen')
|
self.setWindowTitle('Toxygen')
|
||||||
os.chdir(curr_directory() + '/images/')
|
|
||||||
menu = QtWidgets.QWidget()
|
menu = QtWidgets.QWidget()
|
||||||
main = QtWidgets.QWidget()
|
main = QtWidgets.QWidget()
|
||||||
grid = QtWidgets.QGridLayout()
|
grid = QtWidgets.QGridLayout()
|
||||||
|
@ -317,7 +317,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.setup_right_bottom(message_buttons)
|
self.setup_right_bottom(message_buttons)
|
||||||
self.setup_left_center(main_list)
|
self.setup_left_center(main_list)
|
||||||
self.setup_menu(menu)
|
self.setup_menu(menu)
|
||||||
if not Settings.get_instance()['mirror_mode']:
|
if not self._settings['mirror_mode']:
|
||||||
grid.addWidget(search, 2, 0)
|
grid.addWidget(search, 2, 0)
|
||||||
grid.addWidget(name, 1, 0)
|
grid.addWidget(name, 1, 0)
|
||||||
grid.addWidget(messages, 2, 1, 2, 1)
|
grid.addWidget(messages, 2, 1, 2, 1)
|
||||||
|
@ -391,7 +391,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.account_name.setGeometry(QtCore.QRect(100, 15, self.width() - 560, 25))
|
self.account_name.setGeometry(QtCore.QRect(100, 15, self.width() - 560, 25))
|
||||||
self.account_status.setGeometry(QtCore.QRect(100, 35, self.width() - 560, 25))
|
self.account_status.setGeometry(QtCore.QRect(100, 35, self.width() - 560, 25))
|
||||||
self.messageEdit.setFocus()
|
self.messageEdit.setFocus()
|
||||||
self.profile.update()
|
#self.profile.update()
|
||||||
|
|
||||||
def keyPressEvent(self, event):
|
def keyPressEvent(self, event):
|
||||||
if event.key() == QtCore.Qt.Key_Escape and QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
|
if event.key() == QtCore.Qt.Key_Escape and QtWidgets.QSystemTrayIcon.isSystemTrayAvailable():
|
||||||
|
@ -561,14 +561,13 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
self.update_call_state('call')
|
self.update_call_state('call')
|
||||||
|
|
||||||
def update_call_state(self, state):
|
def update_call_state(self, state):
|
||||||
os.chdir(curr_directory() + '/images/')
|
|
||||||
|
|
||||||
pixmap = QtGui.QPixmap(curr_directory() + '/images/{}.png'.format(state))
|
pixmap = QtGui.QPixmap(os.path.join(util.get_images_directory(), '{}.png'.format(state)))
|
||||||
icon = QtGui.QIcon(pixmap)
|
icon = QtGui.QIcon(pixmap)
|
||||||
self.callButton.setIcon(icon)
|
self.callButton.setIcon(icon)
|
||||||
self.callButton.setIconSize(QtCore.QSize(50, 50))
|
self.callButton.setIconSize(QtCore.QSize(50, 50))
|
||||||
|
|
||||||
pixmap = QtGui.QPixmap(curr_directory() + '/images/{}_video.png'.format(state))
|
pixmap = QtGui.QPixmap(os.path.join(util.get_images_directory(), '{}_video.png'.format(state)))
|
||||||
icon = QtGui.QIcon(pixmap)
|
icon = QtGui.QIcon(pixmap)
|
||||||
self.videocallButton.setIcon(icon)
|
self.videocallButton.setIcon(icon)
|
||||||
self.videocallButton.setIconSize(QtCore.QSize(35, 35))
|
self.videocallButton.setIconSize(QtCore.QSize(35, 35))
|
||||||
|
@ -732,7 +731,7 @@ class MainWindow(QtWidgets.QMainWindow, Singleton):
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
super().show()
|
super().show()
|
||||||
self.profile.update()
|
#self.profile.update()
|
||||||
|
|
||||||
def filtering(self):
|
def filtering(self):
|
||||||
ind = self.online_contacts.currentIndex()
|
ind = self.online_contacts.currentIndex()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from PyQt5 import QtCore, QtGui, QtWidgets
|
from PyQt5 import QtCore, QtGui, QtWidgets
|
||||||
from user_data.settings import *
|
from user_data.settings import *
|
||||||
from contacts.profile import Profile
|
from contacts.profile import Profile
|
||||||
from util import curr_directory, copy
|
from util.util import curr_directory, copy
|
||||||
from ui.widgets import CenteredWidget, DataLabel, LineEdit, RubberBandWindow
|
from ui.widgets import CenteredWidget, DataLabel, LineEdit, RubberBandWindow
|
||||||
import pyaudio
|
import pyaudio
|
||||||
from user_data import toxes
|
from user_data import toxes
|
||||||
|
|
106
toxygen/ui/views/create_profile_screen.ui
Normal file
106
toxygen/ui/views/create_profile_screen.ui
Normal file
|
@ -0,0 +1,106 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>Form</class>
|
||||||
|
<widget class="QWidget" name="Form">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="minimumSize">
|
||||||
|
<size>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="maximumSize">
|
||||||
|
<size>
|
||||||
|
<width>400</width>
|
||||||
|
<height>300</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Form</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QPushButton" name="createProfile">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>240</y>
|
||||||
|
<width>341</width>
|
||||||
|
<height>51</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>PushButton</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLineEdit" name="confirmPassword">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>190</y>
|
||||||
|
<width>341</width>
|
||||||
|
<height>41</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLineEdit" name="password">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>140</y>
|
||||||
|
<width>341</width>
|
||||||
|
<height>41</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QLabel" name="passwordLabel">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>100</y>
|
||||||
|
<width>67</width>
|
||||||
|
<height>17</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>TextLabel</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QRadioButton" name="defaultFolder">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>10</y>
|
||||||
|
<width>112</width>
|
||||||
|
<height>23</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>RadioButton</string>
|
||||||
|
</property>
|
||||||
|
<property name="checked">
|
||||||
|
<bool>true</bool>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QRadioButton" name="programFolder">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>30</x>
|
||||||
|
<y>50</y>
|
||||||
|
<width>112</width>
|
||||||
|
<height>23</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="text">
|
||||||
|
<string>RadioButton</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</widget>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
|
@ -1,4 +1,5 @@
|
||||||
import util
|
import util.util as util
|
||||||
|
import util.ui as util_ui
|
||||||
import os
|
import os
|
||||||
from user_data import settings
|
from user_data import settings
|
||||||
import platform
|
import platform
|
||||||
|
@ -24,12 +25,11 @@ def updater_available():
|
||||||
return os.path.exists(util.curr_directory() + '/toxygen_updater')
|
return os.path.exists(util.curr_directory() + '/toxygen_updater')
|
||||||
|
|
||||||
|
|
||||||
def check_for_updates():
|
def check_for_updates(current_version, settings):
|
||||||
current_version = util.program_version
|
|
||||||
major, minor, patch = list(map(lambda x: int(x), current_version.split('.')))
|
major, minor, patch = list(map(lambda x: int(x), current_version.split('.')))
|
||||||
versions = generate_versions(major, minor, patch)
|
versions = generate_versions(major, minor, patch)
|
||||||
for version in versions:
|
for version in versions:
|
||||||
if send_request(version):
|
if send_request(version, settings):
|
||||||
return version
|
return version
|
||||||
return None # no new version was found
|
return None # no new version was found
|
||||||
|
|
||||||
|
@ -79,14 +79,13 @@ def download(version):
|
||||||
util.log('Exception: running updater failed with ' + str(ex))
|
util.log('Exception: running updater failed with ' + str(ex))
|
||||||
|
|
||||||
|
|
||||||
def send_request(version):
|
def send_request(version, settings):
|
||||||
s = settings.Settings.get_instance()
|
|
||||||
netman = QtNetwork.QNetworkAccessManager()
|
netman = QtNetwork.QNetworkAccessManager()
|
||||||
proxy = QtNetwork.QNetworkProxy()
|
proxy = QtNetwork.QNetworkProxy()
|
||||||
if s['proxy_type']:
|
if settings['proxy_type']:
|
||||||
proxy.setType(QtNetwork.QNetworkProxy.Socks5Proxy if s['proxy_type'] == 2 else QtNetwork.QNetworkProxy.HttpProxy)
|
proxy.setType(QtNetwork.QNetworkProxy.Socks5Proxy if settings['proxy_type'] == 2 else QtNetwork.QNetworkProxy.HttpProxy)
|
||||||
proxy.setHostName(s['proxy_host'])
|
proxy.setHostName(settings['proxy_host'])
|
||||||
proxy.setPort(s['proxy_port'])
|
proxy.setPort(settings['proxy_port'])
|
||||||
netman.setProxy(proxy)
|
netman.setProxy(proxy)
|
||||||
url = test_url(version)
|
url = test_url(version)
|
||||||
try:
|
try:
|
||||||
|
@ -108,3 +107,25 @@ def generate_versions(major, minor, patch):
|
||||||
new_minor = '.'.join([str(major), str(minor + 1), '0'])
|
new_minor = '.'.join([str(major), str(minor + 1), '0'])
|
||||||
new_patch = '.'.join([str(major), str(minor), str(patch + 1)])
|
new_patch = '.'.join([str(major), str(minor), str(patch + 1)])
|
||||||
return new_major, new_minor, new_patch
|
return new_major, new_minor, new_patch
|
||||||
|
|
||||||
|
|
||||||
|
def start_update_if_needed(version, settings):
|
||||||
|
updating = False
|
||||||
|
if settings['update'] and updater_available() and connection_available(): # auto update
|
||||||
|
version = check_for_updates(version, settings)
|
||||||
|
if version is not None:
|
||||||
|
if settings['update'] == 2:
|
||||||
|
download(version)
|
||||||
|
updating = True
|
||||||
|
else:
|
||||||
|
reply = QtWidgets.QMessageBox.question(None,
|
||||||
|
'Toxygen',
|
||||||
|
QtWidgets.QApplication.translate("login",
|
||||||
|
'Update for Toxygen was found. Download and install it?'),
|
||||||
|
QtWidgets.QMessageBox.Yes,
|
||||||
|
QtWidgets.QMessageBox.No)
|
||||||
|
if reply == QtWidgets.QMessageBox.Yes:
|
||||||
|
download(version)
|
||||||
|
updating = True
|
||||||
|
|
||||||
|
return updating
|
||||||
|
|
|
@ -70,6 +70,3 @@ class ProfileManager:
|
||||||
result.append((path + '/', name))
|
result.append((path + '/', name))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def get_path():
|
|
||||||
return ProfileManager.get_instance().get_dir()
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ class Settings(dict):
|
||||||
|
|
||||||
def __init__(self, toxes, path):
|
def __init__(self, toxes, path):
|
||||||
self._path = path
|
self._path = path
|
||||||
|
self._profile_path = path.replace('.json', '.tox')
|
||||||
self._toxes = toxes
|
self._toxes = toxes
|
||||||
if os.path.isfile(path):
|
if os.path.isfile(path):
|
||||||
with open(path, 'rb') as fl:
|
with open(path, 'rb') as fl:
|
||||||
|
@ -25,10 +26,10 @@ class Settings(dict):
|
||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
info = Settings.get_default_settings()
|
info = Settings.get_default_settings()
|
||||||
log('Parsing settings error: ' + str(ex))
|
log('Parsing settings error: ' + str(ex))
|
||||||
super(Settings, self).__init__(info)
|
super().__init__(info)
|
||||||
self.upgrade()
|
self.upgrade()
|
||||||
else:
|
else:
|
||||||
super(Settings, self).__init__(Settings.get_default_settings())
|
super().__init__(Settings.get_default_settings())
|
||||||
self.save()
|
self.save()
|
||||||
smileys.SmileyLoader(self)
|
smileys.SmileyLoader(self)
|
||||||
self.locked = False
|
self.locked = False
|
||||||
|
@ -181,8 +182,7 @@ class Settings(dict):
|
||||||
fl.write(text)
|
fl.write(text)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
profile_path = ProfileManager.get_path()
|
path = self._profile_path + '.lock'
|
||||||
path = str(profile_path + str(self.name) + '.lock')
|
|
||||||
if os.path.isfile(path):
|
if os.path.isfile(path):
|
||||||
os.remove(path)
|
os.remove(path)
|
||||||
|
|
||||||
|
@ -190,8 +190,7 @@ class Settings(dict):
|
||||||
"""
|
"""
|
||||||
Mark current profile as active
|
Mark current profile as active
|
||||||
"""
|
"""
|
||||||
profile_path = ProfileManager.get_path()
|
path = self._profile_path + '.lock'
|
||||||
path = str(profile_path + str(self.name) + '.lock')
|
|
||||||
with open(path, 'w') as fl:
|
with open(path, 'w') as fl:
|
||||||
fl.write('active')
|
fl.write('active')
|
||||||
|
|
||||||
|
|
|
@ -5,4 +5,10 @@ def tr(s):
|
||||||
return PyQt5.QtWidgets.QApplication.translate('Toxygen', s)
|
return PyQt5.QtWidgets.QApplication.translate('Toxygen', s)
|
||||||
|
|
||||||
|
|
||||||
|
def question(text):
|
||||||
|
reply = PyQt5.QtWidgets.QMessageBox.question(None, 'Toxygen', text,
|
||||||
|
PyQt5.QtWidgets.QMessageBox.Yes,
|
||||||
|
PyQt5.QtWidgets.QMessageBox.No)
|
||||||
|
return reply == PyQt5.QtWidgets.QMessageBox.Yes
|
||||||
|
|
||||||
# TODO: move all dialogs here
|
# TODO: move all dialogs here
|
||||||
|
|
|
@ -32,7 +32,7 @@ def curr_directory(current_file=None):
|
||||||
|
|
||||||
|
|
||||||
def get_base_directory(current_file=None):
|
def get_base_directory(current_file=None):
|
||||||
return os.path.dirname(curr_directory())
|
return os.path.dirname(curr_directory(current_file or __file__))
|
||||||
|
|
||||||
|
|
||||||
def get_images_directory():
|
def get_images_directory():
|
||||||
|
@ -43,6 +43,17 @@ def get_styles_directory():
|
||||||
return os.path.join(get_base_directory(), 'styles')
|
return os.path.join(get_base_directory(), 'styles')
|
||||||
|
|
||||||
|
|
||||||
|
def get_profile_name_from_path(path):
|
||||||
|
return os.path.basename(path)[:-4]
|
||||||
|
|
||||||
|
|
||||||
|
def get_views_path(view_name):
|
||||||
|
ui_folder = os.path.join(get_base_directory(), 'ui')
|
||||||
|
views_folder = os.path.join(ui_folder, 'views')
|
||||||
|
|
||||||
|
return os.path.join(views_folder, view_name + '.ui')
|
||||||
|
|
||||||
|
|
||||||
def curr_time():
|
def curr_time():
|
||||||
return time.strftime('%H:%M')
|
return time.strftime('%H:%M')
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue