Example #1
0
def update_bytag_combo_ids(self):
	self.bytag_combo_ids = {}
	self.bytag_combo_ids[0] = 0
	i = 1
	tags = Select(self.db.Tag.c, order_by='name')
	for tag in tags.execute().fetchall():
		self.bytag_combo_ids[i] = tag.tag_id
		i += 1
Example #2
0
def update_loanedto_combo_ids(self):
	self.loanedto_combo_ids = {}
	self.loanedto_combo_ids[0] = 0
	i = 1
	persons = Select(self.db.Person.c, order_by='name')
	for person in persons.execute().fetchall():
		self.loanedto_combo_ids[i] = person.person_id
		i += 1
Example #3
0
def update_collection_combo_ids(self):
	self.collection_combo_ids = {}
	self.collection_combo_ids[0] = 0
	i = 1
	collections = Select(self.db.Collection.c, order_by='name')
	for collection in collections.execute().fetchall():
		self.collection_combo_ids[i] = collection.collection_id
		i += 1
Example #4
0
def update_volume_combo_ids(self):
    self.volume_combo_ids = {}
    self.volume_combo_ids[0] = 0
    i = 1
    volumes = Select(self.db.Volume.c, order_by='name')
    for volume in volumes.execute().fetchall():
        self.volume_combo_ids[i] = volume.volume_id
        i += 1
	def run(self, name):
		"""Import movies, function called in a loop over source files"""
		from add import validate_details, edit_movie
		from gutils import find_next_available
		from sqlalchemy import Select, func
		import gtk
		
		if not self.set_source(name):
			self.debug.show("Can't read data from file %s" % name)
			return False
		
		self.widgets['pwindow'].show()
		while gtk.events_pending():	# give GTK some time for updates
			gtk.main_iteration()

		# progressbar
		update_on = []
		count = self.count_movies()
		if count > 0:
			for i in range(0,100):
				update_on.append(int(float(i)/100*count))

		statement = Select( [ func.max(self.db.Movie.c.number) ] )
		number = statement.execute().fetchone()[0]
		if number is None:
			number = 1
		else:
			number += 1

		statement = Select([self.db.Movie.c.number])

		processed = 0
		while self._abort is False:
			details = self.get_movie_details()
			if details is None:
				break

			processed += 1
			if processed in update_on:
				self.widgets['progressbar'].set_fraction(float(processed)/float(count))
				gtk.main_iteration()
				self.widgets['progressbar'].set_text("%s (%s/%s)" % (str(self.imported), str(processed), str(count)))
				gtk.main_iteration()
				gtk.main_iteration() # extra iteration for abort button

			if (details.has_key('o_title') and details['o_title']) or (details.has_key('title') and details['title']):
				if details.has_key('o_title') and details['o_title']:
					statement.whereclause = func.lower(self.db.Movie.c.o_title)==details['o_title'].lower()
					if details.has_key('title') and details['title']:
						statement.append_whereclause( func.lower(self.db.Movie.c.title)==details['title'].lower() )
					tmp = statement.execute().fetchone()
					if tmp is not None:
						self.debug.show("movie already exists (number=%s, o_title=%s)" % (tmp.number, details['o_title']))
						continue
				elif details.has_key('title') and details['title']:
					statement.whereclause = func.lower(self.db.Movie.c.title)==details['title'].lower()
					tmp = statement.execute().fetchone()
					if tmp is not None:
						self.debug.show("movie already exists (number=%s, title=%s)" % (tmp.number, details['title']))
						continue
				validate_details(details, self.fields_to_import)
				if self.edit is True:
					response = edit_movie(self.parent, details)	# FIXME: wait until save or cancel button pressed
					if response == 1:
						self.imported += 1
				else:
					if not details.has_key('number') or (details.has_key('number') and details['number'] is None):
						#details['number'] = find_next_available(self.db)
						details['number'] = number
						number += 1
					#movie = self.db.Movie()
					#movie.add_to_db(details)
					try:
						self.db.Movie.mapper.mapped_table.insert().execute(details)
						self.imported += 1
					except Exception, e:
						self.debug.show("movie details are not unique, skipping: %s" % str(e))
			else:
				self.debug.show('skipping movie without title or original title')
def populate(self, movies=None, where=None):#{{{
	if self.initialized is False:
		return False
	from sqlalchemy import Select, desc
	
	if movies is None:
		movies = Select([self.db.Movie.c.number,
			self.db.Movie.c.o_title, self.db.Movie.c.title,
			self.db.Movie.c.director, self.db.Movie.c.image,
			self.db.Movie.c.genre, self.db.Movie.c.seen,
			self.db.Movie.c.year, self.db.Movie.c.runtime,
			self.db.Movie.c.rating])

	if isinstance(movies, Select):
		if not where: # because of possible 'seen', 'loaned', 'collection_id' in where
			# seen / loaned
			loaned_only = self.widgets['menu']['loaned_movies'].get_active()
			not_seen_only = self.widgets['menu']['not_seen_movies'].get_active()
			if loaned_only:
				movies.append_whereclause(self.db.Movie.c.loaned==True)
			if not_seen_only:
				movies.append_whereclause(self.db.Movie.c.seen==False)
			# collection
			pos = self.widgets['filter']['collection'].get_active()
			if pos >= 0:
				col_id = self.collection_combo_ids[pos]
				if col_id > 0:
					movies.append_whereclause(self.db.Movie.c.collection_id==col_id)
			# volume
			pos = self.widgets['filter']['volume'].get_active()
			if pos >= 0:
				vol_id = self.volume_combo_ids[pos]
				if vol_id > 0:
					movies.append_whereclause(self.db.Movie.c.volume_id==vol_id)
			# loaned to
			pos = self.widgets['filter']['loanedto'].get_active()
			if pos >= 0:
				per_id = self.loanedto_combo_ids[pos]
				if per_id > 0:
					from sqlalchemy import join, exists, and_
					loan_exists = exists([self.db.Loan.c.movie_id], \
						and_(self.db.Movie.c.movie_id==self.db.Loan.c.movie_id, self.db.Loan.c.person_id==per_id, self.db.Loan.c.return_date==None))
					movies.append_whereclause(loan_exists)
					#loan_join = join(self.db.metadata.tables['movies'], \
					#	self.db.metadata.tables['loans'], \
					#	self.db.metadata.tables['movies'].c.movie_id==self.db.metadata.tables['loans'].c.movie_id)
					#movies = movies.select_from(loan_join)
			# tag
			pos = self.widgets['filter']['tag'].get_active()
			if pos >= 0:
				tag_id = self.bytag_combo_ids[pos]
				if tag_id > 0:
					from sqlalchemy import join, exists, and_
					tag_exists = exists([self.db.MovieTag.c.movie_id], \
						and_(self.db.Movie.c.movie_id==self.db.MovieTag.c.movie_id, self.db.MovieTag.c.tag_id==tag_id))
					movies.append_whereclause(tag_exists)
		
		# select sort column
		sort_column_name = self.config.get('sortby', 'number', section='mainlist')
		sort_reverse = self.config.get('sortby_reverse', False, section='mainlist')
		for i in sort_column_name.split(','):
			if self.db.Movie.c.has_key(i):
				if sort_reverse:
					movies.order_by_clause.append(desc(self.db.Movie.c[i]))
				else:
					movies.order_by_clause.append(self.db.Movie.c[i])
		
		# additional whereclause (volume_id, collection_id, ...)
		if where:
			for i in where:
				if self.db.Movie.c.has_key(i):
					movies.append_whereclause(self.db.Movie.c[i]==where[i])
		movies = movies.execute().fetchall()

	self.total = len(movies)
	# disable refreshing while inserting
	self.widgets['treeview'].freeze_child_notify()
	self.widgets['treeview'].set_model(None)

	# save user sort column
	sort_column_id, order = self.treemodel.get_sort_column_id()

	# new treemodel (faster and prevents some problems)
	self.treemodel = gtk.TreeStore(str, gtk.gdk.Pixbuf, str, str, str, str, bool, str, str, int)

	# check preferences to hide or show columns
	if self.config.get('number', True, 'mainlist') == True:
		self.number_column.set_visible(True)
	else:
		self.number_column.set_visible(False)
	if self.config.get('otitle', True, 'mainlist') == True:
		self.otitle_column.set_visible(True)
	else:
		self.otitle_column.set_visible(False)
	if self.config.get('title', True, 'mainlist') == True:
		self.title_column.set_visible(True)
	else:
		self.title_column.set_visible(False)
	if self.config.get('director', True, 'mainlist') == True:
		self.director_column.set_visible(True)
	else:
		self.director_column.set_visible(False)
	if self.config.get('image', True, 'mainlist') == True:
		self.image_column.set_visible(True)
	else:
		self.image_column.set_visible(False)
	if self.config.get('genre', True, 'mainlist') == True:
		self.genre_column.set_visible(True)
	else:
		self.genre_column.set_visible(False)
	if self.config.get('seen', True, 'mainlist') == True:
		self.seen_column.set_visible(True)
	else:
		self.seen_column.set_visible(False)
	if self.config.get('year', True, 'mainlist') == True:
		self.year_column.set_visible(True)
	else:
		self.year_column.set_visible(False)
	if self.config.get('runtime', True, 'mainlist') == True:
		self.runtime_column.set_visible(True)
	else:
		self.runtime_column.set_visible(False)
	if self.config.get('rating', True, 'mainlist') == True:
		self.rating_column.set_visible(True)
	else:
		self.rating_column.set_visible(False)
		
	for movie in movies:
		myiter = self.treemodel.append(None)
		
		self.treemodel.set_value(myiter,0,'%004d' % int(movie.number))

		if self.config.get('image', True, section='mainlist') == True:
			tmp_dest = self.locations['posters']
			tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))
			if movie.image and os.path.isfile(tmp_img):
				image_path = tmp_img
			else:
				image_path = os.path.join(self.locations['images'], 'default_thumbnail.png')
			# lets see if we have a scaled down thumbnail already created
			if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))):
				pass
			else:
				# if not, lets make one for future use :D
				original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image)
				if os.path.isfile(original_image):
					gutils.make_thumbnail(self, "%s.jpg" % movie.image)
				else:
					self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images'])
					pixbuf = self.Image.get_pixbuf()
			self.Image.set_from_file(image_path)
			pixbuf = self.Image.get_pixbuf()
			self.treemodel.set_value(myiter, 1, pixbuf)
		self.treemodel.set_value(myiter,2,movie.o_title)
		self.treemodel.set_value(myiter,3,movie.title)
		self.treemodel.set_value(myiter,4,movie.director)
		self.treemodel.set_value(myiter,5,movie.genre)
		self.treemodel.set_value(myiter,6,movie.seen)
		if movie.year is not None and isinstance(movie.year, int):
			self.treemodel.set_value(myiter,7,movie.year)
		if movie.runtime is not None and isinstance(movie.runtime, int):
			self.treemodel.set_value(myiter,8, '%003d' % movie.runtime + _(' min'))
		if movie.rating is not None and isinstance(movie.rating, int):
			self.treemodel.set_value(myiter,9,movie.rating)
		
	# restore user sort column
	if sort_column_id is not None:
		self.treemodel.set_sort_column_id(sort_column_id, gtk.SORT_ASCENDING)
	
	# add new treemodel and allow refreshs again
	self.widgets['treeview'].set_model(self.treemodel)
	self.widgets['treeview'].thaw_child_notify()
	self.widgets['treeview'].set_cursor_on_cell(0)
	self.count_statusbar()
def populate(self, movies=None, where=None):#{{{
	if self.initialized is False:
		return False
	from sqlalchemy import Select, desc
	
	if movies is None:
		movies = Select([self.db.Movie.c.number,
			self.db.Movie.c.o_title, self.db.Movie.c.title,
			self.db.Movie.c.director, self.db.Movie.c.image])

	if isinstance(movies, Select):
		if not where: # because of possible 'seen', 'loaned', 'collection_id' in where
			# seen / loaned
			loaned_only = self.widgets['menu']['loaned_movies'].get_active()
			not_seen_only = self.widgets['menu']['not_seen_movies'].get_active()
			if loaned_only:
				movies.append_whereclause(self.db.Movie.c.loaned==True)
			if not_seen_only:
				movies.append_whereclause(self.db.Movie.c.seen==False)
			# collection
			col_id = self.collection_combo_ids[self.widgets['filter']['collection'].get_active()]
			if col_id > 0:
				movies.append_whereclause(self.db.Movie.c.collection_id==col_id)
		
		# select sort column
		sort_column_name = self.config.get('sortby', 'number')
		sort_reverse = self.config.get('sortby_reverse', False)
		for i in sort_column_name.split(','):
			if self.db.Movie.c.has_key(i):
				if sort_reverse:
					movies.order_by_clause.append(desc(self.db.Movie.c[i]))
				else:
					movies.order_by_clause.append(self.db.Movie.c[i])
		
		# additional whereclause (volume_id, collection_id, ...)
		if where:
			for i in where:
				if self.db.Movie.c.has_key(i):
					movies.append_whereclause(self.db.Movie.c[i]==where[i])
		movies = movies.execute().fetchall()

	self.total = len(movies)
	# disable refreshing while inserting
	self.widgets['treeview'].freeze_child_notify()
	self.widgets['treeview'].set_model(None)

	# save user sort column
	sort_column_id, order = self.treemodel.get_sort_column_id()

	# new treemodel (faster and prevents some problems)
	self.treemodel = gtk.TreeStore(str, gtk.gdk.Pixbuf, str, str, str)

	# check preferences to hide or show columns
	if self.config.get('view_number', 'True') == 'True':
		self.number_column.set_visible(True)
	else:
		self.number_column.set_visible(False)
	if self.config.get('view_otitle', 'True') == 'True':
		self.otitle_column.set_visible(True)
	else:
		self.otitle_column.set_visible(False)
	if self.config.get('view_title', 'True') == 'True':
		self.title_column.set_visible(True)
	else:
		self.title_column.set_visible(False)
	if self.config.get('view_director', 'True') == 'True':
		self.director_column.set_visible(True)
	else:
		self.director_column.set_visible(False)
	if self.config.get('view_image', 'True') == 'True':
		self.image_column.set_visible(True)
	else:
		self.image_column.set_visible(False)
		
	for movie in movies:
		myiter = self.treemodel.append(None)
		
		self.treemodel.set_value(myiter,0,'%004d' % int(movie.number))

		if self.config.get('view_image', 'True') == 'True':
			tmp_dest = self.locations['posters']
			tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))
			if movie.image and os.path.isfile(tmp_img):
				image_path = tmp_img
			else:
				image_path = os.path.join(self.locations['images'], 'default_thumbnail.png')
			# lets see if we have a scaled down thumbnail already created
			if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))):
				pass
			else:
				# if not, lets make one for future use :D
				original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image)
				if os.path.isfile(original_image):
					gutils.make_thumbnail(self, "%s.jpg" % movie.image)
				else:
					self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images'])
					pixbuf = self.Image.get_pixbuf()
			self.Image.set_from_file(image_path)
			pixbuf = self.Image.get_pixbuf()
			self.treemodel.set_value(myiter, 1, pixbuf)
		self.treemodel.set_value(myiter,2,movie.o_title)
		self.treemodel.set_value(myiter,3,movie.title)
		self.treemodel.set_value(myiter,4,movie.director)
		
	# restore user sort column
	if sort_column_id is not None:
		self.treemodel.set_sort_column_id(sort_column_id, gtk.SORT_ASCENDING)
	
	# add new treemodel and allow refreshs again
	self.widgets['treeview'].set_model(self.treemodel)
	self.widgets['treeview'].thaw_child_notify()
	self.widgets['treeview'].set_cursor_on_cell(0)
    def export_simple_pdf(self):
        """exports a simple movie list to a pdf file"""
        
        if self.config.get('font', '') != '':
                self.fontName = 'custom_font'
                pdfmetrics.registerFont(TTFont(self.fontName, self.config.get('font', '')))
        else:
                self.fontName = "Helvetica"

        basedir = None
        if not self.config is None:
            basedir = self.config.get('export_dir', None, section='export-pdf')
        if basedir is None:
            filename = gutils.file_chooser(_("Export a PDF"), action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK),name="griffith_simple_list.pdf")
        else:
            filename = gutils.file_chooser(_("Export a PDF"), action=gtk.FILE_CHOOSER_ACTION_SAVE, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK),name="griffith_simple_list.pdf",folder=basedir)
        if filename is not False and filename[0]:
            if not self.config is None and filename[1]:
                self.config.set('export_dir', filename[1], section='export-pdf')
                self.config.save()
            overwrite = None
            pdffilename = filename[0].decode('utf-8')
            if os.path.isfile(pdffilename):
                response = gutils.question(self,_("File exists. Do you want to overwrite it?"),1,self.parent)
                if response==-8:
                    overwrite = True
                else:
                    overwrite = False
                    
            if overwrite == True or overwrite is None:
                # filename encoding
                defaultLang, defaultEnc = getdefaultlocale()
                if defaultEnc is None:
                    defaultEnc = 'UTF-8'
                c = SimpleDocTemplate(pdffilename.encode(defaultEnc))
                # data encoding
                #if defaultEncoding == 'WinAnsiEncoding':
                #    defaultEnc = 'cp1252'
                #else:
                defaultEnc = 'utf-8'
                style = self.styles["Normal"]
                Story = [Spacer(1,2*inch)]
                # define some custom stylesheetfont
                total = self.db.Movie.count()
                p = Paragraph("<font name='" + self.fontName +"' size=\"18\">" + saxutils.escape((_("List of films")).encode('utf-8')) + '</font>', self.styles["Heading1"] )
                Story.append(p)
                Story.append(Paragraph(" ",style))
                p = Paragraph("<font name='" + self.fontName +"' size=\"10\">" + saxutils.escape((_("Total Movies: %s") % str(total)).encode('utf-8'))  + '</font>', self.styles["Heading3"])
                Story.append(p)
                Story.append(Paragraph(" ",style))
                movies = Select(self.db.Movie.c)
                # select sort column
                sort_column_name = self.config.get('sortby', 'number', section='mainlist')
                sort_reverse = self.config.get('sortby_reverse', False, section='mainlist')
                do_grouping = True
                for i in sort_column_name.split(','):
                    if i != 'title' and i != 'o_title':
                        do_grouping = False
                    if self.db.Movie.c.has_key(i):
                        if sort_reverse:
                            movies.order_by_clause.append(desc(self.db.Movie.c[i]))
                        else:
                            movies.order_by_clause.append(self.db.Movie.c[i])
                movies = movies.execute().fetchall()
                first_letter = ''
                for movie in movies:
                    number = movie.number
                    original_title = str(movie.o_title).encode(defaultEnc)
                    title = str(movie.title).encode(defaultEnc)
                    grouping_title = movie.title
                    if grouping_title is None:
                        grouping_title = u'None'
                    if movie.director:
                        director = ' - ' + str(movie.director).encode(defaultEnc)
                    else:
                        director = ""
                    # group by first letter
                    # use movie.title/grouping_title for grouping because of encoding problems !!!
                    if do_grouping and grouping_title[0] != first_letter:
                        if grouping_title[0] in '0123456789':
                            # Group Numbers
                            if first_letter != '0-9':
                                first_letter = '0-9'
                                paragraph_text = '<font name=' + self.fontName + ' size="15">' + saxutils.escape(first_letter) + '</fonts>'
                                p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading2'])
                                Story.append(p)
                        else:
                            first_letter = grouping_title[0]
                            paragraph_text = '<font name=' + self.fontName + ' size="15">' + saxutils.escape(first_letter) + '</fonts>'
                            p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Heading2'])
                            Story.append(p)
                    # add movie title
                    paragraph_text = '<font name=' + self.fontName + ' size="7">' + \
                        '<b>'+ saxutils.escape(title) + '</b>' + \
                        saxutils.escape(' (' + original_title + '), ' + director + ' | ' + str(number)) + \
                        '</font>'
                    p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
                    Story.append(p)
                    if not movie.genre is None:
                        paragraph_text = '<font name=' + self.fontName + ' size="5">' + \
                        '<b>' + _('Genre') + ': </b>' + saxutils.escape(str(movie.genre).encode(defaultEnc)) + \
                        '</font>'
                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
                        Story.append(p)
                    if not movie.cast is None:
                        paragraph_text = '<i><font name=' + self.fontName + ' size="5">' + \
                        '<b>' + _('Cast') + ': </b>' + saxutils.escape('; '.join(str(movie.cast).encode(defaultEnc).split("\n")[0:2])) + \
                            '</font></i>'
                        p = Paragraph(paragraph_text.decode(defaultEnc), self.styles['Normal'])
                        Story.append(p)
                c.build(Story, onFirstPage=self.page_template, onLaterPages=self.page_template)
                gutils.info(self, _('PDF has been created.'), self.parent)
def populate(self, movies=None, where=None):#{{{
    import sys
    if self.initialized is False:
        return False
    from sqlalchemy import Select, desc
    
    if movies is None:
        movies = Select([self.db.Movie.c.number,
            self.db.Movie.c.o_title, self.db.Movie.c.title,
            self.db.Movie.c.director, self.db.Movie.c.image,
            self.db.Movie.c.genre, self.db.Movie.c.seen,
            self.db.Movie.c.year, self.db.Movie.c.runtime])
            
    if isinstance(movies, Select):
        """if not where: # because of possible 'seen', 'loaned', 'collection_id' in where
            # seen / loaned
            #loaned_only = self.widgets['menu']['loaned_movies'].get_active()
            #not_seen_only = self.widgets['menu']['not_seen_movies'].get_active()
            pass
            if loaned_only:
                movies.append_whereclause(self.db.Movie.c.loaned==True)
            if not_seen_only:
                movies.append_whereclause(self.db.Movie.c.seen==False)
            # collection
            #pos = self.widgets['filter']['collection'].get_active()
            if pos >= 0:
                #col_id = self.collection_combo_ids[pos]
                if col_id > 0:
                    movies.append_whereclause(self.db.Movie.c.collection_id==col_id)
            # volume
            #pos = self.widgets['filter']['volume'].get_active()
            if pos >= 0:
                #vol_id = self.volume_combo_ids[pos]
                if vol_id > 0:
                    movies.append_whereclause(self.db.Movie.c.volume_id==vol_id)
        """
        # select sort column
        sort_column_name = self.config.get('sortby', 'number', section='mainlist')
        sort_reverse = self.config.get('sortby_reverse', False, section='mainlist')
        for i in sort_column_name.split(','):
            if self.db.Movie.c.has_key(i):
                if sort_reverse:
                    movies.append_order_by(desc(self.db.Movie.c[i]))
                else:
                    #movies.append_order_by(self.db.Movie.c[i])
                    pass
        
        # additional whereclause (volume_id, collection_id, ...)
        if where:
            for i in where:
                if self.db.Movie.c.has_key(i):
                    movies.append_whereclause(self.db.Movie.c[i]==where[i])
        movies = movies.execute().fetchall()

    self.main_listcontrol.DeleteAllItems()

    for movie in movies:
        index = self.main_listcontrol.InsertStringItem(sys.maxint, str(movie.number))
        self.main_listcontrol.SetStringItem(index, 1, unicode(movie.o_title))
        self.main_listcontrol.SetStringItem(index, 2, unicode(movie.title))
        self.main_listcontrol.SetStringItem(index, 3, unicode(movie.director))
        self.main_listcontrol.SetStringItem(index, 4, unicode(movie.genre))
        self.main_listcontrol.SetStringItem(index, 5, str(movie.seen))
        self.main_listcontrol.SetStringItem(index, 6, str(movie.year))
        self.main_listcontrol.SetStringItem(index, 7, str(movie.runtime))
   
    statusbar.count_statusbar(self)
        
    self.main_listcontrol.SetColumnWidth(0, 40)
    self.main_listcontrol.SetColumnWidth(1, wx.LIST_AUTOSIZE)
    self.main_listcontrol.SetColumnWidth(2, wx.LIST_AUTOSIZE)
    self.main_listcontrol.SetColumnWidth(3, wx.LIST_AUTOSIZE)
def populate(self, movies=None, where=None):#{{{
	from sqlalchemy import Select, desc
	
	if movies is None:
		movies = Select([self.db.Movie.c.number,
			self.db.Movie.c.o_title, self.db.Movie.c.title,
			self.db.Movie.c.director, self.db.Movie.c.image])

	if isinstance(movies, Select):
		if not where: # because of possible 'seen', 'loaned', 'collection_id' in where
			# seen / loaned
			loaned_only = self.widgets['menu']['loaned_movies'].get_active()
			not_seen_only = self.widgets['menu']['not_seen_movies'].get_active()
			if loaned_only:
				movies.append_whereclause(self.db.Movie.c.loaned==True)
			if not_seen_only:
				movies.append_whereclause(self.db.Movie.c.seen==False)
			# collection
			col_id = self.collection_combo_ids[self.widgets['filter']['collection'].get_active()]
			if col_id > 0:
				movies.append_whereclause(self.db.Movie.c.collection_id==col_id)
		
		# select sort column
		sort_column_name = self.config.get('sortby', 'number')
		sort_reverse = self.config.get('sortby_reverse', False)
		for i in sort_column_name.split(','):
			if self.db.Movie.c.has_key(i):
				if sort_reverse:
					movies.order_by_clause.append(desc(self.db.Movie.c[i]))
				else:
					movies.order_by_clause.append(self.db.Movie.c[i])
		
		# additional whereclause (volume_id, collection_id, ...)
		if where:
			for i in where:
				if self.db.Movie.c.has_key(i):
					movies.append_whereclause(self.db.Movie.c[i]==where[i])
		movies = movies.execute().fetchall()

	self.total = len(movies)
	self.treemodel.clear()
	for movie in movies:
		myiter = self.treemodel.append(None)
		self.treemodel.set_value(myiter,0,'%004d' % int(movie.number))

		# check preferences to hide or show columns
		if self.config.get('view_otitle') == 'True':
			self.otitle_column.set_visible(True)
		else:
			self.otitle_column.set_visible(False)
		if self.config.get('view_title') == 'True':
			self.title_column.set_visible(True)
		else:
			self.title_column.set_visible(False)
		if self.config.get('view_director') == 'True':
			self.director_column.set_visible(True)
		else:
			self.director_column.set_visible(False)
		if self.config['view_image'] == 'True':
			self.image_column.set_visible(True)
			tmp_dest = self.locations['posters']
			tmp_img = os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))
			if movie.image and os.path.isfile(tmp_img):
				image_path = tmp_img
			else:
				image_path = os.path.join(self.locations['images'], 'default_thumbnail.png')
			# lets see if we have a scaled down thumbnail already created
			if os.path.isfile(os.path.join(tmp_dest, "t_%s.jpg" % str(movie.image))):
				pass
			else:
				# if not, lets make one for future use :D
				original_image = os.path.join(tmp_dest, "%s.jpg" % movie.image)
				if os.path.isfile(original_image):
					gutils.make_thumbnail(self, "%s.jpg" % movie.image)
				else:
					self.Image.set_from_file("%s/default_thumbnail.png" % self.locations['images'])
					pixbuf = self.Image.get_pixbuf()
			self.Image.set_from_file(image_path)
			pixbuf = self.Image.get_pixbuf()
			self.treemodel.set_value(myiter, 1, pixbuf)

		else:
			# let's hide image column from main treeview since we don't want it to be visible
			self.image_column.set_visible(False)
		self.treemodel.set_value(myiter,2,movie.o_title)
		self.treemodel.set_value(myiter,3,movie.title)
		self.treemodel.set_value(myiter,4,movie.director)