From bc975826b5db5102bc57c127fe149762b794dfb6 Mon Sep 17 00:00:00 2001 From: ingvar1995 Date: Tue, 15 Mar 2016 20:05:19 +0300 Subject: [PATCH] network settings update --- src/list_items.py | 3 +- src/main.py | 220 +++++++++++++++++++++++++++------------------- src/mainscreen.py | 12 +-- src/menu.py | 7 +- src/profile.py | 16 ++-- 5 files changed, 150 insertions(+), 108 deletions(-) diff --git a/src/list_items.py b/src/list_items.py index 5c9073f..a932769 100644 --- a/src/list_items.py +++ b/src/list_items.py @@ -5,7 +5,8 @@ from PySide import QtGui, QtCore class MessageEdit(QtGui.QPlainTextEdit): def __init__(self, text, width, parent=None): super(MessageEdit, self).__init__(parent) - + self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) + self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) self.setWordWrapMode(QtGui.QTextOption.WrapAtWordBoundaryOrAnywhere) self.setPlainText(text) self.document().setTextWidth(parent.width() - 100) diff --git a/src/main.py b/src/main.py index 20e50ef..01d582f 100644 --- a/src/main.py +++ b/src/main.py @@ -1,124 +1,160 @@ +import sys from loginscreen import LoginScreen from settings import Settings +from PySide import QtCore, QtGui +from bootstrap import node_generator from mainscreen import MainWindow from profile import ProfileHelper, tox_factory -import sys -from PySide import QtCore, QtGui from callbacks import init_callbacks -from bootstrap import node_generator from util import curr_directory, get_style -class Login(object): +class Toxygen(object): - def __init__(self, arr): - self.arr = arr + def __init__(self): + super(Toxygen, self).__init__() + self.tox = self.ms = self.init = self.mainloop = None - def login_screen_close(self, t, number=-1, default=False, name=None): - """ Function which processes data from login screen - :param t: 0 - window was closed, 1 - new profile was created, 2 - profile loaded - :param number: num of choosen profile in list (-1 by default) - :param default: was or not choosen profile marked as default - :param name: name of new profile + def main(self): """ - print str(t), str(number), str(default), str(name) - self.t = t - self.num = number - self.default = default - self.name = name + main function of app. loads login screen if needed and starts main screen + """ + app = QtGui.QApplication(sys.argv) + app.setWindowIcon(QtGui.QIcon(curr_directory() + '/images/icon.png')) + auto_profile = Settings.get_auto_profile() + if not auto_profile: + # show login screen if default profile not found + ls = LoginScreen() + ls.setWindowIconText("Toxygen") + profiles = ProfileHelper.find_profiles() + ls.update_select(map(lambda x: x[1], profiles)) + _login = self.Login(profiles) + ls.update_on_close(_login.login_screen_close) + ls.show() + app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) + app.exec_() + if not _login.t: + return + elif _login.t == 1: # create new profile + name = _login.name if _login.name else 'toxygen_user' + settings = Settings(name) + self.tox = tox_factory() + self.tox.self_set_name(_login.name if _login.name else 'Toxygen User') + self.tox.self_set_status_message('Toxing on Toxygen') + ProfileHelper.save_profile(self.tox.get_savedata(), name) + else: # load existing profile + path, name = _login.get_data() + settings = Settings(name) + if _login.default: + Settings.set_auto_profile(path, name) + data = ProfileHelper.open_profile(path, name) + self.tox = tox_factory(data, settings) + else: + path, name = auto_profile + settings = Settings(name) + data = ProfileHelper.open_profile(path, name) + self.tox = tox_factory(data, settings) - def get_data(self): - return self.arr[self.num] + self.ms = MainWindow(self.tox, self.reset) + self.ms.show() + QtGui.QApplication.setStyle(get_style(settings['theme'])) # set application style + # init thread + self.init = self.InitThread(self.tox, self.ms) + self.init.start() -def main(): - """ - main function of app. loads login screen if needed and starts main screen - """ - app = QtGui.QApplication(sys.argv) - app.setWindowIcon(QtGui.QIcon(curr_directory() + '/images/icon.png')) - auto_profile = Settings.get_auto_profile() - if not auto_profile: - # show login screen if default profile not found - ls = LoginScreen() - ls.setWindowIconText("Toxygen") - profiles = ProfileHelper.find_profiles() - ls.update_select(map(lambda x: x[1], profiles)) - _login = Login(profiles) - ls.update_on_close(_login.login_screen_close) - ls.show() + # starting thread for tox iterate + self.mainloop = self.ToxIterateThread(self.tox) + self.mainloop.start() app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) app.exec_() - if not _login.t: - return - elif _login.t == 1: # create new profile - name = _login.name if _login.name else 'toxygen_user' - settings = Settings(name) - tox = tox_factory() - tox.self_set_name(_login.name if _login.name else 'Toxygen User') - tox.self_set_status_message('Toxing on Toxygen') - ProfileHelper.save_profile(tox.get_savedata(), name) - else: # load existing profile - path, name = _login.get_data() - settings = Settings(name) - if _login.default: - Settings.set_auto_profile(path, name) - data = ProfileHelper.open_profile(path, name) - tox = tox_factory(data, settings) - else: - path, name = auto_profile - settings = Settings(name) - data = ProfileHelper.open_profile(path, name) - tox = tox_factory(data, settings) + self.mainloop.stop = True + self.mainloop.wait() + data = self.tox.get_savedata() + ProfileHelper.save_profile(data) + del self.tox - ms = MainWindow(tox) - ms.show() - QtGui.QApplication.setStyle(get_style(settings['theme'])) # set application style + def reset(self): + """ + Create new tox instance (new network settings) + :return: tox instance + """ + self.mainloop.stop = True + self.mainloop.wait() + self.init.terminate() + data = self.tox.get_savedata() + length = self.tox.get_savedata_size() + savedata = ''.join('{}'.format(data[i]) for i in xrange(length)) + ProfileHelper.save_profile(savedata) + del self.tox + # create new tox instance + self.tox = tox_factory(savedata, Settings.get_instance()) + # init thread + self.init = self.InitThread(self.tox, self.ms) + self.init.start() - # init thread - init = InitThread(tox, ms) - init.start() + # starting thread for tox iterate + self.mainloop = self.ToxIterateThread(self.tox) + self.mainloop.start() + return self.tox - # starting thread for tox iterate - mainloop = ToxIterateThread(tox) - mainloop.start() +# ----------------------------------------------------------------------------------------------------------------- +# Inner classes +# ----------------------------------------------------------------------------------------------------------------- - app.connect(app, QtCore.SIGNAL("lastWindowClosed()"), app, QtCore.SLOT("quit()")) - app.exec_() - mainloop.stop = True - mainloop.wait() - data = tox.get_savedata() - ProfileHelper.save_profile(data) - del tox + class InitThread(QtCore.QThread): + def __init__(self, tox, ms): + QtCore.QThread.__init__(self) + self.tox, self.ms = tox, ms -class InitThread(QtCore.QThread): + def run(self): + # initializing callbacks + init_callbacks(self.tox, self.ms) + # bootstrap + for data in node_generator(): + self.tox.bootstrap(*data) + self.msleep(10000) + while not self.tox.self_get_connection_status(): + for data in node_generator(): + self.tox.bootstrap(*data) + self.msleep(5000) - def __init__(self, tox, ms): - QtCore.QThread.__init__(self) - self.tox, self.ms = tox, ms + class ToxIterateThread(QtCore.QThread): - def run(self): - # initializing callbacks - init_callbacks(self.tox, self.ms) - # bootstrap - for data in node_generator(): - self.tox.bootstrap(*data) + def __init__(self, tox): + QtCore.QThread.__init__(self) + self.tox = tox + self.stop = False + def run(self): + while not self.stop: + self.tox.iterate() + self.msleep(self.tox.iteration_interval()) -class ToxIterateThread(QtCore.QThread): + class Login(object): - def __init__(self, tox): - QtCore.QThread.__init__(self) - self.tox = tox - self.stop = False + def __init__(self, arr): + self.arr = arr - def run(self): - while not self.stop: - self.tox.iterate() - self.msleep(self.tox.iteration_interval()) + def login_screen_close(self, t, number=-1, default=False, name=None): + """ Function which processes data from login screen + :param t: 0 - window was closed, 1 - new profile was created, 2 - profile loaded + :param number: num of choosen profile in list (-1 by default) + :param default: was or not choosen profile marked as default + :param name: name of new profile + """ + print str(t), str(number), str(default), str(name) + self.t = t + self.num = number + self.default = default + self.name = name + + def get_data(self): + return self.arr[self.num] if __name__ == '__main__': # TODO: add command line options - main() + toxygen = Toxygen() + toxygen.main() diff --git a/src/mainscreen.py b/src/mainscreen.py index bc31787..7c56f2f 100644 --- a/src/mainscreen.py +++ b/src/mainscreen.py @@ -20,10 +20,10 @@ class MessageArea(QtGui.QPlainTextEdit): class MainWindow(QtGui.QMainWindow): - def __init__(self, tox): + def __init__(self, tox, reset): super(MainWindow, self).__init__() - self.tox = tox - self.initUI() + self.reset = reset + self.initUI(tox) def setup_menu(self, MainWindow): self.menubar = QtGui.QMenuBar(MainWindow) @@ -194,7 +194,7 @@ class MainWindow(QtGui.QMainWindow): self.messages = QtGui.QListWidget(widget) self.messages.setGeometry(0, 0, 600, 250) - def initUI(self): + def initUI(self, tox): self.setMinimumSize(900, 550) self.setMaximumSize(900, 550) self.setGeometry(400, 400, 900, 550) @@ -227,7 +227,7 @@ class MainWindow(QtGui.QMainWindow): self.setup_menu(self) self.user_info = name self.friend_info = info - self.profile = Profile(self.tox, self) + self.profile = Profile(tox, self) def closeEvent(self, *args, **kwargs): self.profile.save_history() @@ -244,7 +244,7 @@ class MainWindow(QtGui.QMainWindow): msgBox.exec_() def network_settings(self): - self.n_s = NetworkSettings() + self.n_s = NetworkSettings(self.reset) self.n_s.show() def add_contact(self): diff --git a/src/menu.py b/src/menu.py index e864d0a..1cebf47 100644 --- a/src/menu.py +++ b/src/menu.py @@ -188,8 +188,9 @@ class ProfileSettings(CenteredWidget): class NetworkSettings(CenteredWidget): """Network settings form: UDP, Ipv6 and proxy""" # TODO: add possibility to change network settings - def __init__(self): + def __init__(self, reset): super(NetworkSettings, self).__init__() + self.reset = reset self.initUI() def initUI(self): @@ -248,10 +249,10 @@ class NetworkSettings(CenteredWidget): settings['udp_enabled'] = self.udp.isChecked() settings['proxy_type'] = int(self.proxy.isChecked()) settings['proxy_host'] = self.proxyip.text() - settings['proxy_port'] = self.proxyport.text() + settings['proxy_port'] = int(self.proxyport.text()) settings.save() # recreate tox instance - Profile.get_instance().reset() + Profile.get_instance().reset(self.reset) class PrivacySettings(CenteredWidget): diff --git a/src/profile.py b/src/profile.py index 94470cd..70cd6cb 100644 --- a/src/profile.py +++ b/src/profile.py @@ -393,7 +393,7 @@ class Profile(Contact, Singleton): self.screen.account_status.setText('') self._active_friend = -1 self.screen.account_avatar.setHidden(True) - self.screen.messages.clear() + self._messages.clear() self.screen.messageEdit.clear() return try: @@ -402,7 +402,7 @@ class Profile(Contact, Singleton): friend = self._friends[value] self._friends[self._active_friend].set_messages(False) self.screen.messageEdit.clear() - self.screen.messages.clear() + self._messages.clear() friend.load_corr() messages = friend.get_corr()[-42:] for message in messages: @@ -410,6 +410,7 @@ class Profile(Contact, Singleton): convert_time(message[2]), friend.name if message[1] else self._name, message[3]) + self._messages.scrollToBottom() else: friend = self._friends[self._active_friend] self.screen.account_name.setText(friend.name) @@ -637,14 +638,17 @@ class Profile(Contact, Singleton): # Reset # ----------------------------------------------------------------------------------------------------------------- - def reset(self): + def reset(self, restart): """ Recreate tox instance + :param restart: method which calls restart and returns new tox instance """ print 'In reset' - data = self.tox.get_savedata() - ProfileHelper.save_profile(data) - # TODO: recreate tox + del self.tox + self.tox = restart() + self.status = None + for friend in self._friends: + friend.status = None def tox_factory(data=None, settings=None):