📄 pslider.cpp
字号:
} // Toggle Fullscreen mode if (ckey==cimg::keyF) disp->toggle_fullscreen().display(vslide); // Swap links orientation if (ckey==cimg::keyARROWUP) { lorient=!lorient; update_flag=1; } // Swap link visualization if (ckey==cimg::keyL) { // key 'L' noLink=!noLink; update_flag=1; } // Pause autorun if (dautorun>=0 && ckey==cimg::keyP) { if (autorun>=0) autorun=-1; else autorun = dautorun; update_flag = 1; } // Add a link if (ckey==cimg::keyF1) { int bbox[6]; std::fprintf(stderr," > Add link #%d : ",nol+1); std::fflush(stderr); vslide.feature_selection(bbox,2,*disp); int x0=bbox[0],y0=bbox[1],x1=bbox[3],y1=bbox[4]; x0 = x0*owidth/width; y0 = y0*oheight/height; x1 = x1*owidth/width; y1 = y1*oheight/height; std::fprintf(stderr,"Page %d, Box = (%d,%d)-(%d,%d)",current_slide+1,x0,y0,x1,y1); if (x0<0 || x1<0 || y0<0 || y1<0 || x0==x1 || y0==y1 || x1>=(int)owidth || y1>=(int)oheight) std::fprintf(stderr,", Range not valid\n"); else { Links[nol].page = current_slide; Links[nol].xmin = x0; Links[nol].xmax = x1; Links[nol].ymin = y0; Links[nol].ymax = y1; std::sprintf(Links[nol].url,"file:Edit Link_#%d",nol+1); nol++; save_Links(Links,nol,Link_filename); std::fprintf(stderr,".. '%s' updated\n",Link_filename); } update_flag=1; } // Remove a Link if (overLink>=0 && ckey==cimg::keyF2) { std::fprintf(stderr," > Remove link %d...",overLink+1); std::fflush(stderr); for (unsigned int i=overLink; i<nol-1; i++) Links[i]=Links[i+1]; nol--; save_Links(Links,nol,Link_filename); std::fprintf(stderr," '%s' updated\n",Link_filename); update_flag=1; } // Insert a new link page if (ckey==cimg::keyF3) { std::fprintf(stderr," > Insert a new link page ... "); std::fflush(stderr); for (unsigned int i=0; i<nol; i++) if (Links[i].page>=current_slide) Links[i].page++; save_Links(Links,nol,Link_filename); std::fprintf(stderr," '%s' updated\n",Link_filename); update_flag=1; } // Remove a link page if (ckey==cimg::keyF4) { std::fprintf(stderr," > Remove a link page ..."); std::fflush(stderr); for (unsigned int i=0; i<nol; i++) { if (Links[i].page==current_slide) { for (unsigned int k=i; k<nol-1; k++) Links[k]=Links[k+1]; nol--; i--; } else { if (Links[i].page>current_slide) Links[i].page--; } } save_Links(Links,nol,Link_filename); std::fprintf(stderr," '%s' updated\n",Link_filename); update_flag=1; } // Edit link file if (ckey==cimg::keyF5) { if (cimg_OS==1) { std::fprintf(stderr," > Edit link file : "); std::sprintf(str,"xemacs %s",Link_filename); std::fprintf(stderr,"'%s'\n",str); std::system(str); nol=load_Links(Link_filename,Links); update_flag=1; } } // Histogram normalization and gamma correction if (ckey==cimg::key1) { gamma=-1; update_flag=1; } if (ckey==cimg::key2) { if (gamma<0) gamma=1; gamma+=0.15; update_flag=1; } if (ckey==cimg::key3) { if (gamma<0) gamma=1; gamma-=0.15; update_flag=1; } if (ckey==cimg::key4) { gamma=1; update_flag=1; } // Help menu if (ckey==cimg::keyH) { CImg<unsigned char> help_win(550,450,1,3); const unsigned char white[3]={255,255,255}; help_win.fill(0); help_win.draw_text("PSlider -- Keyboard reference --\n\n" "\t H : Display this help\n" "\t Q : Exit PSlider\n" "\t F : Toggle Fullscreen\n" "\t ESC, or Right mousebutton : Open Thumbnail menu\n" "\t RIGHTARROW, PAGEDOWN, SPACE, ENTER : Go to the next slide\n" "\t LEFTTARROW, PAGEUP, B, BACKSPACE : Go to the previous slide\n" "\t HOME, END : Go to the first/last slide\n" "\t DOWNARROW : Swap landscape orientation\n" "\t UPARROW : Swap links orientation\n" "\t L : Swap link visualization\n" "\t P : Pause on/off in autorun mode\n" "\t F1 : Add a link\n" "\t F2 : Remove a link\n" "\t F3 : Insert a new link page\n" "\t F4 : Remove a link page\n" "\t F5 : Edit the link file\n" "\t 1 : Color normalization\n" "\t 2 : Darken the slides\n" "\t 3 : Lighten the slides\n" "\t 4 : Reset the gamma correction\n", 20,20,white); help_win.draw_line(4,4,help_win.dimx()-5,4,white); help_win.draw_line(help_win.dimx()-5,4,help_win.dimx()-5,help_win.dimy()-5,white); help_win.draw_line(help_win.dimx()-5,help_win.dimy()-5,4,help_win.dimy()-5,white); help_win.draw_line(4,help_win.dimy()-5,4,4,white); vslide.draw_image(help_win,(vslide.dimx()-help_win.dimx())/2,(vslide.dimy()-help_win.dimy())/2,0,0,0.75); disp->key=0; vslide.display(*disp); while (!disp->is_closed && !disp->key && !disp->button) disp->wait(); disp->key=disp->button=0; update_flag = 1; time0 = (unsigned int)time(NULL); } // Thumbnails menu //------------------ static bool fs_flag = false; if (ckey==cimg::keyESC || disp->button&2 || (dispthumb && (dispthumb->is_closed || dispthumb->key==cimg::keyESC || dispthumb->button&2))) { if (!dispthumb) { // Open menu fs_flag = disp->is_fullscreen; if (fs_flag) disp->toggle_fullscreen().display(vslide); unsigned int fx=thumbs[0].dimx()+8,fy=thumbs[0].dimy()+8,x,y; menuthumb = CImg<unsigned char>((nop<8?nop*fx:8*fx),fy*(1+(nop-1)/8),1,3).fill(0); { cimg_forXY(menuthumb,x,y) menuthumb(x,y,0)=menuthumb(x,y,1)=menuthumb(x,y,2)=(unsigned char)(std::cos(x/30.0)*std::sin(y/30.0)*64)+64; } dispthumb = new CImgDisplay(menuthumb,"Presentation Layout",0,2,fullscreen); x=y=0; for (unsigned int k=0; k<nop; k++) { menuthumb.draw_image(thumbs[k],x+4,y+4,0,0); menuthumb.draw_line(x+3,y+3,x+3+thumbs[k].dimx()+1,y+3,white); menuthumb.draw_line(x+3+thumbs[k].dimx()+1,y+3,x+3+thumbs[k].dimx()+1,y+3+thumbs[k].dimy()+1,white); menuthumb.draw_line(x+3+thumbs[k].dimx()+1,y+3+thumbs[k].dimy()+1,x+3,y+3+thumbs[k].dimy()+1,gray); menuthumb.draw_line(x+3,y+3+thumbs[k].dimy()+1,x+3,y+3,gray); x+=fx; if (x>=menuthumb.width) { x=0; y+=fy; } } menuthumb.display(*dispthumb); disp->button&=~2; } else { // Close menu delete dispthumb; dispthumb=NULL; disp->button&=~2; update_flag=1; if (fs_flag) { disp->toggle_fullscreen(); fs_flag = false; } } } if (dispthumb) { int next=current_slide,x,y,fx=thumbs[0].dimx()+8,fy=thumbs[0].dimy()+8,x0,x1,y0,y1; CImg<unsigned char> tmp(menuthumb); x = dispthumb->mouse_x/fx; y = dispthumb->mouse_y/fy; if (x>=0 && y>=0 && y*8+x<(int)nop) { x0 = x*fx; y0 = y*fy; x1 = (x+1)*fx-1; y1 = (y+1)*fy-1; tmp.draw_line(x0,y0,x1,y0,yellow); tmp.draw_line(x1,y0,x1,y1,yellow); tmp.draw_line(x1,y1,x0,y1,yellow); tmp.draw_line(x0,y1,x0,y0,yellow); { for (int y=y0; y<=y1; y+=2) for (int x=x0; x<=x1; x+=2) tmp(x,y,0)=200; } tmp.display(*dispthumb); next = y*8+x; } else menuthumb.display(*dispthumb); if (dispthumb->button&1) { current_slide = next; update_flag = 1; dispthumb->button&=~1; } } // Display a slide //----------------- if (update_flag) { if (current_slide!=old_slide) { if (current_slide==(old_slide-1)%nop) nslide=slide; if (current_slide==(old_slide+1)%nop) slide=nslide; else { std::sprintf(str,slideformat,current_slide+1); slide = CImg<unsigned char>(str); } } vslide = slide; vslide.resize(width,height,1,3,5); if (orient) vslide.rotate(180); if (gamma!=1) { if (gamma<0) vslide.equalize_histogram(); else cimg_forXYV(vslide,x,y,k) vslide(x,y,k) = (unsigned char)(std::pow(vslide(x,y,k)/256.0,gamma)*256); } if (dautorun>0 && autorun<0) vslide.draw_text("Paused",2,2,white,black); if (!noLink) for (i=0; i<nol; i++) { if (Links[i].page==current_slide) { xmin = Links[i].xmin*width/owidth; xmax = Links[i].xmax*width/owidth; ymin = Links[i].ymin*height/oheight; ymax = Links[i].ymax*height/oheight; if (lorient) { xmin = width-xmin; xmax = width-xmax; ymin = height-ymin; ymax = height-ymax; } vslide.draw_line(xmin,ymin,xmax,ymin,green,0x88888888); vslide.draw_line(xmax,ymin,xmax,ymax,green,0x88888888); vslide.draw_line(xmax,ymax,xmin,ymax,green,0x88888888); vslide.draw_line(xmin,ymax,xmin,ymin,green,0x88888888); } } vslide.display(*disp); update_flag=0; overLink=-1; if (current_slide!=old_slide && current_slide!=(old_slide-1)%nop) { std::sprintf(str,slideformat,((current_slide+1)%nop)+1); nslide = CImg<unsigned char>(str); } old_slide=current_slide; nautolink=-1; } // Check mouse over links //------------------------ ooverLink = overLink; overLink = -1; layer = vslide; mouse_x = disp->mouse_x; mouse_y = disp->mouse_y; if (autorun<0 || (autorun>=0 && (unsigned int)time(NULL)>time0+3*autorun/4)) { for (i=0; i<nol; i++) { xmin = Links[i].xmin*width/owidth; xmax = Links[i].xmax*width/owidth; ymin = Links[i].ymin*height/oheight; ymax = Links[i].ymax*height/oheight; if (lorient) { int tmp = xmin; xmin = width-xmax; xmax = width-tmp; tmp = ymin; ymin = height-ymax; ymax = height-tmp; } if (autorun>=0 && Links[i].page==(current_slide+1)%nop && !cimg::strncasecmp(cimg::filename_split(Links[i].url),"settimer",8)) { std::sscanf(Links[i].url,"file:%d.settimer",&nautorun); std::fprintf(stderr," > Next slide timer will be %d seconds\n",nautorun); } if (autorun<0 && Links[i].page==current_slide && mouse_x>=xmin && mouse_x<=xmax && mouse_y>=ymin && mouse_y<=ymax && cimg::strncasecmp(Links[i].url,"settimer",8) ) { overLink = i; if (!noLink) { for (int y=ymin; y<=ymax; y+=2) for (int x=xmin; x<=xmax; x+=2) { layer(x,y,1)=128; layer(x,y,0)=layer(x,y,2)=0; } layer.draw_text(2,2,white,black,11,1,Links[i].url); } i = nol; } if (autorun>=0 && Links[i].page==current_slide && nautolink<(int)i) { overLink = nautolink = i; i=nol; } } if (overLink<0) links_done = true; } if (autorun<0 && overLink!=ooverLink) layer.display(*disp); if (overLink>=0 && (disp->button&1 || autorun>=0)) { disp->button&=~1; const Link l = Links[overLink]; ext = cimg::filename_split(l.url); for (unsigned int m=0; m<nom; m++) { if (!cimg::strcasecmp(ext,mimes[m].ext) || (( !cimg::strncasecmp(l.url,"http://",7) || !cimg::strncasecmp(l.url,"ftp://",6) || !cimg::strncasecmp(l.url,"www.",4) || !cimg::strncasecmp(l.url,"ftp.",4) ) && ( !cimg::strcasecmp(mimes[m].ext,"htm") || !cimg::strcasecmp(mimes[m].ext,"html"))) ) { if (slide_type==1) std::sprintf(str,"%s ../%s",mimes[m].command,l.url+1+cimg::strfind(l.url,':')); else std::sprintf(str,"%s %s",mimes[m].command,l.url+1+cimg::strfind(l.url,':')); if (!cimg::strncasecmp(l.url,"http:",5)) { if (slide_type==1) std::sprintf(str,"%s ../%s",mimes[m].command,l.url+5); else std::sprintf(str,"%s %s",mimes[m].command,l.url+5); } if (!cimg::strncasecmp(l.url,"file:",5)) { if (slide_type==1) std::sprintf(str,"%s ../%s",mimes[m].command,l.url+5); else std::sprintf(str,"%s %s",mimes[m].command,l.url+5); } if (!cimg::strncasecmp(l.url,"file://",7)) { if (slide_type==1) std::sprintf(str,"%s ../%s",mimes[m].command,l.url+7); else std::sprintf(str,"%s %s",mimes[m].command,l.url+7); } if (!cimg::strncasecmp(l.url,"http://",7) || !cimg::strncasecmp(l.url,"ftp://",6) || !cimg::strncasecmp(l.url,"www.",4) ) std::sprintf(str,"%s %s",mimes[m].command,l.url); if (cimg_OS==1) { if (autorun<0) std::sprintf(str+cimg::strlen(str)," &"); //else std::sprintf(str+cimg::strlen(str),""); } std::fprintf(stderr," > Launching '%s' ... ",str); std::fflush(stderr); std::system(str); if (autorun>=0) time0 = (unsigned int)time(NULL)-(unsigned int)3*autorun/4; fprintf(stderr,"Done\n"); m=nom; } } } if (overLink<0 && disp->button&1) disp->button&=~1; } // Exit pslider. if (disp) delete disp; std::fprintf(stderr,"\n*** Exit PSlider ***\n\n"); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -