Show
Ignore:
Timestamp:
08/29/07 22:44:31 (15 months ago)
Author:
roidelapluie
Message:

Scroll to the end when we shrink conversation window. Fix #3078.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/gajim_0.11.1/src/chat_control.py

    r7984 r8596  
    145145                        self.on_conversation_vadjustment_value_changed) 
    146146                self.handlers[id] = widget 
     147                id = widget.connect('changed', 
     148                        self.on_conversation_vadjustment_changed) 
     149                self.handlers[id] = widget 
     150                self.scroll_to_end_id = None 
     151                self.was_at_the_end = True 
    147152                # add MessageTextView to UI and connect signals 
    148153                self.msg_scrolledwindow = self.xml.get_widget('message_scrolledwindow') 
     
    552557                textview = self.conv_textview 
    553558                end = False 
    554                 if textview.at_the_end() or kind == 'outgoing': 
     559                if self.was_at_the_end or kind == 'outgoing': 
    555560                        end = True 
    556561                textview.print_conversation_line(text, jid, kind, name, tim, 
     
    658663                if state: 
    659664                        jid = self.contact.jid 
    660                         if self.conv_textview.at_the_end(): 
     665                        if self.was_at_the_end: 
    661666                                # we are at the end 
    662667                                type_ = 'printed_' + self.type_id 
     
    673678        def bring_scroll_to_end(self, textview, diff_y = 0): 
    674679                ''' scrolls to the end of textview if end is not visible ''' 
     680                if self.scroll_to_end_id: 
     681                        # a scroll is already planned 
     682                        return 
    675683                buffer = textview.get_buffer() 
    676684                end_iter = buffer.get_end_iter() 
     
    679687                # scroll only if expected end is not visible 
    680688                if end_rect.y >= (visible_rect.y + visible_rect.height + diff_y): 
    681                         gobject.idle_add(self.scroll_to_end_iter, textview) 
     689                        self.scroll_to_end_id = gobject.idle_add(self.scroll_to_end_iter, 
     690                                textview) 
    682691 
    683692        def scroll_to_end_iter(self, textview): 
     
    685694                end_iter = buffer.get_end_iter() 
    686695                textview.scroll_to_iter(end_iter, 0, False, 1, 1) 
     696                self.scroll_to_end_id = None 
    687697                return False 
    688698 
     
    742752                return True 
    743753 
    744         def on_conversation_vadjustment_value_changed(self, widget): 
     754        def on_conversation_vadjustment_changed(self, adjustment): 
     755                # used to stay at the end of the textview when we shrink conversation 
     756                # textview. 
     757                if self.was_at_the_end: 
     758                        self.conv_textview.bring_scroll_to_end(-18) 
     759                self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18 
     760 
     761        def on_conversation_vadjustment_value_changed(self, adjustment): 
     762                self.was_at_the_end = (adjustment.upper - adjustment.value - adjustment.page_size) < 18 
    745763                if self.resource: 
    746764                        jid = self.contact.get_full_jid() 
     
    754772                        return 
    755773                if self.conv_textview.at_the_end() and \ 
    756                                 self.parent_win.get_active_control() == self and \ 
    757                                 self.parent_win.window.is_active(): 
     774                self.parent_win.get_active_control() == self and \ 
     775                self.parent_win.window.is_active(): 
    758776                        # we are at the end 
    759                         type_ = self.type_id 
    760                         if type_ == message_control.TYPE_GC: 
    761                                 type_ = 'gc_msg' 
    762777                        if not gajim.events.remove_events(self.account, self.get_full_jid(), 
    763778                        types = ['printed_' + type_, type_]):