// prints the selected files in the filebrowser void KuickShow::slotPrint() { const KFileItemList *items = fileWidget->selectedItems(); if ( !items ) return; KFileItemListIterator it( *items ); // don't show the image, just print ImageWindow *iw = new ImageWindow( 0, id, this, "printing image" ); KFileItem *item; while ( (item = it.current()) ) { if (FileWidget::isImage( item ) && iw->loadImage( item->url() )) iw->printImage(); ++it; } iw->close( true ); }
bool KuickShow::eventFilter( QObject *o, QEvent *e ) { if ( m_delayedRepeatItem ) // we probably need to install an eventFilter over { return true; // kapp, to make it really safe } bool ret = false; int eventType = e->type(); QKeyEvent *k = 0L; if ( eventType == QEvent::KeyPress ) k = static_cast<QKeyEvent *>( e ); if ( k ) { if ( KStdAccel::quit().contains( KKey( k ) ) ) { saveSettings(); deleteAllViewers(); FileCache::shutdown(); ::exit(0); } else if ( KStdAccel::help().contains( KKey( k ) ) ) { appHelpActivated(); return true; } } ImageWindow *window = dynamic_cast<ImageWindow*>( o ); if ( window ) { // The XWindow used to display Imlib's image is being resized when // switching images, causing enter- and leaveevents for this // ImageWindow, leading to the cursor being unhidden. So we simply // don't pass those events to KCursor to prevent that. if ( eventType != QEvent::Leave && eventType != QEvent::Enter ) KCursor::autoHideEventFilter( o, e ); m_viewer = window; QString img; KFileItem *item = 0L; // the image to be shown KFileItem *item_next = 0L; // the image to be cached if ( k ) { // keypress ret = true; int key = k->key(); // Key_Shift shouldn't load the browser in nobrowser mode, it // is used for zooming in the imagewindow // Key_Alt shouldn't either - otherwise Alt+F4 doesn't work, the // F4 gets eaten (by NetAccess' modal dialog maybe?) if ( !fileWidget ) { if ( key != Key_Escape && key != Key_Shift && key != Key_Alt ) { KuickFile *file = m_viewer->currentFile(); // QFileInfo fi( m_viewer->filename() ); // start.setPath( fi.dirPath( true ) ); initGUI( file->url().upURL() ); // the fileBrowser will list the start-directory // asynchronously so we can't immediately continue. There // is no current-item and no next-item (actually no item // at all). So we tell the browser the initial // current-item and wait for it to tell us when it's ready. // Then we will replay this KeyEvent. delayedRepeatEvent( m_viewer, k ); // OK, once again, we have a problem with the now async and // sync KDirLister :( If the startDir is already cached by // KDirLister, we won't ever get that finished() signal // because it is emitted before we can connect(). So if // our dirlister has a rootFileItem, we assume the // directory is read already and simply call // slotReplayEvent() without the need for the finished() // signal. // see slotAdvanceImage() for similar code if ( fileWidget->dirLister()->isFinished() ) { if ( fileWidget->dirLister()->rootItem() ) { fileWidget->setCurrentItem( file->url().fileName() ); QTimer::singleShot( 0, this, SLOT( slotReplayEvent())); } else // finished, but no root-item -- probably an error, kill repeat-item! { abortDelayedEvent(); } } else // not finished yet { fileWidget->setInitialItem( file->url().fileName() ); connect( fileWidget, SIGNAL( finished() ), SLOT( slotReplayEvent() )); } return true; } return KMainWindow::eventFilter( o, e ); } // we definitely have a fileWidget here! KKey kkey( k ); if ( key == Key_Home || KStdAccel::home().contains( kkey ) ) { item = fileWidget->gotoFirstImage(); item_next = fileWidget->getNext( false ); } else if ( key == Key_End || KStdAccel::end().contains( kkey ) ) { item = fileWidget->gotoLastImage(); item_next = fileWidget->getPrevious( false ); } else if ( fileWidget->actionCollection()->action("delete")->shortcut().contains( key )) { kdDebug() << "WOW, deletion happens here!" << endl; // KFileItem *cur = fileWidget->getCurrentItem( false ); (void) fileWidget->getCurrentItem( false ); item = fileWidget->getNext( false ); // don't move if ( !item ) item = fileWidget->getPrevious( false ); KFileItem it( KFileItem::Unknown, KFileItem::Unknown, m_viewer->url() ); KFileItemList list; list.append( &it ); if ( fileWidget->del(list, window, (k->state() & ShiftButton) == 0) == 0L ) return true; // aborted deletion // ### check failure asynchronously and restore old item? fileWidget->setCurrentItem( item ); } else if ( m_toggleBrowserAction->shortcut().contains( key ) ) { toggleBrowser(); return true; // don't pass keyEvent } else ret = false; if ( FileWidget::isImage( item ) ) { // QString filename; // KIO::NetAccess::download(item->url(), filename, this); m_viewer->showNextImage( item->url() ); if ( kdata->preloadImage && item_next ) { // preload next image if ( FileWidget::isImage( item_next ) ) m_viewer->cacheImage( item_next->url() ); } ret = true; // don't pass keyEvent } } // keyPressEvent on ImageWindow // doubleclick closes image window // and shows browser when last window closed via doubleclick else if ( eventType == QEvent::MouseButtonDblClick ) { QMouseEvent *ev = static_cast<QMouseEvent*>( e ); if ( ev->button() == LeftButton ) { if ( s_viewers.count() == 1 ) { if ( !fileWidget ) { // KURL start; // QFileInfo fi( window->filename() ); // start.setPath( fi.dirPath( true ) ); initGUI( window->currentFile()->url().fileName() ); } show(); raise(); } window->close( true ); ev->accept(); ret = true; } } } // isA ImageWindow if ( ret ) return true; return KMainWindow::eventFilter( o, e ); }
bool KuickShow::showImage( const KFileItem *fi, bool newWindow, bool fullscreen, bool moveToTopLeft ) { newWindow |= !m_viewer; fullscreen |= (newWindow && kdata->fullScreen); if ( FileWidget::isImage( fi ) ) { if ( newWindow ) { m_viewer = new ImageWindow( kdata->idata, id, 0L, "image window" ); m_viewer->setFullscreen( fullscreen ); s_viewers.append( m_viewer ); connect( m_viewer, SIGNAL( destroyed() ), SLOT( viewerDeleted() )); connect( m_viewer, SIGNAL( sigFocusWindow( ImageWindow *) ), this, SLOT( slotSetActiveViewer( ImageWindow * ) )); connect( m_viewer, SIGNAL( sigImageError(const KuickFile *, const QString& ) ), this, SLOT( messageCantLoadImage(const KuickFile *, const QString &) )); connect( m_viewer, SIGNAL( requestImage( ImageWindow *, int )), this, SLOT( slotAdvanceImage( ImageWindow *, int ))); connect( m_viewer, SIGNAL( pauseSlideShowSignal() ), this, SLOT( pauseSlideShow() ) ); connect( m_viewer, SIGNAL (deleteImage (ImageWindow *)), this, SLOT (slotDeleteCurrentImage (ImageWindow *))); connect( m_viewer, SIGNAL (trashImage (ImageWindow *)), this, SLOT (slotTrashCurrentImage (ImageWindow *))); if ( s_viewers.count() == 1 && moveToTopLeft ) { // we have to move to 0x0 before showing _and_ // after showing, otherwise we get some bogus geometry() m_viewer->move( Kuick::workArea().topLeft() ); } m_viewer->installEventFilter( this ); } // for some strange reason, m_viewer sometimes changes during the // next few lines of code, so as a workaround, we use safeViewer here. // This happens when calling KuickShow with two or more remote-url // arguments on the commandline, where the first one is loaded properly // and the second isn't (e.g. because it is a pdf or something else, // Imlib can't load). ImageWindow *safeViewer = m_viewer; // file->waitForDownload( this ); // QString filename; // KIO::NetAccess::download(fi->url(), filename, this); if ( !safeViewer->showNextImage( fi->url() ) ) { m_viewer = safeViewer; safeViewer->close( true ); // couldn't load image, close window } else { // safeViewer->setFullscreen( fullscreen ); if ( newWindow ) { // safeViewer->show(); if ( !fullscreen && s_viewers.count() == 1 && moveToTopLeft ) { // the WM might have moved us after showing -> strike back! // move the first image to 0x0 workarea coord safeViewer->move( Kuick::workArea().topLeft() ); } } if ( kdata->preloadImage && fileWidget ) { KFileItem *item = 0L; // don't move cursor item = fileWidget->getItem( FileWidget::Next, true ); if ( item ) safeViewer->cacheImage( item->url() ); } m_viewer = safeViewer; return true; } // m_viewer created successfully } // isImage return false; }