|  | @@ -63,7 +63,7 @@ class DataBase:
 | 
	
		
			
				|  |  |  	def log(self, fileName, comment):
 | 
	
		
			
				|  |  |  		''' TODO: convert filename to canonical '''
 | 
	
		
			
				|  |  |  		c = self.db.cursor()
 | 
	
		
			
				|  |  | -		s = os.stat(fileName)
 | 
	
		
			
				|  |  | +		s = os.lstat(fileName)
 | 
	
		
			
				|  |  |  		print "params: %s %s %d %s %s" % ((os.path.abspath(fileName), 
 | 
	
		
			
				|  |  |  				DataBase.epochToDb(s.st_mtime), s.st_size, comment, 
 | 
	
		
			
				|  |  |  				DataBase.epochToDb(time.time())))
 | 
	
	
		
			
				|  | @@ -113,12 +113,16 @@ def parse():
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  class FileObj():
 | 
	
		
			
				|  |  | +	FILE_IS_DIR = -1
 | 
	
		
			
				|  |  | +	FILE_IS_LINK = -2
 | 
	
		
			
				|  |  |  	def __init__(self, fileName):
 | 
	
		
			
				|  |  |  		self.fileName = fileName
 | 
	
		
			
				|  |  | -		s = os.stat(fileName)
 | 
	
		
			
				|  |  | +		s = os.lstat(fileName)
 | 
	
		
			
				|  |  |  		self.date = DataBase.epochToDb(s.st_mtime)
 | 
	
		
			
				|  |  |  		if stat.S_ISDIR(s.st_mode):
 | 
	
		
			
				|  |  | -			self.size = -1
 | 
	
		
			
				|  |  | +			self.size = FileObj.FILE_IS_DIR
 | 
	
		
			
				|  |  | +		elif stat.S_ISLNK(s.st_mode):
 | 
	
		
			
				|  |  | +			self.size = FileObj.FILE_IS_LINK
 | 
	
		
			
				|  |  |  		else:
 | 
	
		
			
				|  |  |  			self.size = s.st_size
 | 
	
		
			
				|  |  |  		self.comment = ''
 | 
	
	
		
			
				|  | @@ -139,6 +143,7 @@ class FileObj():
 | 
	
		
			
				|  |  |  		# we need to move these cases out to a handler 
 | 
	
		
			
				|  |  |  		except Exception as e:
 | 
	
		
			
				|  |  |  			print("problem setting the comment on file %s" % (self.fileName,))
 | 
	
		
			
				|  |  | +			print("error "+e)
 | 
	
		
			
				|  |  |  			if os.access(self.fileName, os.W_OK)!=True:
 | 
	
		
			
				|  |  |  				print("you don't appear to have write permissions on this file")
 | 
	
		
			
				|  |  |  				# change the listbox background to yellow
 | 
	
	
		
			
				|  | @@ -153,6 +158,7 @@ class FileObj():
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # sortable TableWidgetItem, based on idea by Aledsandar
 | 
	
		
			
				|  |  |  # http://stackoverflow.com/questions/12673598/python-numerical-sorting-in-qtablewidget
 | 
	
		
			
				|  |  | +# NOTE: the QTableWidgetItem has setData() and data() which may allow data bonding
 | 
	
		
			
				|  |  |  class SortableTableWidgetItem(QTableWidgetItem):
 | 
	
		
			
				|  |  |  	def __init__(self, text, sortValue):
 | 
	
		
			
				|  |  |  		QTableWidgetItem.__init__(self, text, QTableWidgetItem.UserType)
 | 
	
	
		
			
				|  | @@ -236,9 +242,11 @@ class DirNotes(QMainWindow):
 | 
	
		
			
				|  |  |  		mf.addAction("Sort by size", self.sbs, "Ctrl+Z")
 | 
	
		
			
				|  |  |  		mf.addAction("Sort by comment", self.sbc, "Ctrl+.")
 | 
	
		
			
				|  |  |  		mf.addAction("Restore comment from database", self.restore_from_database, "Ctrl+R")
 | 
	
		
			
				|  |  | +		mf.addSeparator()
 | 
	
		
			
				|  |  | +		mf.addAction("Quit", self.close, "Ctrl+Q")
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -		QShortcut(QKeySequence("Ctrl+Q"), self, self.close)	
 | 
	
		
			
				|  |  | -		self.setWindowTitle("DirNotes")
 | 
	
		
			
				|  |  | +		#~ QShortcut(QKeySequence("Ctrl+Q"), self, self.close)	
 | 
	
		
			
				|  |  | +		self.setWindowTitle("DirNotes   Alt-F for menu  Dir: "+self.curPath)
 | 
	
		
			
				|  |  |  		self.setMinimumSize(600,700)
 | 
	
		
			
				|  |  |  		lb.setFocus()
 | 
	
		
			
				|  |  |  	def closeEvent(self,e):
 | 
	
	
		
			
				|  | @@ -263,6 +271,7 @@ class DirNotes(QMainWindow):
 | 
	
		
			
				|  |  |  		small_font = QFont("",8)
 | 
	
		
			
				|  |  |  		dirIcon = QIcon.fromTheme('folder')
 | 
	
		
			
				|  |  |  		fileIcon = QIcon.fromTheme('text-x-generic')
 | 
	
		
			
				|  |  | +		linkIcon = QIcon.fromTheme('emblem-symbolic-link')
 | 
	
		
			
				|  |  |  		current, dirs, files = os.walk(self.curPath,followlinks=True).next()
 | 
	
		
			
				|  |  |  		dirs = map(lambda x:x+'/', dirs)
 | 
	
		
			
				|  |  |  		dirs.sort()
 | 
	
	
		
			
				|  | @@ -271,9 +280,12 @@ class DirNotes(QMainWindow):
 | 
	
		
			
				|  |  |  		d = dirs + files
 | 
	
		
			
				|  |  |  		self.lb.setRowCount(len(d))
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +		#~ self.files = {}
 | 
	
		
			
				|  |  |  		self.files = []
 | 
	
		
			
				|  |  | +		# this is a list of all the file
 | 
	
		
			
				|  |  |  		for i in range(len(d)):
 | 
	
		
			
				|  |  |  			this_file = FileObj(current+'/'+d[i])
 | 
	
		
			
				|  |  | +			#~ self.files.update({this_file.getName(),this_file})
 | 
	
		
			
				|  |  |  			self.files = self.files + [this_file]
 | 
	
		
			
				|  |  |  			item = QTableWidgetItem(d[i])
 | 
	
		
			
				|  |  |  			item.setFlags(QtCore.Qt.ItemIsEnabled)
 | 
	
	
		
			
				|  | @@ -287,12 +299,15 @@ class DirNotes(QMainWindow):
 | 
	
		
			
				|  |  |  			da.setFlags(QtCore.Qt.ItemIsEnabled)
 | 
	
		
			
				|  |  |  			self.lb.setItem(i,1,da)
 | 
	
		
			
				|  |  |  			si = this_file.getSize()
 | 
	
		
			
				|  |  | -			if si>=0:
 | 
	
		
			
				|  |  | -				sa = SortableTableWidgetItem(str(si),si)
 | 
	
		
			
				|  |  | -				item.setIcon(fileIcon)
 | 
	
		
			
				|  |  | -			else:
 | 
	
		
			
				|  |  | +			if si==FileObj.FILE_IS_DIR:
 | 
	
		
			
				|  |  |  				sa = SortableTableWidgetItem('',0)
 | 
	
		
			
				|  |  |  				item.setIcon(dirIcon)
 | 
	
		
			
				|  |  | +			elif si==FileObj.FILE_IS_LINK:
 | 
	
		
			
				|  |  | +				sa = SortableTableWidgetItem('',0)
 | 
	
		
			
				|  |  | +				item.setIcon(linkIcon)
 | 
	
		
			
				|  |  | +			else:
 | 
	
		
			
				|  |  | +				sa = SortableTableWidgetItem(str(si),si)
 | 
	
		
			
				|  |  | +				item.setIcon(fileIcon)
 | 
	
		
			
				|  |  |  			sa.setTextAlignment(QtCore.Qt.AlignRight)
 | 
	
		
			
				|  |  |  			sa.setFlags(QtCore.Qt.ItemIsEnabled)
 | 
	
		
			
				|  |  |  			self.lb.setItem(i,2,sa)
 | 
	
	
		
			
				|  | @@ -307,6 +322,14 @@ class DirNotes(QMainWindow):
 | 
	
		
			
				|  |  |  	def restore_from_database(self):
 | 
	
		
			
				|  |  |  		print("restore from database")
 | 
	
		
			
				|  |  |  		fileName = str(self.lb.item(self.lb.currentRow(),0).text())
 | 
	
		
			
				|  |  | +		existing_comment = str(self.lb.item(self.lb.currentRow(),3).text())
 | 
	
		
			
				|  |  | +		print("restore....existing="+existing_comment+"=")
 | 
	
		
			
				|  |  | +		if len(existing_comment) > 0:
 | 
	
		
			
				|  |  | +			m = QMessageBox()
 | 
	
		
			
				|  |  | +			m.setText("This file already has a comment. Overwrite?")
 | 
	
		
			
				|  |  | +			m.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel);
 | 
	
		
			
				|  |  | +			if m.exec_() != QMessageBox.Ok:
 | 
	
		
			
				|  |  | +				return
 | 
	
		
			
				|  |  |  		fo_row = self.db.getData(fileName)
 | 
	
		
			
				|  |  |  		if fo_row and len(fo_row)>1:
 | 
	
		
			
				|  |  |  			comment = fo_row[3]
 | 
	
	
		
			
				|  | @@ -379,4 +402,3 @@ user.xdg.publisher
 | 
	
		
			
				|  |  |  			-choose & cancel buttons
 | 
	
		
			
				|  |  |  	
 | 
	
		
			
				|  |  |  	'''
 | 
	
		
			
				|  |  | -
 |