Make Profile a GtkApplicationWindow

Fixes #9180
This commit is contained in:
Philipp Hörist 2018-07-01 13:30:13 +02:00
parent d6501898d8
commit 0dde1759e8
3 changed files with 1071 additions and 1077 deletions

File diff suppressed because it is too large Load Diff

View File

@ -268,9 +268,11 @@ class Interface:
self.show_vcard_when_connect.remove(account) self.show_vcard_when_connect.remove(account)
def edit_own_details(self, account): def edit_own_details(self, account):
if 'profile' not in self.instances[account]: window = app.get_app_window(profile_window.ProfileWindow)
self.instances[account]['profile'] = \ if window is None:
profile_window.ProfileWindow(account, app.interface.roster.window) profile_window.ProfileWindow(account)
else:
window.present()
@staticmethod @staticmethod
def handle_gc_error(gc_control, pritext, sectext): def handle_gc_error(gc_control, pritext, sectext):

View File

@ -20,43 +20,46 @@
## along with Gajim. If not, see <http://www.gnu.org/licenses/>. ## along with Gajim. If not, see <http://www.gnu.org/licenses/>.
## ##
# THIS FILE IS FOR **OUR** PROFILE (when we edit our INFO)
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GLib
from gi.repository import GdkPixbuf
import base64 import base64
import time import time
import logging import logging
import hashlib import hashlib
from gi.repository import Gtk
from gi.repository import Gdk
from gi.repository import GLib
from gajim import gtkgui_helpers from gajim import gtkgui_helpers
from gajim import dialogs from gajim import dialogs
from gajim.filechoosers import AvatarChooserDialog from gajim.filechoosers import AvatarChooserDialog
from gajim.common.const import AvatarSize from gajim.common.const import AvatarSize
from gajim.common import app from gajim.common import app
from gajim.common import ged from gajim.common import ged
log = logging.getLogger('gajim.profile') log = logging.getLogger('gajim.profile')
class ProfileWindow:
"""
Class for our information window
"""
def __init__(self, account, transient_for=None): class ProfileWindow(Gtk.ApplicationWindow):
def __init__(self, account):
Gtk.ApplicationWindow.__init__(self)
self.set_application(app.app)
self.set_position(Gtk.WindowPosition.CENTER)
self.set_show_menubar(False)
self.set_title(_('Profile'))
self.connect('destroy', self.on_profile_window_destroy)
self.connect('key-press-event', self.on_profile_window_key_press_event)
self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui') self.xml = gtkgui_helpers.get_gtk_builder('profile_window.ui')
self.window = self.xml.get_object('profile_window') self.add(self.xml.get_object('profile_box'))
self.window.set_transient_for(transient_for)
self.progressbar = self.xml.get_object('progressbar') self.progressbar = self.xml.get_object('progressbar')
self.statusbar = self.xml.get_object('statusbar') self.statusbar = self.xml.get_object('statusbar')
self.context_id = self.statusbar.get_context_id('profile') self.context_id = self.statusbar.get_context_id('profile')
self.account = account self.account = account
self.jid = app.get_jid_from_account(account) self.jid = app.get_jid_from_account(account)
account_label = app.config.get_per('accounts', account, 'account_label') account_label = app.config.get_per(
'accounts', account, 'account_label')
self.set_value('account_label', account_label) self.set_value('account_label', account_label)
self.dialog = None self.dialog = None
@ -64,17 +67,18 @@ class ProfileWindow:
self.avatar_encoded = None self.avatar_encoded = None
self.avatar_sha = None self.avatar_sha = None
self.message_id = self.statusbar.push(self.context_id, self.message_id = self.statusbar.push(self.context_id,
_('Retrieving profile…')) _('Retrieving profile…'))
self.update_progressbar_timeout_id = GLib.timeout_add(100, self.update_progressbar_timeout_id = GLib.timeout_add(
self.update_progressbar) 100, self.update_progressbar)
self.remove_statusbar_timeout_id = None self.remove_statusbar_timeout_id = None
self.xml.connect_signals(self) self.xml.connect_signals(self)
app.ged.register_event_handler('vcard-published', ged.GUI1, app.ged.register_event_handler('vcard-published', ged.GUI1,
self._nec_vcard_published) self._nec_vcard_published)
app.ged.register_event_handler('vcard-not-published', ged.GUI1, app.ged.register_event_handler('vcard-not-published', ged.GUI1,
self._nec_vcard_not_published) self._nec_vcard_not_published)
self.window.show_all()
self.show_all()
self.xml.get_object('ok_button').grab_focus() self.xml.get_object('ok_button').grab_focus()
app.connections[account].get_module('VCardTemp').request_vcard( app.connections[account].get_module('VCardTemp').request_vcard(
self._nec_vcard_received, self.jid) self._nec_vcard_received, self.jid)
@ -99,13 +103,13 @@ class ProfileWindow:
self._nec_vcard_published) self._nec_vcard_published)
app.ged.remove_event_handler('vcard-not-published', ged.GUI1, app.ged.remove_event_handler('vcard-not-published', ged.GUI1,
self._nec_vcard_not_published) self._nec_vcard_not_published)
del app.interface.instances[self.account]['profile']
if self.dialog: # Image chooser dialog if self.dialog: # Image chooser dialog
self.dialog.destroy() self.dialog.destroy()
def on_profile_window_key_press_event(self, widget, event): def on_profile_window_key_press_event(self, widget, event):
if event.keyval == Gdk.KEY_Escape: if event.keyval == Gdk.KEY_Escape:
self.window.destroy() self.destroy()
def _clear_photo(self, widget): def _clear_photo(self, widget):
# empty the image # empty the image
@ -124,10 +128,10 @@ class ProfileWindow:
sha = app.interface.save_avatar(path_to_file, publish=True) sha = app.interface.save_avatar(path_to_file, publish=True)
if sha is None: if sha is None:
dialogs.ErrorDialog( dialogs.ErrorDialog(
_('Could not load image'), transient_for=self.window) _('Could not load image'), transient_for=self)
return return
scale = self.window.get_scale_factor() scale = self.get_scale_factor()
surface = app.interface.get_avatar(sha, AvatarSize.VCARD, scale) surface = app.interface.get_avatar(sha, AvatarSize.VCARD, scale)
button = self.xml.get_object('PHOTO_button') button = self.xml.get_object('PHOTO_button')
@ -142,7 +146,7 @@ class ProfileWindow:
self.avatar_encoded = base64.b64encode(publish).decode('utf-8') self.avatar_encoded = base64.b64encode(publish).decode('utf-8')
self.avatar_mime_type = 'image/png' self.avatar_mime_type = 'image/png'
AvatarChooserDialog(on_ok, transient_for=self.window) AvatarChooserDialog(on_ok, transient_for=self)
def on_PHOTO_button_press_event(self, widget, event): def on_PHOTO_button_press_event(self, widget, event):
""" """
@ -178,7 +182,7 @@ class ProfileWindow:
if not widget.is_focus(): if not widget.is_focus():
pritext = _('Wrong date format') pritext = _('Wrong date format')
dialogs.ErrorDialog(pritext, _('Format of the date must be ' dialogs.ErrorDialog(pritext, _('Format of the date must be '
'YYYY-MM-DD'), transient_for=self.window) 'YYYY-MM-DD'), transient_for=self)
GLib.idle_add(lambda: widget.grab_focus()) GLib.idle_add(lambda: widget.grab_focus())
return True return True
@ -212,7 +216,7 @@ class ProfileWindow:
if 'TYPE' in vcard_[i]: if 'TYPE' in vcard_[i]:
self.avatar_mime_type = vcard_[i]['TYPE'] self.avatar_mime_type = vcard_[i]['TYPE']
scale = self.window.get_scale_factor() scale = self.get_scale_factor()
surface = app.interface.get_avatar( surface = app.interface.get_avatar(
self.avatar_sha, AvatarSize.VCARD, scale) self.avatar_sha, AvatarSize.VCARD, scale)
if surface is None: if surface is None:
@ -319,7 +323,7 @@ class ProfileWindow:
if app.connections[self.account].connected < 2: if app.connections[self.account].connected < 2:
dialogs.ErrorDialog(_('You are not connected to the server'), dialogs.ErrorDialog(_('You are not connected to the server'),
_('Without a connection, you can not publish your contact ' _('Without a connection, you can not publish your contact '
'information.'), transient_for=self.window) 'information.'), transient_for=self)
return return
vcard_, sha = self.make_vcard() vcard_, sha = self.make_vcard()
nick = '' nick = ''
@ -344,7 +348,7 @@ class ProfileWindow:
if self.update_progressbar_timeout_id is not None: if self.update_progressbar_timeout_id is not None:
GLib.source_remove(self.update_progressbar_timeout_id) GLib.source_remove(self.update_progressbar_timeout_id)
self.update_progressbar_timeout_id = None self.update_progressbar_timeout_id = None
self.window.destroy() self.destroy()
def _nec_vcard_not_published(self, obj): def _nec_vcard_not_published(self, obj):
if obj.conn.name != self.account: if obj.conn.name != self.account:
@ -361,7 +365,7 @@ class ProfileWindow:
self.update_progressbar_timeout_id = None self.update_progressbar_timeout_id = None
dialogs.InformationDialog(_('vCard publication failed'), dialogs.InformationDialog(_('vCard publication failed'),
_('There was an error while publishing your personal information, ' _('There was an error while publishing your personal information, '
'try again later.'), transient_for=self.window) 'try again later.'), transient_for=self)
def on_cancel_button_clicked(self, widget): def on_cancel_button_clicked(self, widget):
self.window.destroy() self.destroy()