mikshaw
Group: Members
Posts: 4856
Joined: July 2004 |
|
Posted: Jan. 15 2008,20:46 |
|
Added text search: EDIT: made text search case insensitive (string.lower on both the match string and the info text contents)
Code Sample | #!/bin/murgaLua -- mydsl info browser, 2008 mikshaw -- -- Changelog (yyyy/mm/dd) -- 2008/01/15: Added text search -- 2008/01/14: Fixed display of incorrect duplicate info file -- Check for trailing spaces in title string -- Added "Update" function -- Code and interface tweaks -- 2008/01/13: start of project
listfile="/home/dsl/WORK/mydsl_master_list/list.txt" listurl="ftp://ibiblio.org/pub/Linux/distributions/damnsmall/mydsl/list.txt"
function load_list() inputfile=io.open(listfile) if not inputfile then print("can't open "..listfile) os.exit(1) end
data=inputfile:read("*a") inputfile:close()
info={} info_count=0 -- breaks up each info file into a separate string for s in string.gmatch(data,"(Location:.-\n)Location:") do info_count=info_count+1 info[info_count]={ location=string.match(s,"Location:%s*(.-)%s*\n"), title=string.match(s,"Title:%s*(.-)%s*\n"), text=s } b_loc:add(info[info_count].location) end
b_loc:value(0) b_loc:do_callback() end
ww=420; wh=360; bh=25; bw=ww/2-5 w=fltk:Fl_Window(ww,wh,"MyDSL Info Browser")
tabs=fltk:Fl_Tabs(0,0,ww,wh)
tab1=fltk:Fl_Group(0,0,ww,wh-bh,"browse") b_loc=fltk:Fl_Choice(5,5,bw,bh) b_loc:callback( function() while b_files:size()>1 do b_files:remove(0) end b_files:redraw() for i=1,info_count do if info[i].location==b_loc:text() then b_files:add(info[i].title) end end b_files:value(0) b_files:do_callback() end )
b_files=fltk:Fl_Choice(ww/2,5,bw,bh) b_files:callback( function() for i=1,info_count do if info[i].title == b_files:text() and info[i].location == b_loc:text() then info_display_buffer:text(info[i].text) break end end end )
info_display=fltk:Fl_Text_Display(5,10+bh,ww-10,wh-(20+bh*3)) info_display:textfont(fltk.FL_SCREEN) info_display:textsize(12) info_display_buffer=fltk:Fl_Text_Buffer() info_display:buffer(info_display_buffer)
install=fltk:Fl_Button(5,wh-bh*2-5,bw,bh,"Install Selected Package") install:callback( function() os.execute("mydsl-load "..b_files:text().." "..b_loc:text()) end )
updatedb=fltk:Fl_Button(bw+5,wh-bh*2-5,bw,bh,"Update Database") updatedb:callback( function() backup=os.rename(listfile,listfile..".bak") if backup then wget=os.execute("wget "..listurl.." -O "..listfile) if wget==0 then while b_loc:size()>1 do b_loc:remove(0) end load_list() else os.rename(listfile..".bak",listfile) end end end ) fltk:Fl_End()
tab2=fltk:Fl_Group(0,0,ww,wh-bh,"search text") search_b=fltk:Fl_Return_Button(5,5,80,bh,"search") search_b:callback( function() if search_text:value() ~= "" then results:clear() for i=1,info_count do if string.find(string.lower(info[i].text),string.lower(search_text:value()),1,true) then results:add(info[i].title.."\t\t"..info[i].location) end end end end ) search_text=fltk:Fl_Input(85,5,ww-90,bh) results=fltk:Fl_Hold_Browser(5,10+bh,ww-10,wh-(20+bh*2)) results:textfont(fltk.FL_SCREEN) results:textsize(12) results:callback( function() -- show selected info file in the browse tab if results:value() > 0 then get_loc=string.match(results:text(results:value()),"\t\t(.*)") get_fname=string.match(results:text(results:value()),"(.*)\t\t") for i=0,b_loc:size() do if get_loc == b_loc:text(i) then b_loc:value(i) break end end b_loc:do_callback() for i=0,b_files:size() do if get_fname == b_files:text(i) then b_files:value(i) break end end b_files:do_callback() tabs:value(tab1) end end ) fltk:Fl_End()
load_list() --w:resizable(info_display) --w:resizable(results) w:show() Fl:run()
|
-------------- http://www.tldp.org/LDP/intro-linux/html/index.html
|