Changeset 10126

Show
Ignore:
Timestamp:
08/04/08 15:34:29 (4 months ago)
Author:
asterix
Message:

make ChangeStatusMessageDialog? asychronous. see #4147

Location:
trunk/src
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/dialogs.py

    r10101 r10126  
    519519 
    520520class ChangeStatusMessageDialog: 
    521         def __init__(self, show = None): 
     521        def __init__(self, on_response, show = None): 
    522522                self.show = show 
     523                self.on_response = on_response 
    523524                self.xml = gtkgui_helpers.get_glade('change_status_message_dialog.glade') 
    524525                self.window = self.xml.get_widget('change_status_message_dialog') 
     
    564565                        self.message_liststore.append((msg_name,)) 
    565566                self.xml.signal_autoconnect(self) 
     567                if self.countdown_time > 0: 
     568                        self.countdown() 
     569                        gobject.timeout_add(1000, self.countdown) 
     570                self.window.connect('response', self.on_dialog_response) 
    566571                self.window.show_all() 
    567572 
     
    581586                        return False 
    582587 
    583         def run(self): 
    584                 '''Wait for OK or Cancel button to be pressed and return status messsage 
    585                 (None if users pressed Cancel or x button of WM''' 
    586                 if self.countdown_time > 0: 
    587                         self.countdown() 
    588                         gobject.timeout_add(1000, self.countdown) 
    589                 rep = self.window.run() 
    590                 if rep == gtk.RESPONSE_OK: 
     588        def on_dialog_response(self, dialog, response): 
     589                if response == gtk.RESPONSE_OK: 
    591590                        beg, end = self.message_buffer.get_bounds() 
    592591                        message = self.message_buffer.get_text(beg, end).decode('utf-8')\ 
     
    599598                        message = None # user pressed Cancel button or X wm button 
    600599                self.window.destroy() 
    601                 return message 
     600                self.on_response(message) 
    602601 
    603602        def on_message_combobox_changed(self, widget): 
  • trunk/src/roster_window.py

    r10104 r10126  
    20822082                        self.make_menu(force = True) 
    20832083 
    2084         def get_status_message(self, show): 
     2084        def get_status_message(self, show, on_response): 
    20852085                if show in gajim.config.get_per('defaultstatusmsg'): 
    20862086                        if gajim.config.get_per('defaultstatusmsg', show, 'enabled'): 
    2087                                 return gajim.config.get_per('defaultstatusmsg', show, 'message') 
     2087                                on_response(gajim.config.get_per('defaultstatusmsg', show, 
     2088                                        'message')) 
     2089                                return 
    20882090                if (show == 'online' and not gajim.config.get('ask_online_status')) or \ 
    20892091                (show in ('offline', 'invisible') 
    20902092                and not gajim.config.get('ask_offline_status')): 
    2091                         return '' 
    2092                 dlg = dialogs.ChangeStatusMessageDialog(show) 
     2093                        on_response('') 
     2094                        return 
     2095 
     2096                dlg = dialogs.ChangeStatusMessageDialog(on_response, show) 
    20932097                dlg.window.present() # show it on current workspace 
    2094                 message = dlg.run() 
    2095                 return message 
    20962098 
    20972099        def change_status(self, widget, account, status): 
    20982100                def change(account, status): 
    2099                         message = self.get_status_message(status) 
    2100                         if message is None: 
    2101                                 # user pressed Cancel to change status message dialog 
    2102                                 return 
    2103                         self.send_status(account, status, message) 
     2101                        def on_response(message): 
     2102                                if message is None: 
     2103                                        # user pressed Cancel to change status message dialog 
     2104                                        return 
     2105                                self.send_status(account, status, message) 
     2106                        self.get_status_message(status, on_response) 
    21042107 
    21052108                if status == 'invisible' and self.connected_rooms(account): 
     
    22202223                gtk.main_quit() 
    22212224 
    2222         def on_quit_request(self, widget = None): 
     2225        def on_quit_request(self, widget=None): 
    22232226                ''' user want to quit. Check if he should be warned about messages 
    22242227                pending. Terminate all sessions and send offline to all connected 
     
    22302233                                get_msg = True 
    22312234                                break 
    2232                 if get_msg: 
    2233                         message = self.get_status_message('offline') 
     2235 
     2236                def on_continue(message): 
    22342237                        if message is None: 
    22352238                                # user pressed Cancel to change status message dialog 
    22362239                                return 
    2237  
    2238                 # check if we have unread messages 
    2239                 unread = gajim.events.get_nb_events() 
    2240                 if not gajim.config.get('notify_on_all_muc_messages'): 
    2241                         unread_not_to_notify = gajim.events.get_nb_events(['printed_gc_msg']) 
    2242                         unread -= unread_not_to_notify 
    2243  
    2244                 # check if we have recent messages 
    2245                 recent = False 
    2246                 for win in gajim.interface.msg_win_mgr.windows(): 
    2247                         for ctrl in win.controls(): 
    2248                                 fjid = ctrl.get_full_jid() 
    2249                                 if gajim.last_message_time[ctrl.account].has_key(fjid): 
    2250                                         if time.time() - gajim.last_message_time[ctrl.account][fjid] < 2: 
    2251                                                 recent = True 
    2252                                                 break 
    2253                         if recent: 
    2254                                 break 
    2255  
    2256                 if unread or recent: 
    2257                         dialog = dialogs.ConfirmationDialog(_('You have unread messages'), 
    2258                                 _('Messages will only be available for reading them later if you' 
    2259                                 ' have history enabled and contact is in your roster.')) 
    2260                         if dialog.get_response() != gtk.RESPONSE_OK: 
    2261                                 return 
    2262  
    2263                 self.quit_on_next_offline = 0 
    2264                 for acct in accounts: 
    2265                         if gajim.connections[acct].connected: 
    2266                                 self.quit_on_next_offline += 1 
    2267                                 self.send_status(acct, 'offline', message) 
    2268  
    2269                 if not self.quit_on_next_offline: 
    2270                         self.quit_gtkgui_interface() 
     2240                        # check if we have unread messages 
     2241                        unread = gajim.events.get_nb_events() 
     2242                        if not gajim.config.get('notify_on_all_muc_messages'): 
     2243                                unread_not_to_notify = gajim.events.get_nb_events( 
     2244                                        ['printed_gc_msg']) 
     2245                                unread -= unread_not_to_notify 
     2246 
     2247                        # check if we have recent messages 
     2248                        recent = False 
     2249                        for win in gajim.interface.msg_win_mgr.windows(): 
     2250                                for ctrl in win.controls(): 
     2251                                        fjid = ctrl.get_full_jid() 
     2252                                        if gajim.last_message_time[ctrl.account].has_key(fjid): 
     2253                                                if time.time() - gajim.last_message_time[ctrl.account][fjid] < 2: 
     2254                                                        recent = True 
     2255                                                        break 
     2256                                if recent: 
     2257                                        break 
     2258 
     2259                        if unread or recent: 
     2260                                dialog = dialogs.ConfirmationDialog(_('You have unread messages'), 
     2261                                        _('Messages will only be available for reading them later if you' 
     2262                                        ' have history enabled and contact is in your roster.')) 
     2263                                if dialog.get_response() != gtk.RESPONSE_OK: 
     2264                                        return 
     2265 
     2266                        self.quit_on_next_offline = 0 
     2267                        for acct in accounts: 
     2268                                if gajim.connections[acct].connected: 
     2269                                        self.quit_on_next_offline += 1 
     2270                                        self.send_status(acct, 'offline', message) 
     2271 
     2272                        if not self.quit_on_next_offline: 
     2273                                self.quit_gtkgui_interface() 
     2274 
     2275                if get_msg: 
     2276                        self.get_status_message('offline', on_continue) 
     2277                else: 
     2278                        self.on_continue('') 
    22712279 
    22722280################################################################################ 
     
    25152523        def on_block(self, widget, titer, group_list): 
    25162524                ''' When clicked on the 'block' button in context menu. ''' 
    2517                 model = self.modelfilter 
    2518                 accounts = [] 
    2519                 msg = self.get_status_message('offline') 
    2520                 if group_list is None: 
    2521                         jid = model[titer][C_JID].decode('utf-8') 
    2522                         account = model[titer][C_ACCOUNT].decode('utf-8') 
    2523                         accounts.append(account) 
    2524                         self.send_status(account, 'offline', msg, to = jid) 
    2525                         new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', 
    2526                                 'value' : jid, 'child': [u'message', u'iq', u'presence-out']} 
    2527                         gajim.connections[account].blocked_list.append(new_rule) 
    2528                         # needed for draw_contact: 
    2529                         gajim.connections[account].blocked_contacts.append(jid) 
    2530                         self.draw_contact(jid, account) 
    2531                 else: 
    2532                         if titer is None: 
    2533                                 for (contact, account) in group_list: 
    2534                                         if account not in accounts: 
    2535                                                 if not gajim.connections[account].privacy_rules_supported: 
    2536                                                         continue 
    2537                                                 accounts.append(account) 
    2538                                         self.send_status(account, 'offline', msg, to=contact.jid) 
    2539                                         new_rule = {'order': u'1', 'type': u'jid', 
    2540                                                         'action': u'deny', 'value' : contact.jid, 
    2541                                                         'child': [u'message', u'iq', u'presence-out']} 
     2525                def on_continue(msg): 
     2526                        if msg is None: 
     2527                                # user pressed Cancel to change status message dialog 
     2528                                return 
     2529                        model = self.modelfilter 
     2530                        accounts = [] 
     2531                        if group_list is None: 
     2532                                jid = model[titer][C_JID].decode('utf-8') 
     2533                                account = model[titer][C_ACCOUNT].decode('utf-8') 
     2534                                accounts.append(account) 
     2535                                self.send_status(account, 'offline', msg, to = jid) 
     2536                                new_rule = {'order': u'1', 'type': u'jid', 'action': u'deny', 
     2537                                        'value' : jid, 'child': [u'message', u'iq', u'presence-out']} 
     2538                                gajim.connections[account].blocked_list.append(new_rule) 
     2539                                # needed for draw_contact: 
     2540                                gajim.connections[account].blocked_contacts.append(jid) 
     2541                                self.draw_contact(jid, account) 
     2542                        else: 
     2543                                if titer is None: 
     2544                                        for (contact, account) in group_list: 
     2545                                                if account not in accounts: 
     2546                                                        if not gajim.connections[account].privacy_rules_supported: 
     2547                                                                continue 
     2548                                                        accounts.append(account) 
     2549                                                self.send_status(account, 'offline', msg, to=contact.jid) 
     2550                                                new_rule = {'order': u'1', 'type': u'jid', 
     2551                                                                'action': u'deny', 'value' : contact.jid, 
     2552                                                                'child': [u'message', u'iq', u'presence-out']} 
     2553                                                gajim.connections[account].blocked_list.append(new_rule) 
     2554                                                # needed for draw_contact: 
     2555                                                gajim.connections[account].blocked_contacts.append( 
     2556                                                        contact.jid) 
     2557                                                self.draw_contact(contact.jid, account) 
     2558                                else: 
     2559                                        group = model[titer][C_JID].decode('utf-8') 
     2560                                        for (contact, account) in group_list: 
     2561                                                if account not in accounts: 
     2562                                                        if not gajim.connections[account].privacy_rules_supported: 
     2563                                                                continue 
     2564                                                        accounts.append(account) 
     2565                                                        # needed for draw_group: 
     2566                                                        gajim.connections[account].blocked_groups.append(group) 
     2567                                                        self.draw_group(group, account) 
     2568                                                self.send_status(account, 'offline', msg, to=contact.jid) 
     2569                                                self.draw_contact(contact.jid, account) 
     2570                                        new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', 
     2571                                                'value' : group, 'child': [u'message', u'iq', 
     2572                                                u'presence-out']} 
    25422573                                        gajim.connections[account].blocked_list.append(new_rule) 
    2543                                         # needed for draw_contact: 
    2544                                         gajim.connections[account].blocked_contacts.append(contact.jid) 
    2545                                         self.draw_contact(contact.jid, account) 
    2546                         else: 
    2547                                 group = model[titer][C_JID].decode('utf-8') 
    2548                                 for (contact, account) in group_list: 
    2549                                         if account not in accounts: 
    2550                                                 if not gajim.connections[account].privacy_rules_supported: 
    2551                                                         continue 
    2552                                                 accounts.append(account) 
    2553                                                 # needed for draw_group: 
    2554                                                 gajim.connections[account].blocked_groups.append(group) 
    2555                                                 self.draw_group(group, account) 
    2556                                         self.send_status(account, 'offline', msg, to=contact.jid) 
    2557                                         self.draw_contact(contact.jid, account) 
    2558                                 new_rule = {'order': u'1', 'type': u'group', 'action': u'deny', 
    2559                                         'value' : group, 'child': [u'message', u'iq', u'presence-out']} 
    2560                                 gajim.connections[account].blocked_list.append(new_rule) 
    2561                 for account in accounts: 
    2562                         gajim.connections[account].set_privacy_list( 
    2563                         'block', gajim.connections[account].blocked_list) 
    2564                 if len(gajim.connections[account].blocked_list) == 1: 
    2565                         gajim.connections[account].set_active_list('block') 
    2566                         gajim.connections[account].set_default_list('block') 
    2567                 gajim.connections[account].get_privacy_list('block') 
     2574                        for account in accounts: 
     2575                                gajim.connections[account].set_privacy_list( 
     2576                                'block', gajim.connections[account].blocked_list) 
     2577                        if len(gajim.connections[account].blocked_list) == 1: 
     2578                                gajim.connections[account].set_active_list('block') 
     2579                                gajim.connections[account].set_default_list('block') 
     2580                        gajim.connections[account].get_privacy_list('block') 
     2581 
     2582                self.get_status_message('offline', on_continue) 
    25682583 
    25692584        def on_unblock(self, widget, titer, group_list): 
     
    29552970        def on_change_status_message_activate(self, widget, account): 
    29562971                show = gajim.SHOW_LIST[gajim.connections[account].connected] 
    2957                 dlg = dialogs.ChangeStatusMessageDialog(show) 
    2958                 message = dlg.run() 
    2959                 if message is not None: # None is if user pressed Cancel 
    2960                         self.send_status(account, show, message) 
     2972                def on_response(message): 
     2973                        if message is not None: # None is if user pressed Cancel 
     2974                                self.send_status(account, show, message) 
     2975                dialogs.ChangeStatusMessageDialog(on_response, show) 
    29612976 
    29622977        def on_add_to_roster(self, widget, contact, account): 
     
    30633078                                if show == 'offline': 
    30643079                                        return True 
    3065                                 dlg = dialogs.ChangeStatusMessageDialog(show) 
    3066                                 message = dlg.run() 
    3067                                 if not message: 
    3068                                         return True 
    3069                                 for acct in gajim.connections: 
    3070                                         if not gajim.config.get_per('accounts', acct, 
    3071                                         'sync_with_global_status'): 
    3072                                                 continue 
    3073                                         current_show = gajim.SHOW_LIST[gajim.connections[acct].connected] 
    3074                                         self.send_status(acct, current_show, message) 
     3080                                def on_response(message): 
     3081                                        if message is None: 
     3082                                                return True 
     3083                                        for acct in gajim.connections: 
     3084                                                if not gajim.config.get_per('accounts', acct, 
     3085                                                'sync_with_global_status'): 
     3086                                                        continue 
     3087                                                current_show = gajim.SHOW_LIST[gajim.connections[acct].\ 
     3088                                                        connected] 
     3089                                                self.send_status(acct, current_show, message) 
     3090                                dialogs.ChangeStatusMessageDialog(on_response, show) 
    30753091                        return True 
    30763092 
     
    31653181        def on_send_custom_status(self, widget, contact_list, show, group=None): 
    31663182                '''send custom status''' 
    3167                 dlg = dialogs.ChangeStatusMessageDialog(show) 
    3168                 message = dlg.run() 
    3169                 if message is not None: # None if user pressed Cancel 
     3183                def on_response(message): 
     3184                        if message is None: # None if user pressed Cancel 
     3185                                return 
    31703186                        for (contact, account) in contact_list: 
    31713187                                our_jid = gajim.get_jid_from_account(account) 
     
    31833199                                        gajim.interface.status_sent_to_users[account] = {} 
    31843200                                gajim.interface.status_sent_to_users[account][contact.jid] = show 
     3201                dialogs.ChangeStatusMessageDialog(on_response, show) 
    31853202 
    31863203        def on_status_combobox_changed(self, widget): 
     
    32063223                        # do not change show, just show change status dialog 
    32073224                        status = model[self.previous_status_combobox_active][2].decode('utf-8') 
    3208                         dlg = dialogs.ChangeStatusMessageDialog(status) 
    3209                         message = dlg.run() 
    3210                         if message is not None: # None if user pressed Cancel 
    3211                                 for account in accounts: 
    3212                                         if not gajim.config.get_per('accounts', account, 
    3213                                                 'sync_with_global_status'): 
    3214                                                 continue 
    3215                                         current_show = gajim.SHOW_LIST[ 
    3216                                                 gajim.connections[account].connected] 
    3217                                         self.send_status(account, current_show, message) 
    3218                         self.combobox_callback_active = False 
    3219                         self.status_combobox.set_active( 
    3220                                 self.previous_status_combobox_active) 
    3221                         self.combobox_callback_active = True 
     3225                        def on_response(message): 
     3226                                if message is not None: # None if user pressed Cancel 
     3227                                        for account in accounts: 
     3228                                                if not gajim.config.get_per('accounts', account, 
     3229                                                        'sync_with_global_status'): 
     3230                                                        continue 
     3231                                                current_show = gajim.SHOW_LIST[ 
     3232                                                        gajim.connections[account].connected] 
     3233                                                self.send_status(account, current_show, message) 
     3234                                self.combobox_callback_active = False 
     3235                                self.status_combobox.set_active( 
     3236                                        self.previous_status_combobox_active) 
     3237                                self.combobox_callback_active = True 
     3238                        dialogs.ChangeStatusMessageDialog(on_response, status) 
    32223239                        return 
    32233240                # we are about to change show, so save this new show so in case 
     
    32463263                                        self.update_status_combobox() 
    32473264                                        return 
    3248                 message = self.get_status_message(status) 
    3249                 if message is None: # user pressed Cancel to change status message dialog 
     3265 
     3266                def on_continue(message): 
     3267                        if message is None: 
     3268                                # user pressed Cancel to change status message dialog 
     3269                                self.update_status_combobox() 
     3270                                return 
     3271                        global_sync_accounts = [] 
     3272                        for acct in accounts: 
     3273                                if gajim.config.get_per('accounts', acct, 
     3274                                'sync_with_global_status'): 
     3275                                        global_sync_accounts.append(acct) 
     3276                        global_sync_connected_accounts = \ 
     3277                                gajim.get_number_of_connected_accounts(global_sync_accounts) 
     3278                        for account in accounts: 
     3279                                if not gajim.config.get_per('accounts', account, 
     3280                                'sync_with_global_status'): 
     3281                                        continue 
     3282                                # we are connected (so we wanna change show and status) 
     3283                                # or no account is connected and we want to connect with new show 
     3284                                # and status 
     3285 
     3286                                if not global_sync_connected_accounts > 0 or \ 
     3287                                gajim.connections[account].connected > 0: 
     3288                                        self.send_status(account, status, message) 
    32503289                        self.update_status_combobox() 
    3251                         return 
    3252                 global_sync_accounts = [] 
    3253                 for acct in accounts: 
    3254                         if gajim.config.get_per('accounts', acct, 'sync_with_global_status'): 
    3255                                 global_sync_accounts.append(acct) 
    3256                 global_sync_connected_accounts = gajim.get_number_of_connected_accounts( 
    3257                         global_sync_accounts) 
    3258                 for account in accounts: 
    3259                         if not gajim.config.get_per('accounts', account, 
    3260                         'sync_with_global_status'): 
    3261                                 continue 
    3262                         # we are connected (so we wanna change show and status) 
    3263                         # or no account is connected and we want to connect with new show and 
    3264                         # status 
    3265  
    3266                         if not global_sync_connected_accounts > 0 or \ 
    3267                         gajim.connections[account].connected > 0: 
    3268                                 self.send_status(account, status, message) 
    3269                 self.update_status_combobox() 
     3290 
     3291                self.get_status_message(status, on_continue) 
    32703292 
    32713293        def on_preferences_menuitem_activate(self, widget): 
  • trunk/src/systray.py

    r10109 r10126  
    359359                active = gajim.interface.roster.status_combobox.get_active() 
    360360                status = model[active][2].decode('utf-8') 
    361                 dlg = dialogs.ChangeStatusMessageDialog(status) 
    362                 dlg.window.present() 
    363                 message = dlg.run() 
    364                 if message is not None: # None if user press Cancel 
     361                def on_response(message): 
     362                        if message is None: # None if user press Cancel 
     363                                return 
    365364                        accounts = gajim.connections.keys() 
    366365                        for acct in accounts: 
     
    370369                                show = gajim.SHOW_LIST[gajim.connections[acct].connected] 
    371370                                gajim.interface.roster.send_status(acct, show, message) 
     371                dlg = dialogs.ChangeStatusMessageDialog(on_response, status) 
     372                dlg.window.present() 
    372373 
    373374        def show_tooltip(self, widget):