fixing problems with huge lists
This commit is contained in:
@@ -13,6 +13,7 @@ readline.parse_and_bind('set editing-mode vi')
|
|||||||
|
|
||||||
MENUFILE='.foldermenu'
|
MENUFILE='.foldermenu'
|
||||||
DEFAULTFILE = os.path.expanduser(os.path.join('~','.config','foldermenu','default'))
|
DEFAULTFILE = os.path.expanduser(os.path.join('~','.config','foldermenu','default'))
|
||||||
|
VERSION="0.3"
|
||||||
|
|
||||||
def setup_options():
|
def setup_options():
|
||||||
''' Setup the command line options '''
|
''' Setup the command line options '''
|
||||||
@@ -22,20 +23,23 @@ def setup_options():
|
|||||||
"' file, and in addition the executables in the current folder. "+
|
"' file, and in addition the executables in the current folder. "+
|
||||||
"Menufile format for each line: 'description:command'. "+
|
"Menufile format for each line: 'description:command'. "+
|
||||||
"If the command ends in '&' it is run in the background.")
|
"If the command ends in '&' it is run in the background.")
|
||||||
|
parser.add_argument("-1","--one-shot",action='store_true', dest='once',default=False,
|
||||||
|
help="Launch only once, then exit")
|
||||||
parser.add_argument("-d","--no-defaults",action='store_false', dest='defaults',default=True,
|
parser.add_argument("-d","--no-defaults",action='store_false', dest='defaults',default=True,
|
||||||
help="Do not show default entries from "+DEFAULTFILE)
|
help="Do not show default entries from "+DEFAULTFILE)
|
||||||
parser.add_argument("-x","--no-exec",action='store_false', dest='executables',default=True,
|
parser.add_argument("-x","--no-exec",action='store_false', dest='executables',default=True,
|
||||||
help="Do not show executables in the listing.")
|
help="Do not show executables in the listing.")
|
||||||
parser.add_argument("--columns",'-f',type=int,action='store', dest='columns',default=0,
|
parser.add_argument("--columns",'-f','-C',type=int,action='store', dest='columns',default=0,
|
||||||
help="Number of columns. 0 for automatic")
|
help="Number of columns. 0 for automatic")
|
||||||
parser.add_argument("-l","--list",action='store_true', dest='list',default=False,
|
parser.add_argument("-l","--list",action='store_true', dest='list',default=False,
|
||||||
help="Print the list, don't wait for keypress.")
|
help="Print the list, don't wait for keypress.")
|
||||||
parser.add_argument("--command",'-c',type=str,action='store', dest='command',
|
parser.add_argument("--command",'-c',type=str,action='store', dest='command',
|
||||||
help="Command to run (1-9a-z..), any argumets after -- are forwarded to the command ")
|
help="Command to run (1-9a-z..), any argumets after -- are forwarded to the command ")
|
||||||
parser.add_argument("--no-colors",action="store_false",dest="colors",default=True,
|
parser.add_argument("--no-colors",'--nc',action="store_false",dest="colors",default=True,
|
||||||
help="Disable colored output")
|
help="Disable colored output")
|
||||||
parser.add_argument("--horizontal",action="store_true",dest="horizontal",default=False,
|
parser.add_argument("--horizontal",'-H',action="store_true",dest="horizontal",default=False,
|
||||||
help="Horizontal order of items, only valid for -l listing.")
|
help="Horizontal order of items, only valid for -l listing.")
|
||||||
|
parser.add_argument("--version",action='version', version=VERSION)
|
||||||
parser.add_argument("args",type=str,action="store",default="",nargs="?",
|
parser.add_argument("args",type=str,action="store",default="",nargs="?",
|
||||||
help="Arguments for the command, if -c used. The string will be re-parsed with shutils. Use '--' to skip local parsing.")
|
help="Arguments for the command, if -c used. The string will be re-parsed with shutils. Use '--' to skip local parsing.")
|
||||||
options=parser.parse_args()
|
options=parser.parse_args()
|
||||||
@@ -132,6 +136,8 @@ class entry_collection:
|
|||||||
self.read_menu(DEFAULTFILE)
|
self.read_menu(DEFAULTFILE)
|
||||||
self.read_menu()
|
self.read_menu()
|
||||||
self.read_folder()
|
self.read_folder()
|
||||||
|
self.entries=self.entries[0:60]
|
||||||
|
self.dirs=self.dirs[0:60]
|
||||||
if len(self.entries)>0:
|
if len(self.entries)>0:
|
||||||
self.max_length=max([len(e.description) for e in self.entries])+1
|
self.max_length=max([len(e.description) for e in self.entries])+1
|
||||||
|
|
||||||
@@ -201,21 +207,27 @@ class entry_collection:
|
|||||||
my_entries=self.entries
|
my_entries=self.entries
|
||||||
|
|
||||||
maxrows,maxcolumns = termsize()
|
maxrows,maxcolumns = termsize()
|
||||||
maxrows-=5
|
rows=maxrows - 5
|
||||||
maxcolumns-=10
|
maxcolumns-=10
|
||||||
if self.options.columns==0:
|
if self.options.columns==0:
|
||||||
pars=float(1)
|
pars=1
|
||||||
if len(my_entries)>9:
|
if len(my_entries)>9:
|
||||||
pars=float(2)
|
pars=2
|
||||||
|
if len(my_entries)>30:
|
||||||
|
pars=3
|
||||||
|
pars=float(pars)
|
||||||
else:
|
else:
|
||||||
pars=float(self.options.columns)
|
pars=float(self.options.columns)
|
||||||
print(self.co.END+self.co.CLR+self.co.pos(1,3)+self.co.YEL+'FolderMenu x:exit '+helptext+self.co.END)
|
print(self.co.END+self.co.CLR+self.co.pos(1,3)+self.co.YEL+'FolderMenu x:exit '+helptext+self.co.END)
|
||||||
maxrows=int(math.ceil(min(maxrows/pars, len(my_entries)/pars)))
|
rows=int(math.ceil(len(my_entries)/pars))
|
||||||
|
while rows > maxrows:
|
||||||
|
pars+=1
|
||||||
|
rows=int(math.ceil(len(my_entries)/pars))
|
||||||
maxcolumns=int(math.ceil(maxcolumns/pars))
|
maxcolumns=int(math.ceil(maxcolumns/pars))
|
||||||
r=1
|
r=1
|
||||||
par=1
|
par=1
|
||||||
for e,i in zip(my_entries,self.menu_keys):
|
for e,i in zip(my_entries,self.menu_keys):
|
||||||
if r>maxrows:
|
if r>rows:
|
||||||
par=1+par
|
par=1+par
|
||||||
r=1
|
r=1
|
||||||
printline=e.description
|
printline=e.description
|
||||||
@@ -226,12 +238,12 @@ class entry_collection:
|
|||||||
else:
|
else:
|
||||||
print(self.co.pos(r+1,maxcolumns*(par-1))+'| '+self.co.WHI+i+self.co.END+' '+self.entry_color(e.launcher)+printline+self.co.END)
|
print(self.co.pos(r+1,maxcolumns*(par-1))+'| '+self.co.WHI+i+self.co.END+' '+self.entry_color(e.launcher)+printline+self.co.END)
|
||||||
r=1+r
|
r=1+r
|
||||||
print(self.co.pos(maxrows+2,0))
|
print(self.co.pos(rows+2,0))
|
||||||
|
|
||||||
def list(self):
|
def list(self):
|
||||||
""" draws the list at cursor """
|
""" draws the list at cursor """
|
||||||
maxrows,maxcolumns = termsize()
|
maxrows,maxcolumns = termsize()
|
||||||
maxrows-=5
|
rows=maxrows-5
|
||||||
maxcolumns-=10
|
maxcolumns-=10
|
||||||
# heuristics for guessing column count
|
# heuristics for guessing column count
|
||||||
if self.options.columns==0:
|
if self.options.columns==0:
|
||||||
@@ -244,8 +256,8 @@ class entry_collection:
|
|||||||
pars-=1
|
pars-=1
|
||||||
else:
|
else:
|
||||||
pars=float(self.options.columns)
|
pars=float(self.options.columns)
|
||||||
maxrows=int(math.ceil(min(maxrows/pars, len(self.entries)/pars)))
|
rows=int(math.ceil(len(self.entries)/float(pars)))
|
||||||
maxcolumns=int(math.ceil(maxcolumns/pars))-2
|
maxcolumns=int(math.floor(maxcolumns/pars))-2
|
||||||
# If names won't fit the columns, make sure at least 3 characters are visible
|
# If names won't fit the columns, make sure at least 3 characters are visible
|
||||||
if maxcolumns<6:
|
if maxcolumns<6:
|
||||||
origmaxrows,origmaxcolumns = termsize()
|
origmaxrows,origmaxcolumns = termsize()
|
||||||
@@ -253,16 +265,16 @@ class entry_collection:
|
|||||||
origmaxcolumns-=10
|
origmaxcolumns-=10
|
||||||
while maxcolumns<6:
|
while maxcolumns<6:
|
||||||
pars=pars-1
|
pars=pars-1
|
||||||
maxrows=int(math.ceil(min(origmaxrows/pars, len(self.entries)/pars)))
|
rows=int(math.ceil(len(self.entries)/float(pars)))
|
||||||
maxcolumns=int(math.ceil(origmaxcolumns/pars))-2
|
maxcolumns=int(math.floor(origmaxcolumns/pars))-2
|
||||||
|
|
||||||
self.max_length=min(maxcolumns,self.max_length)
|
self.max_length=min(maxcolumns,self.max_length)
|
||||||
if self.options.horizontal:
|
if self.options.horizontal:
|
||||||
foo=pars
|
foo=pars
|
||||||
pars=maxrows
|
pars=rows
|
||||||
maxrows=foo
|
rows=foo
|
||||||
formatted=[]
|
formatted=[]
|
||||||
for r in range(int(maxrows)):
|
for r in range(int(rows)):
|
||||||
formatted.append([])
|
formatted.append([])
|
||||||
for p in range(int(pars)):
|
for p in range(int(pars)):
|
||||||
formatted[r].append(' '*(self.max_length))
|
formatted[r].append(' '*(self.max_length))
|
||||||
@@ -271,7 +283,7 @@ class entry_collection:
|
|||||||
r=0
|
r=0
|
||||||
par=0
|
par=0
|
||||||
for e,i in zip(self.entries,self.menu_keys):
|
for e,i in zip(self.entries,self.menu_keys):
|
||||||
if r>=maxrows:
|
if r>=rows:
|
||||||
par=1+par
|
par=1+par
|
||||||
r=0
|
r=0
|
||||||
printline=e.description[:(maxcolumns-3)]
|
printline=e.description[:(maxcolumns-3)]
|
||||||
@@ -289,6 +301,7 @@ class entry_collection:
|
|||||||
''' launch the given entry '''
|
''' launch the given entry '''
|
||||||
|
|
||||||
bg=False
|
bg=False
|
||||||
|
wait=True
|
||||||
#Run the program in background
|
#Run the program in background
|
||||||
idx=self.menu_keys.index(key)
|
idx=self.menu_keys.index(key)
|
||||||
# note, no error checking here
|
# note, no error checking here
|
||||||
@@ -317,7 +330,10 @@ class entry_collection:
|
|||||||
except:
|
except:
|
||||||
print('Unable to run: "'+command_str+'"')
|
print('Unable to run: "'+command_str+'"')
|
||||||
|
|
||||||
if not (self.options.command or bg):
|
if (self.options.command or self.options.once or bg):
|
||||||
|
wait=False
|
||||||
|
|
||||||
|
if wait:
|
||||||
print('Press any key...')
|
print('Press any key...')
|
||||||
ch=getch()
|
ch=getch()
|
||||||
inkey=ord(ch.get())
|
inkey=ord(ch.get())
|
||||||
@@ -373,6 +389,8 @@ def start_engines():
|
|||||||
found,message=entries.is_key(chr(inkey))
|
found,message=entries.is_key(chr(inkey))
|
||||||
if found:
|
if found:
|
||||||
entries.launch(chr(inkey))
|
entries.launch(chr(inkey))
|
||||||
|
if options.once and not entries.dir_mode:
|
||||||
|
sys.exit(0)
|
||||||
entries.initialize()
|
entries.initialize()
|
||||||
|
|
||||||
start_engines()
|
start_engines()
|
||||||
|
|||||||
Reference in New Issue
Block a user