/*************************************************************************** kookaview.cpp - kookas visible stuff ------------------- begin : ? copyright : (C) 1999 by Klaas Freitag email : freitag@suse.de $Id$ ***************************************************************************/ /*************************************************************************** * * * This file may be distributed and/or modified under the terms of the * * GNU General Public License version 2 as published by the Free Software * * Foundation and appearing in the file COPYING included in the * * packaging of this file. * * * As a special exception, permission is given to link this program * * with any version of the KADMOS ocr/icr engine of reRecognition GmbH, * * Kreuzlingen and distribute the resulting executable without * * including the source code for KADMOS in the source distribution. * * * As a special exception, permission is given to link this program * * with any edition of TQt, and distribute the resulting executable, * * without including the source code for TQt in the source distribution. * * * ***************************************************************************/ #include "kookaview.h" #include "resource.h" #include "kscandevice.h" #include "imgscaninfo.h" #include "devselector.h" #include "ksaneocr.h" #include "img_saver.h" #include "kookapref.h" #include "imgnamecombo.h" #include "thumbview.h" #include "dwmenuaction.h" #include "kookaimage.h" #include "kookaimagemeta.h" #include "ocrresedit.h" #include "kookaprint.h" #include "imgprintdialog.h" #if 0 #include "paramsetdialogs.h" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define STARTUP_IMG_SELECTION "SelectedImageOnStartup" KookaView::KookaView( KParts::DockMainWindow *parent, const TQCString& deviceToUse) : TQObject(), m_ocrResultImg(0), ocrFabric(0), m_mainDock(0), m_dockScanParam(0), m_dockThumbs(0), m_dockPackager(0), m_dockRecent(0), m_dockPreview(0), m_dockOCRText(0), m_mainWindow(parent), m_ocrResEdit(0) { KIconLoader *loader = KGlobal::iconLoader(); scan_params = 0L; preview_canvas = 0L; m_mainDock = parent->createDockWidget( "Kookas MainDock", loader->loadIcon( "folder_image", KIcon::Small ), 0L, i18n("Image Viewer")); m_mainDock->setEnableDocking(KDockWidget::DockNone ); m_mainDock->setDockSite( KDockWidget::DockFullSite ); parent->setView( m_mainDock); parent->setMainDockWidget( m_mainDock); img_canvas = new ImageCanvas( m_mainDock ); img_canvas->setMinimumSize(100,200); img_canvas->enableContextMenu(true); connect( img_canvas, TQT_SIGNAL( imageReadOnly(bool)), this, TQT_SLOT(slViewerReadOnly(bool))); KPopupMenu *ctxtmenu = static_cast(img_canvas->contextMenu()); if( ctxtmenu ) ctxtmenu->insertTitle(i18n("Image View")); m_mainDock->setWidget( img_canvas ); /** Thumbview **/ m_dockThumbs = parent->createDockWidget( "Thumbs", loader->loadIcon( "thumbnail", KIcon::Small ), 0L, i18n("Thumbnails")); m_dockThumbs->setDockSite(KDockWidget::DockFullSite ); /* thumbnail viewer widget */ m_thumbview = new ThumbView( m_dockThumbs); m_dockThumbs->setWidget( m_thumbview ); m_dockThumbs->manualDock( m_mainDock, // dock target KDockWidget::DockBottom, // dock site 20 ); // relation target/this (in percent) /** Packager Dock **/ /* A new packager to contain the already scanned images */ m_dockPackager = parent->createDockWidget( "Scanpackager", loader->loadIcon( "palette_color", KIcon::Small ), 0L, i18n("Gallery")); m_dockPackager->setDockSite(KDockWidget::DockFullSite); packager = new ScanPackager( m_dockPackager ); m_dockPackager->setWidget( packager ); m_dockPackager->manualDock( m_mainDock, // dock target KDockWidget::DockLeft, // dock site 30 ); // relation target/this (in percent) connect( packager, TQT_SIGNAL(showThumbnails( KFileTreeViewItem* )), this, TQT_SLOT( slShowThumbnails( KFileTreeViewItem* ))); connect( m_thumbview, TQT_SIGNAL( selectFromThumbnail( const KURL& )), packager, TQT_SLOT( slSelectImage(const KURL&))); /* * Create a Kombobox that holds the last folders visible even on the preview page */ m_dockRecent = parent->createDockWidget( "Recent", loader->loadIcon( "image", KIcon::Small ), 0L, i18n("Gallery Folders")); m_dockRecent->setDockSite(KDockWidget::DockFullSite); TQHBox *recentBox = new TQHBox( m_dockRecent ); recentBox->setMargin(KDialog::marginHint()); TQLabel *lab = new TQLabel( i18n("Gallery:"), recentBox ); lab->tqsetSizePolicy( TQSizePolicy(TQSizePolicy::Fixed, TQSizePolicy::Fixed) ); recentFolder = new ImageNameCombo( recentBox ); m_dockRecent->setWidget( recentBox ); m_dockRecent->manualDock( m_dockPackager, // dock target KDockWidget::DockBottom, // dock site 5 ); // relation target/this (in percent) connect( packager, TQT_SIGNAL( galleryPathSelected( KFileTreeBranch*, const TQString&)), recentFolder, TQT_SLOT( slotGalleryPathChanged( KFileTreeBranch*, const TQString& ))); connect( packager, TQT_SIGNAL( directoryToRemove( KFileTreeBranch*, const TQString&)), recentFolder, TQT_SLOT( slotPathRemove( KFileTreeBranch*, const TQString& ))); connect( recentFolder, TQT_SIGNAL(activated( const TQString& )), packager, TQT_SLOT(slotSelectDirectory( const TQString& ))); /* the object from the kscan lib to handle low level scanning */ m_dockScanParam = parent->createDockWidget( "Scan Parameter", loader->loadIcon( "folder", KIcon::Small ), 0L, i18n("Scan Parameter")); // m_dockScanParam->setDockSite(KDockWidget::DockFullSite); m_dockScanParam->setWidget( 0 ); // later sane = new KScanDevice( TQT_TQOBJECT(m_dockScanParam) ); Q_CHECK_PTR(sane); m_dockScanParam->manualDock( m_dockRecent, // dock target KDockWidget::DockBottom, // dock site 20 ); // relation target/this (in percent) m_dockScanParam->hide(); /* select the scan device, either user or from config, this creates and assembles * the complete scanner options dialog * scan_params must be zero for that */ m_dockPreview = parent->createDockWidget( "Preview ", loader->loadIcon( "viewmag", KIcon::Small ), 0L, i18n("Scan Preview")); preview_canvas = new Previewer( m_dockPreview ); { preview_canvas->setMinimumSize( 100,100); /* since the scan_params will be created in slSelectDevice, do the * connections later */ } m_dockPreview->setWidget( preview_canvas ); m_dockPreview->manualDock( m_mainDock, // dock target KDockWidget::DockCenter, // dock site 100 ); // relation target/this (in percent) /* Create a text editor part for ocr results */ m_dockOCRText = parent->createDockWidget( "OCRResults", loader->loadIcon("edit", KIcon::Small ), 0L, i18n("OCR Result Text")); // m_textEdit m_ocrResEdit = new ocrResEdit( m_dockOCRText ); if( m_ocrResEdit ) { m_dockOCRText->setWidget( m_ocrResEdit ); // m_textEdit->widget() ); m_dockOCRText->manualDock( m_dockThumbs, // dock target KDockWidget::DockCenter, // dock site 100 ); // relation target/this (in percent) m_ocrResEdit->setTextFormat( TQt::PlainText ); m_ocrResEdit->setWordWrap( TQTextEdit::NoWrap ); // m_dockOCRText->hide(); } if( slSelectDevice(deviceToUse)) { /* Load from config which tab page was selected last time */ } /* New image created after scanning */ connect(sane, TQT_SIGNAL(sigNewImage(TQImage*,ImgScanInfo*)), this, TQT_SLOT(slNewImageScanned(TQImage*,ImgScanInfo*))); /* New preview image */ connect(sane, TQT_SIGNAL(sigNewPreview(TQImage*,ImgScanInfo *)), this, TQT_SLOT( slNewPreview(TQImage*,ImgScanInfo *))); connect( sane, TQT_SIGNAL( sigScanStart() ), this, TQT_SLOT( slScanStart())); connect( sane, TQT_SIGNAL( sigScanFinished(KScanStat)), this, TQT_SLOT(slScanFinished(KScanStat))); connect( sane, TQT_SIGNAL( sigAcquireStart()), this, TQT_SLOT( slAcquireStart())); /* Image canvas should show a new document */ connect( packager, TQT_SIGNAL( showImage( KookaImage* )), this, TQT_SLOT( slShowAImage( KookaImage*))); connect( packager, TQT_SIGNAL( aboutToShowImage(const KURL&)), this, TQT_SLOT( slStartLoading( const KURL& ))); /* Packager unloads the image */ connect( packager, TQT_SIGNAL( unloadImage( KookaImage* )), this, TQT_SLOT( slUnloadAImage( KookaImage*))); /* a image changed mostly through a image manipulation method like rotate */ connect( packager, TQT_SIGNAL( fileChanged( KFileItem* )), m_thumbview, TQT_SLOT( slImageChanged( KFileItem* ))); connect( packager, TQT_SIGNAL( fileRenamed( KFileItem*, const KURL& )), m_thumbview, TQT_SLOT( slImageRenamed( KFileItem*, const KURL& ))); connect( packager, TQT_SIGNAL( fileDeleted( KFileItem* )), m_thumbview, TQT_SLOT( slImageDeleted( KFileItem* ))); packager->openRoots(); /* tqStatus Bar */ KStatusBar *statBar = m_mainWindow->statusBar(); // statBar->insertItem(TQString("1"), SBAR_ZOOM, 0, true ); statBar->insertItem( TQString("-"), StatusImage, 0, true ); /* Set a large enough size */ int w = statBar->fontMetrics(). width(img_canvas->imageInfoString(2000, 2000, 48)); kdDebug(28000) << "Fixed size for status bar: " << w << " from string " << img_canvas->imageInfoString(2000, 2000, 48) << endl; statBar->setItemFixed( StatusImage, w ); } KookaView::~KookaView() { saveProperties( KGlobal::config () ); delete preview_canvas; kdDebug(28000)<< "Finished saving config data" << endl; } void KookaView::slViewerReadOnly( bool ) { /* retrieve actions that could change the image */ } bool KookaView::slSelectDevice( const TQCString& useDevice ) { kdDebug(28000) << "Kookaview: select a device!" << endl; bool haveConnection = false; TQCString selDevice; /* in case useDevice is the term 'gallery', the user does not want to * connect to a scanner, but only work in gallery mode. Otherwise, try * to read the device to use from config or from a user dialog */ if( useDevice != "gallery" ) { selDevice = useDevice; if( selDevice.isEmpty()) { selDevice = userDeviceSelection(); } } if( !selDevice.isEmpty() ) { kdDebug(28000) << "Opening device " << selDevice << endl; if( connectedDevice == selDevice ) { kdDebug( 28000) << "Device " << selDevice << " is already selected!" << endl; return( true ); } if( scan_params ) { /* This deletes the existing scan_params^-object */ slCloseScanDevice(); } /* This connects to the selected scanner */ scan_params = new ScanParams( m_dockScanParam ); Q_CHECK_PTR(scan_params); if( sane->openDevice( selDevice ) == KSCAN_OK ) { connect( scan_params, TQT_SIGNAL( scanResolutionChanged( int, int )), preview_canvas, TQT_SLOT( slNewScanResolutions( int, int ))); if( ! scan_params->connectDevice( sane ) ) { kdDebug(28000) << "Connecting to the scanner failed :( ->TODO" << endl; } else { haveConnection = true; connectedDevice = selDevice; /* New Rectangle selection in the preview, now scanimge exists */ ImageCanvas *previewCanvas = preview_canvas->getImageCanvas(); connect( previewCanvas , TQT_SIGNAL( newRect(TQRect)), scan_params, TQT_SLOT(slCustomScanSize(TQRect))); connect( previewCanvas, TQT_SIGNAL( noRect()), scan_params, TQT_SLOT(slMaximalScanSize())); // connect( scan_params, TQT_SIGNAL( scanResolutionChanged( int, int )), // preview_canvas, TQT_SLOT( slNewScanResolutions( int, int ))); /* load the preview image */ if( preview_canvas ) { preview_canvas->setPreviewImage( sane->loadPreviewImage() ); /* Call this after the devic is actually open */ preview_canvas->slConnectScanner( sane ); } } } else { kdDebug(28000) << "Could not open device <" << selDevice << ">" << endl; scan_params->connectDevice(0); } /* show the widget again */ m_dockScanParam->setWidget( scan_params ); m_dockScanParam->show(); } else { // no devices available or starting in gallery mode if( scan_params ) scan_params->connectDevice( 0L ); } return( haveConnection ); } TQCString KookaView::userDeviceSelection( ) const { /* Human readable scanner descriptions */ TQStringList hrbackends; /* a list of backends the scan backend knows */ TQStrList backends = sane->getDevices(); TQStrListIterator it( backends ); TQCString selDevice; if( backends.count() > 0 ) { while( it ) { kdDebug( 28000 ) << "Found backend: " << it.current() << endl; hrbackends.append( sane->getScannerName( it.current() )); ++it; } /* allow the user to select one */ DeviceSelector ds( 0, backends, hrbackends ); selDevice = ds.getDeviceFromConfig( ); if( selDevice.isEmpty() || selDevice.isNull() ) { kdDebug(29000) << "selDevice not found - starting selector!" << selDevice << endl; if ( ds.exec() == TQDialog::Accepted ) { selDevice = ds.getSelectedDevice(); } } } return( selDevice ); } void KookaView::loadStartupImage( void ) { kdDebug( 28000) << "Starting to load startup image" << endl; /* Now set the configured stuff */ KConfig *konf = KGlobal::config (); if( konf ) { konf->setGroup(GROUP_STARTUP); bool wantReadOnStart = konf->readBoolEntry( STARTUP_READ_IMAGE, true ); if( wantReadOnStart ) { TQString startup = konf->readPathEntry( STARTUP_IMG_SELECTION ); if( !startup.isEmpty() ) { kdDebug(28000) << "Loading startup image !" << endl; packager->slSelectImage( KURL(startup) ); } } else { kdDebug(28000) << "Do not load startup image due to config value" << endl; } } } void KookaView::print() { /* For now, print a single file. Later, print multiple images to one page */ KookaImage *img = packager->getCurrImage(); if ( !img ) return; KPrinter printer; // ( true, pMode ); printer.setUsePrinterResolution(true); printer.addDialogPage( new ImgPrintDialog( img )); if( printer.setup( m_mainWindow, i18n("Print %1").tqarg(img->localFileName().section('/', -1)) )) { KookaPrint kookaprint( &printer ); kookaprint.printImage(img); } } void KookaView::slNewPreview( TQImage *new_img, ImgScanInfo * ) { if( new_img ) { if( ! new_img->isNull() ) { /* flip preview to front */ m_dockPreview->makeDockVisible(); } preview_canvas->newImage( new_img ); } } bool KookaView::ToggleVisibility( int item ) { TQWidget *w = 0; bool ret = false; switch( item ) { case ID_VIEW_SCANPARAMS: w = scan_params; break; case ID_VIEW_POOL: w = preview_canvas; break; default: w = 0; } if( w ) { if( w->isVisible() ) { w->hide(); ret = false; } else { w->show(); ret = true; } } return ret; } void KookaView::doOCRonSelection( void ) { emit( signalChangeStatusbar( i18n("Starting OCR on selection" ))); KookaImage img; if( img_canvas->selectedImage(&img) ) { startOCR( &img ); } emit( signalCleanStatusbar() ); } /* Does OCR on the entire picture */ void KookaView::doOCR( void ) { emit( signalChangeStatusbar( i18n("Starting OCR on the entire image" ))); KookaImage *img = packager->getCurrImage(); startOCR( img ); emit( signalCleanStatusbar( )); } void KookaView::startOCR( KookaImage *img ) { if( img && ! img->isNull() ) { if( ocrFabric == 0L ) { ocrFabric = new KSANEOCR( m_mainDock, KGlobal::config() ); ocrFabric->setImageCanvas( img_canvas ); connect( ocrFabric, TQT_SIGNAL( newOCRResultText( const TQString& )), m_ocrResEdit, TQT_SLOT(setText( const TQString& ))); connect( ocrFabric, TQT_SIGNAL( newOCRResultText( const TQString& )), m_dockOCRText, TQT_SLOT( show() )); connect( ocrFabric, TQT_SIGNAL( repaintOCRResImage( )), img_canvas, TQT_SLOT(tqrepaint())); connect( ocrFabric, TQT_SIGNAL( clearOCRResultText()), m_ocrResEdit, TQT_SLOT(clear())); connect( ocrFabric, TQT_SIGNAL( updateWord(int, const TQString&, const TQString& )), m_ocrResEdit, TQT_SLOT( slUpdateOCRResult( int, const TQString&, const TQString& ))); connect( ocrFabric, TQT_SIGNAL( ignoreWord(int, const ocrWord&)), m_ocrResEdit, TQT_SLOT( slIgnoreWrongWord( int, const ocrWord& ))); connect( ocrFabric, TQT_SIGNAL( markWordWrong(int, const ocrWord& )), m_ocrResEdit, TQT_SLOT( slMarkWordWrong( int, const ocrWord& ))); connect( ocrFabric, TQT_SIGNAL( readOnlyEditor( bool )), m_ocrResEdit, TQT_SLOT( setReadOnly( bool ))); connect( ocrFabric, TQT_SIGNAL( selectWord( int, const ocrWord& )), m_ocrResEdit, TQT_SLOT( slSelectWord( int, const ocrWord& ))); } Q_CHECK_PTR( ocrFabric ); ocrFabric->slSetImage( img ); if( !ocrFabric->startOCRVisible(m_mainDock) ) { KMessageBox::sorry(0, i18n("Could not start OCR-Process.\n" "Probably there is already one running." )); } } } void KookaView::slOCRResultImage( const TQPixmap& pix ) { kdDebug(28000) << "Showing OCR Result Image" << endl; if( ! img_canvas ) return; if( m_ocrResultImg ) { img_canvas->newImage(0L); delete m_ocrResultImg; } m_ocrResultImg = new TQImage(); *m_ocrResultImg = pix; img_canvas->newImage( m_ocrResultImg ); img_canvas->setReadOnly(true); // ocr result images should be read only. } void KookaView::slScanStart( ) { kdDebug(28000) << "Scan starts " << endl; if( scan_params ) { scan_params->setEnabled( false ); KLed *led = scan_params->operationLED(); if( led ) { led->setColor( TQt::red ); led->setState( KLed::On ); } } } void KookaView::slAcquireStart( ) { kdDebug(28000) << "Acquire starts " << endl; if( scan_params ) { KLed *led = scan_params->operationLED(); if( led ) { led->setColor( TQt::green ); } } } void KookaView::slNewImageScanned( TQImage* img, ImgScanInfo* si ) { KookaImageMeta *meta = new KookaImageMeta; meta->setScanResolution(si->getXResolution(), si->getYResolution()); packager->slAddImage(img, meta); } void KookaView::slScanFinished( KScanStat stat ) { kdDebug(28000) << "Scan finished with status " << stat << endl; if( scan_params ) { scan_params->setEnabled( true ); KLed *led = scan_params->operationLED(); if( led ) { led->setColor( TQt::green ); led->setState( KLed::Off ); } } } void KookaView::slCloseScanDevice( ) { kdDebug(28000) << "Scanner Device closes down !" << endl; if( scan_params ) { delete scan_params; scan_params = 0; m_dockScanParam->setWidget(0L); m_dockScanParam->hide(); } sane->slCloseDevice(); } void KookaView::slCreateNewImgFromSelection() { if( img_canvas->rootImage() ) { emit( signalChangeStatusbar( i18n("Create new image from selection" ))); TQImage img; if( img_canvas->selectedImage( &img ) ) { packager->slAddImage( &img ); } emit( signalCleanStatusbar( )); } } void KookaView::slRotateImage(int angle) { // TQImage *img = (TQImage*) img_canvas->rootImage(); KookaImage *img = packager->getCurrImage(); bool doUpdate = true; if( img ) { TQImage resImg; TQApplication::setOverrideCursor(waitCursor); switch( angle ) { case 90: emit( signalChangeStatusbar( i18n("Rotate image 90 degrees" ))); resImg = rotateRight( img ); break; case 180: emit( signalChangeStatusbar( i18n("Rotate image 180 degrees" ))); resImg = rotate180( img ); break; case 270: case -90: emit( signalChangeStatusbar( i18n("Rotate image -90 degrees" ))); resImg = rotateLeft( img ); break; default: kdDebug(28000) << "Not supported yet !" << endl; doUpdate = false; break; } TQApplication::restoreOverrideCursor(); /* updateCurrImage does the status-bar cleanup */ if( doUpdate ) updateCurrImage( resImg ); else emit(signalCleanStatusbar()); } } void KookaView::slMirrorImage( MirrorType m ) { const TQImage *img = img_canvas->rootImage(); bool doUpdate = true; if( img ) { TQImage resImg; TQApplication::setOverrideCursor(waitCursor); switch( m ) { case MirrorVertical: emit( signalChangeStatusbar( i18n("Mirroring image vertically" ))); resImg = img->mirror(); break; case MirrorHorizontal: emit( signalChangeStatusbar( i18n("Mirroring image horizontally" ))); resImg = img->mirror( true, false ); break; case MirrorBoth: emit( signalChangeStatusbar( i18n("Mirroring image in both directions" ))); resImg = img->mirror( true, true ); break; default: kdDebug(28000) << "Mirroring: no way ;)" << endl; doUpdate = false; } TQApplication::restoreOverrideCursor(); /* updateCurrImage does the status-bar cleanup */ if( doUpdate ) updateCurrImage( resImg ); else emit(signalCleanStatusbar()); // img_canvas->newImage( ); } } void KookaView::slSaveOCRResult() { if( ! m_ocrResEdit ) return; m_ocrResEdit->slSaveText(); } void KookaView::slLoadScanParams( ) { if( ! sane ) return; #if 0 /* not yet cooked */ LoadSetDialog loadDialog( m_mainDock, sane->shortScannerName(), sane ); if( loadDialog.exec()) { kdDebug(28000)<< "Executed successfully" << endl; } #endif } void KookaView::slSaveScanParams( ) { if( !sane ) return; /* not yet cooked */ #if 0 KScanOptSet optSet( "SaveSet" ); sane->getCurrentOptions( &optSet ); SaveSetDialog dialog( m_mainDock /* this */ , &optSet ); if( dialog.exec()) { kdDebug(28000)<< "Executed successfully" << endl; TQString name = dialog.paramSetName(); TQString desc = dialog.paramSetDescription(); sane->slSaveScanConfigSet( name, desc ); } #endif } void KookaView::slShowAImage( KookaImage *img ) { kdDebug(28000) << "Show new Image" << endl; if( img_canvas ) { img_canvas->newImage( img ); img_canvas->setReadOnly(false); } /* tell ocr about */ if( ocrFabric ) { ocrFabric->slSetImage( img ); } /* tqStatus Bar */ KStatusBar *statBar = m_mainWindow->statusBar(); if( img_canvas ) statBar->changeItem( img_canvas->imageInfoString(), StatusImage ); } void KookaView::slUnloadAImage( KookaImage * ) { kdDebug(28000) << "Unloading Image" << endl; if( img_canvas ) { img_canvas->newImage( 0L ); } } void KookaView::slShowThumbnails(KFileTreeViewItem *dirKfi, bool forceRedraw ) { /* If no item is specified, use the current one */ if( ! dirKfi ) { /* do on the current visible dir */ KFileTreeViewItem *kftvi = packager->currentKFileTreeViewItem(); if ( !kftvi ) { return; } if( kftvi->isDir()) { dirKfi = kftvi; } else { kftvi = static_cast(static_cast(kftvi)->parent()); dirKfi = kftvi; forceRedraw = true; packager->setSelected( static_cast(dirKfi), true ); } } kdDebug(28000) << "Showing thumbs for " << dirKfi->url().prettyURL() << endl; /* Only do the new thumbview if the old is on another dir */ if( m_thumbview && (forceRedraw || m_thumbview->currentDir() != dirKfi->url()) ) { m_thumbview->clear(); /* Find a list of child KFileItems */ if( forceRedraw ) m_thumbview->readSettings(); KFileItemList fileItemsList; TQListViewItem * myChild = dirKfi->firstChild(); while( myChild ) { fileItemsList.append( static_cast(myChild)->fileItem()); myChild = myChild->nextSibling(); } m_thumbview->slNewFileItems( fileItemsList ); m_thumbview->setCurrentDir( dirKfi->url()); // m_thumbview->arrangeItemsInGrid(); } } /* this slot is called when the user clicks on an image in the packager * and loading of the image starts */ void KookaView::slStartLoading( const KURL& url ) { emit( signalChangeStatusbar( i18n("Loading %1" ).tqarg( url.prettyURL() ) )); // if( m_stack->visibleWidget() != img_canvas ) // { // m_stack->raiseWidget( img_canvas ); // } } void KookaView::updateCurrImage( TQImage& img ) { if( ! img_canvas->readOnly() ) { emit( signalChangeStatusbar( i18n("Storing image changes" ))); packager->slotCurrentImageChanged( &img ); emit( signalCleanStatusbar()); } else { emit( signalChangeStatusbar( i18n("Can not save image, it is write protected!"))); kdDebug(28000) << "Image is write protected, no saving!" << endl; } } void KookaView::saveProperties(KConfig *config) { kdDebug(28000) << "Saving Properties for KookaView !" << endl; config->setGroup( GROUP_STARTUP ); /* Get with path */ config->writePathEntry( STARTUP_IMG_SELECTION, packager->getCurrImageFileName(true)); } void KookaView::slOpenCurrInGraphApp( void ) { TQString file; if( packager ) { KFileTreeViewItem *ftvi = packager->currentKFileTreeViewItem(); if( ! ftvi ) return; kdDebug(28000) << "Trying to open <" << ftvi->url().prettyURL()<< ">" << endl; KURL::List urllist; urllist.append( ftvi->url()); KRun::displayOpenWithDialog( urllist ); } } TQImage KookaView::rotateLeft( TQImage *m_img ) { TQImage rot; if( m_img ) { TQWMatrix m; m.rotate(-90); rot = m_img->xForm(m); } return( rot ); } TQImage KookaView::rotateRight( TQImage *m_img ) { TQImage rot; if( m_img ) { TQWMatrix m; m.rotate(+90); rot = m_img->xForm(m); } return( rot ); } TQImage KookaView::rotate180( TQImage *m_img ) { TQImage rot; if( m_img ) { TQWMatrix m; m.rotate(+180); rot = m_img->xForm(m); } return( rot ); } void KookaView::connectViewerAction( KAction *action ) { TQPopupMenu *popup = img_canvas->contextMenu(); kdDebug(29000) << "This is the popup: " << popup << endl; if( popup && action ) { action->plug( popup ); } } void KookaView::connectGalleryAction( KAction *action ) { TQPopupMenu *popup = packager->contextMenu(); if( popup && action ) { action->plug( popup ); } } void KookaView::slFreshUpThumbView() { if( m_thumbview ) { /* readSettings returns true if something changes */ if( m_thumbview->readSettings() ) { kdDebug(28000) << "Thumbview-Settings changed, readraw thumbs" << endl; /* new settings */ slShowThumbnails(0, true); } } } void KookaView::createDockMenu( KActionCollection *col, KDockMainWindow *mainWin, const char * name ) { KActionMenu *actionMenu = new KActionMenu( i18n("Tool Views"), "view_icon", col, name ); actionMenu->insert( new dwMenuAction( i18n("Show Image Viewer"), KShortcut(), m_mainDock, col, mainWin, "dock_viewer" )); actionMenu->insert( new dwMenuAction( i18n("Show Preview"), KShortcut(), m_dockPreview, col, mainWin, "dock_preview" )); actionMenu->insert( new dwMenuAction( i18n("Show Recent Gallery Folders"), KShortcut(), m_dockRecent, col, mainWin, "dock_recent" )); actionMenu->insert( new dwMenuAction( i18n("Show Gallery"), KShortcut(), m_dockPackager, col, mainWin, "dock_gallery" )); actionMenu->insert( new dwMenuAction( i18n("Show Thumbnail Window"), KShortcut(), m_dockThumbs, col, mainWin, "dock_thumbs" )); actionMenu->insert( new dwMenuAction( i18n("Show Scan Parameters"), KShortcut(), m_dockScanParam, col, mainWin, "dock_scanparams" )); actionMenu->insert( new dwMenuAction( i18n("Show OCR Results"), KShortcut(), m_dockOCRText, col, mainWin, "dock_ocrResults" )); } #include "kookaview.moc"