history window now marks progressively days that have logs in selected month (thanks to gtasklets/pseudo-threads idea by the great Gustavo)
This commit is contained in:
		
							parent
							
								
									a9c82d0fcf
								
							
						
					
					
						commit
						313f72667e
					
				
					 1 changed files with 31 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -19,6 +19,7 @@
 | 
			
		|||
 | 
			
		||||
import gtk
 | 
			
		||||
import gtk.glade
 | 
			
		||||
import gobject
 | 
			
		||||
import time
 | 
			
		||||
import calendar
 | 
			
		||||
import os
 | 
			
		||||
| 
						 | 
				
			
			@ -46,8 +47,11 @@ class HistoryWindow:
 | 
			
		|||
	def __init__(self, jid, account):
 | 
			
		||||
		self.jid = jid
 | 
			
		||||
		self.account = account
 | 
			
		||||
		self.mark_days_idle_call_id = None
 | 
			
		||||
		
 | 
			
		||||
		xml = gtk.glade.XML(GTKGUI_GLADE, 'history_window', APP)
 | 
			
		||||
		self.window = xml.get_widget('history_window')
 | 
			
		||||
		
 | 
			
		||||
		if account and gajim.contacts[account].has_key(jid):
 | 
			
		||||
			contact = gajim.get_first_contact_instance_from_jid(account, jid)
 | 
			
		||||
			title = _('Conversation History with %s') % contact.name
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +61,10 @@ class HistoryWindow:
 | 
			
		|||
		self.history_buffer = xml.get_widget('history_textview').get_buffer()
 | 
			
		||||
		
 | 
			
		||||
		xml.signal_autoconnect(self)
 | 
			
		||||
		
 | 
			
		||||
		calendar = xml.get_widget('calendar')
 | 
			
		||||
		calendar.emit('month-changed') # fake event so we start mark days procedure
 | 
			
		||||
		
 | 
			
		||||
 | 
			
		||||
		tag = self.history_buffer.create_tag('incoming')
 | 
			
		||||
		color = gajim.config.get('inmsgcolor')
 | 
			
		||||
| 
						 | 
				
			
			@ -87,19 +95,32 @@ class HistoryWindow:
 | 
			
		|||
		month = gtkgui_helpers.make_gtk_month_python_month(month)
 | 
			
		||||
		self.add_lines_for_date(year, month, day)
 | 
			
		||||
		
 | 
			
		||||
	def on_calendar_month_changed(self, widget):
 | 
			
		||||
		return #FIXME: commit this when it works as it should
 | 
			
		||||
		year, month, day = widget.get_date() # integers
 | 
			
		||||
		month = gtkgui_helpers.make_gtk_month_python_month(month)
 | 
			
		||||
	def do_possible_mark_for_days_in_this_month(self, widget, year, month):
 | 
			
		||||
		'''this is a generator and does pseudo-threading via idle_add()
 | 
			
		||||
		so it runs progressively! yea :)
 | 
			
		||||
		asks for days in this month if they have logs it bolds them (marks them)'''
 | 
			
		||||
		weekday, days_in_this_month = calendar.monthrange(year, month)
 | 
			
		||||
		for day in xrange(1, days_in_this_month + 1): # count from 1, so add 1 more
 | 
			
		||||
			#FIXME: optimize (ask db once per month and store days that have logs)
 | 
			
		||||
			# return those here in tupple
 | 
			
		||||
			#print 'ask', year, month, day
 | 
			
		||||
		# count from 1 (gtk counts from 1), so add 1 more
 | 
			
		||||
		for day in xrange(1, days_in_this_month + 1):
 | 
			
		||||
			#print 'ask for logs for date:', year, month, day
 | 
			
		||||
			if gajim.logger.date_has_logs(self.jid, year, month, day):
 | 
			
		||||
				widget.mark_day(day)
 | 
			
		||||
			else:
 | 
			
		||||
				widget.unmark_day(day)
 | 
			
		||||
			yield True # we have more work to do
 | 
			
		||||
		yield False # we're done with this work
 | 
			
		||||
	
 | 
			
		||||
	def on_calendar_month_changed(self, widget):
 | 
			
		||||
		year, month, day = widget.get_date() # integers
 | 
			
		||||
		# in gtk January is 1, in python January is 0,
 | 
			
		||||
		# I want the second
 | 
			
		||||
		# first day of month is 1 not 0
 | 
			
		||||
		if self.mark_days_idle_call_id:
 | 
			
		||||
			# if user changed month, and we have a generator filling mark days
 | 
			
		||||
			# stop him from marking dates for the previously selected month
 | 
			
		||||
			gobject.source_remove(self.mark_days_idle_call_id)
 | 
			
		||||
		widget.clear_marks()
 | 
			
		||||
		month = gtkgui_helpers.make_gtk_month_python_month(month)
 | 
			
		||||
		self.mark_days_idle_call_id = gobject.idle_add(
 | 
			
		||||
			self.do_possible_mark_for_days_in_this_month(widget, year, month).next)
 | 
			
		||||
 | 
			
		||||
	def get_string_show_from_constant_int(self, show):
 | 
			
		||||
		if show == constants.SHOW_ONLINE:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue