diff options
Diffstat (limited to 'src/gvimagepart')
-rw-r--r-- | src/gvimagepart/Makefile.am | 20 | ||||
-rw-r--r-- | src/gvimagepart/gvimagepart.cpp | 450 | ||||
-rw-r--r-- | src/gvimagepart/gvimagepart.desktop | 48 | ||||
-rw-r--r-- | src/gvimagepart/gvimagepart.h | 181 | ||||
-rw-r--r-- | src/gvimagepart/gvimagepart.rc | 40 | ||||
-rw-r--r-- | src/gvimagepart/gvimagepartpopup.rc | 7 |
6 files changed, 746 insertions, 0 deletions
diff --git a/src/gvimagepart/Makefile.am b/src/gvimagepart/Makefile.am new file mode 100644 index 0000000..6ed0ff3 --- /dev/null +++ b/src/gvimagepart/Makefile.am @@ -0,0 +1,20 @@ +INCLUDES = -I$(srcdir)/.. $(all_includes) + +# These are not really libraries, but modules dynamically opened. +# So they should be installed in kde_module_dir, which is usually $kde_prefix/lib/kde3 +kde_module_LTLIBRARIES = libgvimagepart.la + +libgvimagepart_la_SOURCES = gvimagepart.cpp +libgvimagepart_la_LIBADD = $(LIB_KPARTS) ../gvcore/libgwenviewcore.la +libgvimagepart_la_LDFLAGS = $(all_libraries) $(KDE_PLUGIN) + +# Automatically generate moc files +METASOURCES = AUTO + +# Install the XML-UI file to its correct location +gvdir = $(kde_datadir)/gvimagepart +gv_DATA = gvimagepart.rc gvimagepartpopup.rc + +# Install the .desktop file into the kde_services directory +kde_services_DATA = gvimagepart.desktop + diff --git a/src/gvimagepart/gvimagepart.cpp b/src/gvimagepart/gvimagepart.cpp new file mode 100644 index 0000000..5750445 --- /dev/null +++ b/src/gvimagepart/gvimagepart.cpp @@ -0,0 +1,450 @@ +/* +Copyright 2004 Jonathan Riddell <jr@jriddell.org> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307, USA. + +*/ +#include "gvimagepart.moc" + +#include <qapplication.h> +#include <qcursor.h> +#include <qfile.h> +#include <qpoint.h> + +#include <kaction.h> +#include <kapplication.h> +#include <kconfig.h> +#include <kdebug.h> +#include <kdirlister.h> +#include <kfiledialog.h> +#include <kiconloader.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kmimetype.h> +#include <kparts/genericfactory.h> + +#include <gvcore/cache.h> +#include <gvcore/document.h> +#include <gvcore/fileoperation.h> +#include <gvcore/printdialog.h> +#include <gvcore/imageview.h> +#include <gvcore/imageloader.h> +#include <gvcore/mimetypeutils.h> + +#include "config.h" + +namespace Gwenview { +// For now let's duplicate +const char CONFIG_CACHE_GROUP[]="cache"; + +#undef ENABLE_LOG +#undef LOG +#define ENABLE_LOG +#ifdef ENABLE_LOG +#define LOG(x) kdDebug() << k_funcinfo << x << endl +#else +#define LOG(x) ; +#endif + + +static bool storeData(QWidget* parent, QFile* file, const QByteArray& data) { + uint sizeWritten = file->writeBlock(data); + if (sizeWritten != data.size()) { + KMessageBox::error( + parent, + i18n("Could not save image to a temporary file")); + return false; + } + return true; +} + + +//Factory Code +typedef KParts::GenericFactory<GVImagePart> GVImageFactory; +K_EXPORT_COMPONENT_FACTORY( libgvimagepart /*library name*/, GVImageFactory ) + +GVImagePart::GVImagePart(QWidget* parentWidget, const char* /*widgetName*/, QObject* parent, + const char* name, const QStringList &) + : KParts::ReadOnlyPart( parent, name ) + , mPrefetch( NULL ) + , mLastDirection( DirectionUnknown ) { + GVImageFactory::instance()->iconLoader()->addAppDir( "gwenview"); + setInstance( GVImageFactory::instance() ); + KGlobal::locale()->insertCatalogue("gwenview"); + KGlobal::locale()->setActiveCatalogue("gwenview"); + + mBrowserExtension = new GVImagePartBrowserExtension(this); + + // Create the widgets + mDocument = new Document(this); + connect( mDocument, SIGNAL( loading()), SLOT( slotLoading())); + connect( mDocument, SIGNAL( loaded(const KURL&)), SLOT( slotLoaded(const KURL&))); + mImageView = new ImageView(parentWidget, mDocument, actionCollection()); + connect( mImageView, SIGNAL(requestContextMenu(const QPoint&)), + this, SLOT(openContextMenu(const QPoint&)) ); + setWidget(mImageView); + + mDirLister = new KDirLister; + mDirLister->setAutoErrorHandlingEnabled( false, 0 ); + mDirLister->setMainWindow(KApplication::kApplication()->mainWidget()); + connect( mDirLister, SIGNAL( clear()), SLOT( dirListerClear())); + connect( mDirLister, SIGNAL( newItems( const KFileItemList& )), + SLOT( dirListerNewItems( const KFileItemList& ))); + connect(mDirLister,SIGNAL(deleteItem(KFileItem*)), + SLOT(dirListerDeleteItem(KFileItem*)) ); + + QStringList mimeTypes=MimeTypeUtils::rasterImageMimeTypes(); + mDirLister->setMimeFilter(mimeTypes); + mPreviousImage=new KAction(i18n("&Previous Image"), + QApplication::reverseLayout() ? "1rightarrow":"1leftarrow", Key_BackSpace, + this,SLOT(slotSelectPrevious()), actionCollection(), "previous"); + mNextImage=new KAction(i18n("&Next Image"), + QApplication::reverseLayout() ? "1leftarrow":"1rightarrow", Key_Space, + this,SLOT(slotSelectNext()), actionCollection(), "next"); + updateNextPrevious(); + + KStdAction::saveAs( this, SLOT(saveAs()), actionCollection(), "saveAs" ); + new KAction(i18n("Rotate &Left"), "rotate_ccw", CTRL + Key_L, this, SLOT(rotateLeft()), actionCollection(), "rotate_left"); + new KAction(i18n("Rotate &Right"), "rotate_cw", CTRL + Key_R, this, SLOT(rotateRight()), actionCollection(), "rotate_right"); + + setXMLFile( "gvimagepart/gvimagepart.rc" ); +} + +GVImagePart::~GVImagePart() { + delete mDirLister; +} + + +void GVImagePart::partActivateEvent(KParts::PartActivateEvent* event) { + if (event->activated()) { + KConfig* config=new KConfig("gwenviewrc"); + Cache::instance()->readConfig(config,CONFIG_CACHE_GROUP); + delete config; + } + KParts::ReadOnlyPart::partActivateEvent( event ); +} + + +void GVImagePart::guiActivateEvent( KParts::GUIActivateEvent* event) { + // Stolen from KHTMLImage + // + // prevent the base implementation from emitting setWindowCaption with + // our url. It destroys our pretty, previously caption. Konq saves/restores + // the caption for us anyway. + if (event->activated()) { + return; + } + KParts::ReadOnlyPart::guiActivateEvent(event); +} + + +KAboutData* GVImagePart::createAboutData() { + KAboutData* aboutData = new KAboutData( "gvimagepart", I18N_NOOP("GVImagePart"), + "0.1", I18N_NOOP("Image Viewer"), + KAboutData::License_GPL, + "(c) 2004, Jonathan Riddell <jr@jriddell.org>"); + return aboutData; +} + +bool GVImagePart::openURL(const KURL& url) { + if (!url.isValid()) { + return false; + } + KURL oldURLDir = m_url; + oldURLDir.setFileName( QString::null ); + KURL newURLDir = url; + newURLDir.setFileName( QString::null ); + bool sameDir = oldURLDir == newURLDir; + m_url = url; + emit started( 0 ); + if( mDocument->url() == url ) { // reload button in Konqy - setURL would return immediately + mDocument->reload(); + } else { + mDocument->setURL(url); + } + if( !sameDir ) { + mDirLister->openURL(mDocument->dirURL()); + mLastDirection = DirectionUnknown; + } + return true; +} + +QString GVImagePart::filePath() { + return m_file; +} + +void GVImagePart::slotLoading() { + emit setWindowCaption(mDocument->url().filename() + " - " + i18n("Loading...")); + // Set the location bar URL because we can arrive here if the user click on + // previous/next, which do not use openURLRequest + emit mBrowserExtension->setLocationBarURL(mDocument->url().pathOrURL()); + updateNextPrevious(); +} + +void GVImagePart::slotLoaded(const KURL& url) { + QString caption = url.filename() + QString(" - %1x%2").arg(mDocument->width()).arg(mDocument->height()); + emit setWindowCaption(caption); + emit completed(); + emit setStatusBarText(i18n("Done.")); + prefetchDone(); + mPrefetch = ImageLoader::loader( mLastDirection == DirectionPrevious ? previousURL() : nextURL(), + this, BUSY_PRELOADING ); + connect( mPrefetch, SIGNAL( imageLoaded( bool )), SLOT( prefetchDone())); +} + +void GVImagePart::prefetchDone() { + if( mPrefetch != NULL ) { + mPrefetch->release( this ); + } + mPrefetch = NULL; +} + +void GVImagePart::print() { + KPrinter printer; + + printer.setDocName( m_url.filename() ); + KPrinter::addDialogPage( new PrintDialogPage( mDocument, mImageView, "GV page")); + + if (printer.setup(mImageView, QString::null, true)) { + mDocument->print(&printer); + } +} + +void GVImagePart::rotateLeft() { + mDocument->transform(ImageUtils::ROT_270); +} + +void GVImagePart::rotateRight() { + mDocument->transform(ImageUtils::ROT_90); +} + +void GVImagePart::dirListerClear() { + mImagesInDirectory.clear(); + updateNextPrevious(); +} + +void GVImagePart::dirListerNewItems( const KFileItemList& list ) { + QPtrListIterator<KFileItem> it(list); + for( ; it.current(); ++it ) { + mImagesInDirectory.append( (*it)->name()); + } + qHeapSort( mImagesInDirectory ); + updateNextPrevious(); +} + +void GVImagePart::dirListerDeleteItem( KFileItem* item ) { + mImagesInDirectory.remove( item->name()); + updateNextPrevious(); +} + +void GVImagePart::updateNextPrevious() { + QStringList::ConstIterator current = mImagesInDirectory.find( mDocument->filename()); + if( current == mImagesInDirectory.end()) { + mNextImage->setEnabled( false ); + mPreviousImage->setEnabled( false ); + return; + } + mPreviousImage->setEnabled( current != mImagesInDirectory.begin()); + ++current; + mNextImage->setEnabled( current != mImagesInDirectory.end()); +} + +KURL GVImagePart::nextURL() const { + QStringList::ConstIterator current = mImagesInDirectory.find( mDocument->filename()); + if( current == mImagesInDirectory.end()) { + return KURL(); + } + ++current; + if( current == mImagesInDirectory.end()) { + return KURL(); + } + KURL newURL = mDocument->dirURL(); + newURL.setFileName( *current ); + return newURL; +} + +void GVImagePart::slotSelectNext() { + KURL newURL = nextURL(); + if( newURL.isEmpty()) return; + mLastDirection = DirectionNext; + // Do not use mBrowserExtension->openURLRequest to avoid switching to + // another KPart + openURL(newURL); + emit mBrowserExtension->openURLNotify(); +} + +KURL GVImagePart::previousURL() const { + QStringList::ConstIterator current = mImagesInDirectory.find( mDocument->filename()); + if( current == mImagesInDirectory.end() || current == mImagesInDirectory.begin()) { + return KURL(); + } + --current; + KURL newURL = mDocument->dirURL(); + newURL.setFileName( *current ); + return newURL; +} + +void GVImagePart::slotSelectPrevious() { + KURL newURL = previousURL(); + if( newURL.isEmpty()) return; + mLastDirection = DirectionPrevious; + openURL(newURL); + emit mBrowserExtension->openURLNotify(); +} + + +void GVImagePart::saveAs() { + if (!mDocument->isModified()) { + saveOriginalAs(); + return; + } + + if (mDocument->canBeSaved()) { + mDocument->saveAs(); + return; + } + + KGuiItem saveItem(i18n("&Save Original"), "filesaveas"); + int result = KMessageBox::warningContinueCancel( + widget(), + i18n("Gwenview KPart can't save the modifications you made. Do you want to save the original image?"), + i18n("Warning"), + saveItem); + + if (result == KMessageBox::Cancel) return; + + saveOriginalAs(); +} + + +void GVImagePart::showJobError(KIO::Job* job) { + if (job->error() != 0) { + job->showErrorDialog(widget()); + } +} + + +void GVImagePart::saveOriginalAs() { + KURL srcURL = mDocument->url(); + KURL dstURL = KFileDialog::getSaveURL( + srcURL.fileName(), + QString::null, + widget()); + if (!dstURL.isValid()) return; + + // Try to get data from the cache to avoid downloading the image again. + QByteArray data = Cache::instance()->file(srcURL); + + if (data.size() == 0) { + // We need to read the image again. Let KIO::copy do the work. + KIO::Job* job = KIO::copy(srcURL, dstURL); + job->setWindow(widget()); + connect(job, SIGNAL(result(KIO::Job*)), + this, SLOT(showJobError(KIO::Job*)) ); + return; + } + + if (dstURL.isLocalFile()) { + // Destination is a local file, store it ourself + QString path = dstURL.path(); + QFile file(path); + if (!file.open(IO_WriteOnly)) { + KMessageBox::error( + widget(), + i18n("Could not open '%1' for writing.").arg(path)); + return; + } + storeData(widget(), &file, data); + return; + } + + // We need to send the data to a remote location + new DataUploader(widget(), data, dstURL); +} + + +DataUploader::DataUploader(QWidget* dialogParent, const QByteArray& data, const KURL& dstURL) +: mDialogParent(dialogParent) +{ + mTempFile.setAutoDelete(true); + + // Store it in a temp file + if (! storeData(dialogParent, mTempFile.file(), data) ) return; + + // Now upload it + KURL tmpURL; + tmpURL.setPath(mTempFile.name()); + KIO::Job* job = KIO::copy(tmpURL, dstURL); + job->setWindow(dialogParent); + connect(job, SIGNAL(result(KIO::Job*)), + this, SLOT(slotJobFinished(KIO::Job*)) ); +} + + +void DataUploader::slotJobFinished(KIO::Job* job) { + if (job->error() != 0) { + job->showErrorDialog(mDialogParent); + } + + delete this; +} + + +/** + * Overload KXMLGUIClient so that we can call setXML + */ +class PopupGUIClient : public KXMLGUIClient { +public: + PopupGUIClient( KInstance *inst, const QString &doc ) { + setInstance( inst ); + setXML( doc ); + } +}; + + +void GVImagePart::openContextMenu(const QPoint& pos) { + QString doc = KXMLGUIFactory::readConfigFile( "gvimagepartpopup.rc", true, instance() ); + PopupGUIClient guiClient(instance(), doc); + + KStdAction::saveAs( this, SLOT(saveAs()), guiClient.actionCollection(), "saveAs" ); + + KParts::URLArgs urlArgs; + urlArgs.serviceType = mDocument->mimeType(); + + KParts::BrowserExtension::PopupFlags flags = + KParts::BrowserExtension::ShowNavigationItems + | KParts::BrowserExtension::ShowUp + | KParts::BrowserExtension::ShowReload; + + emit mBrowserExtension->popupMenu(&guiClient, pos, m_url, urlArgs, flags, S_IFREG); +} + + +/***** GVImagePartBrowserExtension *****/ + +GVImagePartBrowserExtension::GVImagePartBrowserExtension(GVImagePart* viewPart, const char* name) + :KParts::BrowserExtension(viewPart, name) { + mGVImagePart = viewPart; + emit enableAction("print", true ); +} + +GVImagePartBrowserExtension::~GVImagePartBrowserExtension() { +} + +void GVImagePartBrowserExtension::print() { + mGVImagePart->print(); +} + +} // namespace diff --git a/src/gvimagepart/gvimagepart.desktop b/src/gvimagepart/gvimagepart.desktop new file mode 100644 index 0000000..97ce129 --- /dev/null +++ b/src/gvimagepart/gvimagepart.desktop @@ -0,0 +1,48 @@ +[Desktop Entry] +Type=Service +Name=Gwenview Image Viewer +Name[bg]=Gwenview - преглед на изображения +Name[br]=Gweler skeudennoù Gwenview +Name[ca]=Visor d'imatges Gwenview +Name[cs]=Prohlížeč obrázků Gwenview +Name[da]=Gwenview billedfremviser +Name[de]=Gwenview Bildbetrachter +Name[el]=Προβολέας εικόνων Gwenview +Name[es]=Visor de imágenes Gwenview +Name[et]=Gwenview pildinäitaja +Name[fa]=مشاهدهگر تصویر Gwenview +Name[fi]=Gwenview-kuvankatseluohjelma +Name[fr]=Aperçu d'images Gwenview +Name[gl]=Visor de Imaxes Gwenview +Name[hi]=ग्वेन-व्यू छवि प्रदर्शक +Name[hr]=Gwenview preglednik slika +Name[hu]=Gwenview képnézegető +Name[is]=Gwenview myndaskoðari +Name[it]=Visualizzatore di immagini Gwenview +Name[ja]=Gwenview 画像ビューア +Name[ka]=Gwenview სურათების დამთვალიერებელი +Name[ms]=Pelihat imej Gwenview +Name[nds]=Bildkieker Gwenview +Name[nl]=Gwenview Afbeeldingenweergave +Name[pa]=Gwenview ਚਿੱਤਰ ਦਰਸ਼ਕ +Name[pl]=Przeglądarka obrazków Gwenview +Name[pt]=Visualizador de Imagens Gwenview +Name[pt_BR]=Visualizador de Imagens Gwenview +Name[ru]=Gwenview +Name[sk]=Prehliadač obrázkov Gwenview +Name[sl]=Pregledovalnik slik Gwenview +Name[sr]=Прегледач слика Gwenview +Name[sr@Latn]=Pregledač slika Gwenview +Name[sv]=Gwenview bildvisare +Name[ta]=Gwenview பிம்பம் பார்வையாளர் +Name[tg]=Намоишгари тасвири Gwenview +Name[tr]=Gwenview Resim Gösterici +Name[uk]=Переглядач зображень - Gwenview +Name[vi]=Bộ xem ảnh Gwenview +Name[xx]=xxGwenview Image Viewerxx +Name[zh_CN]=Gwenview 图像查看器 +MimeType=image/gif;image/jpeg;image/png;image/x-bmp;image/x-eps;image/x-ico;image/x-krl;image/x-portable-bitmap;image/x-portable-pixmap;image/x-xbm;image/x-xpm +ServiceTypes=KParts/ReadOnlyPart +X-KDE-Library=libgvimagepart +InitialPreference=5 +Icon=gwenview diff --git a/src/gvimagepart/gvimagepart.h b/src/gvimagepart/gvimagepart.h new file mode 100644 index 0000000..d77adc7 --- /dev/null +++ b/src/gvimagepart/gvimagepart.h @@ -0,0 +1,181 @@ +/* +Copyright 2004 Jonathan Riddell <jr@jriddell.org> + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin Steet, Fifth Floor, Boston, MA 02111-1307, USA. + +*/ +#ifndef __gvimagepart_h__ +#define __gvimagepart_h__ + +#include <kparts/part.h> +#include <kparts/browserextension.h> +#include <ktempfile.h> + +// Forward declarations +class QFile; +class QPoint; + +class KAboutData; +class KAction; +class KDirLister; +class KFileItem; + +namespace Gwenview { +class ImageView; +class Document; +class ImageLoader; + +class GVImagePart; + +/** + * The browser extension is an attribute of GVImagePart and provides + * some services to Konqueror. All Konqueror KParts have one. + */ +class GVImagePartBrowserExtension: public KParts::BrowserExtension { + Q_OBJECT + +public: + GVImagePartBrowserExtension(GVImagePart* viewPart, const char* name=0L); + ~GVImagePartBrowserExtension(); + +public slots: + void print(); + +private: + GVImagePart* mGVImagePart; + +}; + +/** + * A Read Only KPart to view images using Gwenview + */ +class GVImagePart : public KParts::ReadOnlyPart { + Q_OBJECT +public: + GVImagePart(QWidget*, const char*, QObject*, const char*, const QStringList &); + virtual ~GVImagePart(); + + /** + * Return information about the part + */ + static KAboutData* createAboutData(); + + /** + * Returns m_file + */ + QString filePath(); + + /** + * Print the image being viewed + */ + void print(); + +public slots: + virtual bool openURL(const KURL& url); + +protected slots: + virtual bool openFile() { return false; } + + /** + * Rotates the current image 90 degrees counter clockwise + */ + void rotateLeft(); + + /** + * Rotates the current image 90 degrees clockwise + */ + void rotateRight(); + +protected: + virtual void partActivateEvent(KParts::PartActivateEvent* event); + virtual void guiActivateEvent( KParts::GUIActivateEvent* event); + +private slots: + + void dirListerClear(); + + void dirListerNewItems( const KFileItemList& ); + + void dirListerDeleteItem(KFileItem*); + + void slotSelectNext(); + void slotSelectPrevious(); + + void prefetchDone(); + + void slotLoading(); + void slotLoaded(const KURL& url); + + void openContextMenu(const QPoint&); + + void saveAs(); + + void showJobError(KIO::Job* job); + +private: + + void updateNextPrevious(); + KURL nextURL() const; + KURL previousURL() const; + void saveOriginalAs(); + + /** + * The component's widget + */ + ImageView* mImageView; + + /** + * Holds the image + */ + Document* mDocument; + + /** + * This inherits from KParts::BrowserExtention and supplies + * some extra functionality to Konqueror. + */ + GVImagePartBrowserExtension* mBrowserExtension; + + // for the next/previous actions + KDirLister* mDirLister; + + KAction* mNextImage; + KAction* mPreviousImage; + // alphabetically sorted filenames of images in the picture's directory + QStringList mImagesInDirectory; + + ImageLoader* mPrefetch; + enum LastDirection { DirectionUnknown, DirectionNext, DirectionPrevious }; + LastDirection mLastDirection; // used for prefetching +}; + + +/** + * This simple helper class uploads data to a remote URL asynchronously + */ +class DataUploader : public QObject { + Q_OBJECT +public: + DataUploader(QWidget* dialogParent, const QByteArray& data, const KURL& destURL); + +private slots: + void slotJobFinished(KIO::Job*); + +private: + KTempFile mTempFile; + QWidget* mDialogParent; +}; + +} // namespace +#endif diff --git a/src/gvimagepart/gvimagepart.rc b/src/gvimagepart/gvimagepart.rc new file mode 100644 index 0000000..af4e9e4 --- /dev/null +++ b/src/gvimagepart/gvimagepart.rc @@ -0,0 +1,40 @@ +<!DOCTYPE kpartgui> +<kpartgui name="GVImagePart" version="6"> +<MenuBar> + <Menu name="file"><Text>&File</Text> + <Action name="saveAs"/> + </Menu> + <Menu name="edit"> + <Action name="rotate_left"/> + <Action name="rotate_right"/> + </Menu> + <Menu name="view"><Text>&View</Text> + <Separator/> + <Menu name="colors"> + <text>&Colors</text> + <Action name="increase_gamma"/> + <Action name="decrease_gamma"/> + <Action name="increase_brightness"/> + <Action name="decrease_brightness"/> + <Action name="increase_contrast"/> + <Action name="decrease_contrast"/> + </Menu> + <Action name="view_zoom_to_fit"/> + <Action name="view_zoom_to_width"/> + <Action name="view_zoom_to_height"/> + <Action name="view_zoom_in"/> + <Action name="view_zoom_out"/> + <Action name="view_actual_size"/> + <Action name="view_zoom_lock"/> + </Menu> +</MenuBar> +<ToolBar name="mainToolBar"><text>Main Toolbar</text> + <Action name="previous"/> + <Action name="next"/> + <Action name="view_zoom_in"/> + <Action name="view_zoom_to"/> + <Action name="view_zoom_out"/> + <Action name="rotate_left"/> + <Action name="rotate_right"/> +</ToolBar> +</kpartgui> diff --git a/src/gvimagepart/gvimagepartpopup.rc b/src/gvimagepart/gvimagepartpopup.rc new file mode 100644 index 0000000..a1b7a6d --- /dev/null +++ b/src/gvimagepart/gvimagepartpopup.rc @@ -0,0 +1,7 @@ +<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd"> +<kpartgui name="gvimagepartpopup" version="1"> + <Menu name="popupmenu"> + <Separator /> + <Action name="saveAs" /> + </Menu> +</kpartgui> |