mikshaw
Group: Members
Posts: 4856
Joined: July 2004 |
|
Posted: Nov. 01 2007,19:54 |
|
Here's a compromise that I like best so far. I can't see there being a lot of people with more than a few hundred 32x32 xpm files in a single directory, so I've decided the delay of a couple of seconds isn't a huge problem. The compromise is that the script no longer just ignores the "bad" files as I had originally planned, but also does not pretend there's nothing wrong with the files as ^thehatsrule^ had coded. The script now contains a "broken image" icon that appears in place of the original icon, to let the user know something's not right with it, and the file itself can still be opened with the "edit" button.
Code Sample | #!/bin/murgaLua
-- XPM icon viewer -- mikshaw 2007
dir="/usr/share/dfm/icons" editor="xpaint" xpm_size=32
broken_xpm_data=[[ /* XPM */ static char *broken_image[] = { /* columns rows colors chars-per-pixel */ "14 16 16 1", " c black", ". c #800000", "X c #008000", "o c #808000", "O c navy", "+ c #800080", "@ c #008080", "# c #C0C0C0", "$ c #808080", "% c red", "& c green", "* c None", "= c blue", "- c magenta", "; c cyan", ": c gray100", /* pixels */ " $***", " :::::::::$$**", " :########$:$*", " :###XX###$::$", " :##X&X ## ", " :##XXX ####: ", " :### #####: ", " :######=== :*", " :#%####=;= :*", " :#-%###==O***", " :#--%## **: ", " :#---%#***#: ", " :# *****#: ", " :##*****###: ", " ::*****::::: ", " ****** " }; ]] xpm_tempfile=os.tmpname() xpm_write=io.open(xpm_tempfile,"w") if xpm_write then xpm_write:write(broken_xpm_data) xpm_write:close() broken_xpm=fltk:Fl_XPM_Image(xpm_tempfile) os.remove(xpm_tempfile) end
edvar=os.getenv("XPM_EDITOR") if edvar then editor=edvar end
function get_image_data(self) local old_data=display:image() if old_data then old_data:uncache() end local image_data=self:image() if image_data then display:image(image_data:copy(128,128)) --show it bigger! else display:image(broken_xpm) end current_file=dir..self:tooltip() -- for editor display:label("\n"..self:tooltip().."\n"..lfs.attributes(current_file).size.." bytes") display:redraw() end
function menu_cb() if i_menu:text()=="&Edit" and current_file then os.execute(editor.." "..current_file.." &") elseif i_menu:text()=="&Directory" then chdir() elseif i_menu:text()=="&Refresh" then refresh() elseif i_menu:text()=="&Quit" then os.exit(0) end end
function find_stupid_space(file) local data=io.open(file) if data then for line in data:lines() do if string.find(line,"^%s") then return 1 end end data:close() end end
function build_list() if not string.find(dir,"/$") then dir=dir.."/" end scroll=fltk:Fl_Scroll(5,bh,sw,sh) w:add(scroll) pack=fltk:Fl_Pack(5,bh,bw,sh) pack:spacing(2) scroll:add(pack) -- get all xpm files for file in lfs.dir(dir) do if string.find(file,"%.xpm$") then table.insert(images,file) end end table.sort(images) -- make buttons for "xpm_size" images only xpm_count=0 filesize=0 for i=1,table.getn(images) do icon[i]=fltk:Fl_XPM_Image(dir..images[i]) if icon[i]:w()==xpm_size and icon[i]:h()==xpm_size then xpm_count=1+xpm_count filesize=filesize+lfs.attributes(dir..images[i]).size butt[xpm_count]=fltk:Fl_Button(0,0,bw,bw) butt[xpm_count]:box(15) --shadow if not find_stupid_space(dir..images[i]) then butt[xpm_count]:image(icon[i]) else butt[xpm_count]:label("bad\nimage") end butt[xpm_count]:callback(get_image_data) butt[xpm_count]:tooltip(images[i]) pack:add(butt[xpm_count]) else icon[i]:uncache() end end if butt[1] then display:show(); butt[1]:do_callback() end -- show first image display2:label(xpm_count.." files | "..math.ceil(filesize/1024).." kb") end
function refresh() local old_image=display:image() if old_image then old_image:uncache(); display:hide() end -- clear all tables and remove buttons for i=1,table.getn(images) do table.remove(images) end for i=1,table.getn(icon) do icon[i]:uncache() end for i=1,table.getn(icon) do table.remove(icon) end for i=1,table.getn(butt) do table.remove(butt) end w:remove(scroll) Fl:delete_widget(scroll) scroll=nil build_list() end
function chdir() local dirname=fltk.fl_dir_chooser("pick a dir...",dir) if dirname then dir=dirname refresh() end end
-- candy Fl:set_boxtype(fltk.FL_UP_BOX,fltk.FL_THIN_UP_BOX) Fl:set_boxtype(fltk.FL_DOWN_BOX,fltk.FL_THIN_DOWN_BOX) fltk.fl_define_FL_SHADOW_BOX() Fl:set_color(fltk.FL_DARK3,150,150,150) -- shadow Fl:set_color(fltk.FL_GRAY0,128,128,128) -- frame --Fl_Tooltip:disable()
-- some sizes and positions are determined by xpm_size bw=xpm_size+20 -- button width bh=30; sw=bw+20; sh=250 -- menu, scroll size ww=sw+sh+10 wh=bh+sh+10 w=fltk:Fl_Window(ww,wh,"XPM Icons")
menu_items={"&Edit","&Directory","&Refresh","&Quit"} i_menu=fltk:Fl_Menu_Button(0,0,sw+5,bh,"&Menu") i_menu:align(20) i_menu:callback(menu_cb) i_menu:selection_color(fltk.FL_WHITE) for i,v in ipairs(menu_items) do i_menu:add(v) end
display=fltk:Fl_Box(sw+5,0,sh,sh) -- big image display2=fltk:Fl_Box(sw+5,sh,sh,bh) -- dir info
xpm_count=0 -- set global variables filesize=0 images={}; icon={}; butt={}
build_list() w:show() Fl:run()
|
-------------- http://www.tldp.org/LDP/intro-linux/html/index.html
|