summaryrefslogtreecommitdiffstats
path: root/kmag/kmag.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kmag/kmag.cpp')
-rw-r--r--kmag/kmag.cpp958
1 files changed, 958 insertions, 0 deletions
diff --git a/kmag/kmag.cpp b/kmag/kmag.cpp
new file mode 100644
index 0000000..f385c13
--- /dev/null
+++ b/kmag/kmag.cpp
@@ -0,0 +1,958 @@
+/***************************************************************************
+ kmag.cpp - description
+ -------------------
+ begin : Mon Feb 12 23:45:41 EST 2001
+ copyright : (C) 2001-2003 by Sarang Lakare
+ email : sarang#users.sourceforge.net
+ copyright : (C) 2003-2004 by Olaf Schmidt
+ email : ojschmidt@kde.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. *
+ * *
+ ***************************************************************************/
+
+// include files for QT
+#include <qdir.h>
+#include <qprinter.h>
+#include <qpainter.h>
+#include <qlayout.h>
+#include <qclipboard.h>
+#include <qdragobject.h>
+#include <qwhatsthis.h>
+#include <qtooltip.h>
+#include <qpopupmenu.h>
+
+#include <kdeversion.h>
+
+// include files for KDE
+#if KDE_VERSION > 300
+#include <kapplication.h>
+#else
+#include <kapp.h>
+#endif // KDE 3.x
+
+#include <kkeydialog.h>
+#include <kinputdialog.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <kmenubar.h>
+#include <klocale.h>
+#include <kconfig.h>
+#include <kdebug.h>
+#include <kstdaction.h>
+#include <khelpmenu.h>
+#include <kimageio.h>
+#include <kio/job.h>
+#include <kio/netaccess.h>
+#include <ktempfile.h>
+#include <kpopupmenu.h>
+#include <kedittoolbar.h>
+#include <kwin.h>
+
+#if KDE_VERSION < 220
+#include <qprinter.h>
+#else
+#include <kprinter.h>
+#endif
+
+// application specific includes
+#include "kmag.moc"
+#include "kmagzoomview.h"
+#include "kmagselrect.h"
+
+
+#ifdef KDE_IS_VERSION
+#if KDE_IS_VERSION(3,2,90)
+ #define havesetCheckedState
+#endif
+#endif
+
+KmagApp::KmagApp(QWidget* , const char* name)
+ : KMainWindow(0, name, WStyle_MinMax | WType_TopLevel | WStyle_StaysOnTop | WDestructiveClose | WStyle_ContextHelp),
+ m_defaultMouseCursorType(2)
+{
+ config=kapp->config();
+
+ zoomArrayString << "5:1" << "2:1" << "1:1" << "1:1.5" << "1:2" << "1:3" << "1:4" << "1:5"
+ << "1:6" << "1:7" << "1:8" << "1:12" << "1:16" << "1:20";
+
+ // Is there a better way to initialize a vector array?
+ zoomArray.push_back(0.2); zoomArray.push_back(0.5); zoomArray.push_back(1.0);
+ zoomArray.push_back(1.5); zoomArray.push_back(2.0); zoomArray.push_back(3.0);
+ zoomArray.push_back(4.0); zoomArray.push_back(5.0); zoomArray.push_back(6.0); zoomArray.push_back(7.0);
+ zoomArray.push_back(8.0); zoomArray.push_back(12.0); zoomArray.push_back(16.0); zoomArray.push_back(20.0);
+
+ fpsArrayString << i18n("&Very Low") << i18n("&Low") << i18n("&Medium") << i18n("&High") << i18n("V&ery High");
+
+ fpsArray.push_back(2); // very low
+ fpsArray.push_back(6); // low
+ fpsArray.push_back(10); // medium
+ fpsArray.push_back(15); // high
+ fpsArray.push_back(25); // very high
+
+ rotationArrayString << i18n("&No Rotation (0 Degrees)") << i18n("&Left (90 Degrees)") << i18n("&Upside Down (180 Degrees)") << i18n("&Right (270 Degrees)");
+
+ rotationArray.push_back(0); // no rotation
+ rotationArray.push_back(90); // left
+ rotationArray.push_back(180); // upside down
+ rotationArray.push_back(270); // right
+
+ // call inits to invoke all other construction parts
+ initView();
+ initActions();
+ initConnections();
+
+ // Register all KIO image formats - to be used when saving image.
+ KImageIO::registerFormats();
+
+ // read options from config file
+ readOptions();
+}
+
+/**
+ * Default destructor.
+ */
+KmagApp::~KmagApp()
+{
+ m_zoomView->showSelRect(false);
+}
+
+void KmagApp::initActions()
+{
+ fileNewWindow = new KAction(i18n("New &Window"), "window_new", KStdAccel::openNew(), this,
+ SLOT(slotFileNewWindow()), actionCollection(),"new_window");
+ fileNewWindow->setToolTip(i18n("Open a new KMagnifier window"));
+
+ refreshSwitch = new KAction(i18n("&Stop"), "stop", KStdAccel::reload(), this,
+ SLOT(slotToggleRefresh()), actionCollection(), "start_stop_refresh");
+ refreshSwitch->setToolTip(i18n("Click to stop window refresh"));
+ refreshSwitch->setWhatsThis(i18n("Clicking on this icon will <b>start</b> / <b>stop</b>\
+ updating of the display. Stopping the update will zero the processing power\
+ required (CPU usage)"));
+
+ m_pSnapshot = new KAction(i18n("&Save Snapshot As..."), "ksnapshot", KStdAccel::save(), this,
+ SLOT(saveZoomPixmap()), actionCollection(),"snapshot");
+ m_pSnapshot->setWhatsThis(i18n("Saves the zoomed view to an image file."));
+ m_pSnapshot->setToolTip(i18n("Save image to a file"));
+
+ m_pPrint = KStdAction::print(this, SLOT(slotFilePrint()), actionCollection(), "print");
+ m_pPrint->setWhatsThis(i18n("Click on this button to print the current zoomed view."));
+
+ m_pQuit = KStdAction::quit(this, SLOT(slotFileQuit()), actionCollection(), "quit");
+ m_pQuit->setStatusText(i18n("Quits the application"));
+ m_pQuit->setWhatsThis (i18n("Quits the application"));
+
+ m_pCopy = KStdAction::copy(this, SLOT(copyToClipBoard()), actionCollection(), "copy");
+ m_pCopy->setWhatsThis(i18n("Click on this button to copy the current zoomed view to the clipboard which you can paste in other applications."));
+ m_pCopy->setToolTip(i18n("Copy zoomed image to clipboard"));
+
+ m_pShowMenu = new KToggleAction(i18n("Show &Menu"), "showmenu", CTRL+Key_M, this,
+ SLOT(slotShowMenu()), actionCollection(),"show_menu");
+ #ifdef havesetCheckedState
+ m_pShowMenu->setCheckedState(i18n("Hide &Menu"));
+ #endif
+ m_pShowMainToolBar = new KToggleAction(i18n("Show Main &Toolbar"), 0, 0, this,
+ SLOT(slotShowMainToolBar()), actionCollection(),"show_mainToolBar");
+ #ifdef havesetCheckedState
+ m_pShowMainToolBar->setCheckedState(i18n("Hide Main &Toolbar"));
+ #endif
+ m_pShowViewToolBar = new KToggleAction(i18n("Show &View Toolbar"), 0, 0, this,
+ SLOT(slotShowViewToolBar()), actionCollection(),"show_viewToolBar");
+ #ifdef havesetCheckedState
+ m_pShowViewToolBar->setCheckedState(i18n("Hide &View Toolbar"));
+ #endif
+ m_pShowSettingsToolBar = new KToggleAction(i18n("Show &Settings Toolbar"), 0, 0, this,
+ SLOT(slotShowSettingsToolBar()), actionCollection(),"show_settingsToolBar");
+ #ifdef havesetCheckedState
+ m_pShowSettingsToolBar->setCheckedState(i18n("Hide &Settings Toolbar"));
+ #endif
+
+ m_modeFollowMouse = new KRadioAction(i18n("&Follow Mouse Mode"), "followmouse", Key_F1, this,
+ SLOT(slotModeFollowMouse()), actionCollection(), "mode_followmouse");
+ m_modeFollowMouse->setToolTip(i18n("Magnify mouse area into window"));
+ m_modeFollowMouse->setWhatsThis(i18n("In this mode the area around the mouse cursor is shown in a normal window."));
+
+ m_modeSelWin = new KRadioAction(i18n("S&election Window Mode"), "window", Key_F2, this,
+ SLOT(slotModeSelWin()), actionCollection(), "mode_selectionwindow");
+ m_modeSelWin->setToolTip(i18n("Magnify selected area into window"));
+ m_modeSelWin->setWhatsThis(i18n("In this mode a selection window is opened. The selected area is shown in a normal window."));
+
+ m_modeEdgeTop = new KRadioAction(i18n("&Top Screen Edge Mode"), 0, 0, this,
+ SLOT(slotModeEdgeTop()), actionCollection(),"mode_edgetop");
+ m_modeEdgeTop->setToolTip(i18n("Magnify mouse area to top screen edge"));
+ m_modeEdgeTop->setWhatsThis(i18n("In this mode the area around the mouse is magnified to the top screen edge."));
+
+ m_modeEdgeLeft = new KRadioAction(i18n("&Left Screen Edge Mode"), 0, 0, this,
+ SLOT(slotModeEdgeLeft()), actionCollection(),"mode_edgeleft");
+ m_modeEdgeLeft->setToolTip(i18n("Magnify mouse area to left screen edge"));
+ m_modeEdgeLeft->setWhatsThis(i18n("In this mode the area around the mouse is magnified to the left screen edge."));
+
+ m_modeEdgeRight = new KRadioAction(i18n("&Right Screen Edge Mode"), 0, 0, this,
+ SLOT(slotModeEdgeRight()), actionCollection(),"mode_edgeright");
+ m_modeEdgeRight->setToolTip(i18n("Magnify mouse area to right screen edge"));
+ m_modeEdgeRight->setWhatsThis(i18n("In this mode the area around the mouse is magnified to the right screen edge."));
+
+ m_modeEdgeBottom = new KRadioAction(i18n("&Bottom Screen Edge Mode"), 0, 0, this,
+ SLOT(slotModeEdgeBottom()), actionCollection(),"mode_edgebottom");
+ m_modeEdgeBottom->setToolTip(i18n("Magnify mouse area to bottom screen edge"));
+ m_modeEdgeBottom->setWhatsThis(i18n("In this mode the area around the mouse is magnified to the bottom screen edge."));
+
+ m_hideCursor = new KToggleAction(i18n("Hide Mouse &Cursor"), "hidemouse", Key_F4, this,
+ SLOT(slotToggleHideCursor()), actionCollection(), "hidecursor");
+ #ifdef havesetCheckedState
+ m_hideCursor->setCheckedState(i18n("Show Mouse &Cursor"));
+ #endif
+ m_hideCursor->setToolTip(i18n("Hide the mouse cursor"));
+
+ m_pZoomIn = KStdAction::zoomIn(this, SLOT(zoomIn()), actionCollection(), "zoom_in");
+ m_pZoomIn->setWhatsThis(i18n("Click on this button to <b>zoom-in</b> on the selected region."));
+
+ m_pZoomBox = new KSelectAction(i18n("&Zoom"),0,actionCollection(),"zoom");
+ m_pZoomBox->setItems(zoomArrayString);
+ m_pZoomBox->setWhatsThis(i18n("Select the zoom factor."));
+ m_pZoomBox->setToolTip(i18n("Zoom factor"));
+
+ m_pZoomOut = KStdAction::zoomOut(this, SLOT(zoomOut()), actionCollection(), "zoom_out");
+ m_pZoomOut->setWhatsThis(i18n("Click on this button to <b>zoom-out</b> on the selected region."));
+
+ m_pInvert = new KToggleAction(i18n("&Invert Colors"), 0, Key_F6, this,
+ SLOT(slotToggleInvert()), actionCollection(), "invert");
+
+ m_pRotationBox = new KSelectAction(i18n("&Rotation"),0,actionCollection(),"rotation");
+ m_pRotationBox->setItems(rotationArrayString);
+ m_pRotationBox->setWhatsThis(i18n("Select the rotation degree."));
+ m_pRotationBox->setToolTip(i18n("Rotation degree"));
+
+ // KHelpMenu *newHelpMenu = new KHelpMenu(this, KGlobal::instance()->aboutData());
+
+ m_keyConf = KStdAction::keyBindings( this, SLOT( slotConfKeys() ), actionCollection(), "key_conf");
+ m_toolConf = KStdAction::configureToolbars( this, SLOT( slotEditToolbars() ),
+ actionCollection(), "toolbar_conf");
+
+ m_pFPSBox = new KSelectAction(i18n("Re&fresh"),0,actionCollection(),"fps_selector");
+ m_pFPSBox->setItems(fpsArrayString);
+ m_pFPSBox->setWhatsThis(i18n("Select the refresh rate. The higher the rate, the more computing power (CPU) will be needed."));
+ m_pFPSBox->setToolTip(i18n("Refresh rate"));
+
+ createGUI();
+}
+
+void KmagApp::initView()
+{
+ m_zoomView = new KMagZoomView( this, "ZoomView" );
+ m_zoomView->setSizePolicy( QSizePolicy( (QSizePolicy::SizeType)7, (QSizePolicy::SizeType)7, m_zoomView->sizePolicy().hasHeightForWidth() ) );
+ m_zoomView->setFrameShape( QFrame::StyledPanel );
+ m_zoomView->setFrameShadow( QFrame::Raised );
+
+ setCentralWidget(m_zoomView);
+}
+
+/**
+ * Initialize all connections.
+ */
+void KmagApp::initConnections()
+{
+ // change in zoom value -> update the view
+ connect(this, SIGNAL(updateZoomValue(float)), m_zoomView, SLOT(setZoom(float)));
+ connect(this, SIGNAL(updateRotationValue(int)), m_zoomView, SLOT(setRotation(int)));
+ connect(this, SIGNAL(updateFPSValue(float)), m_zoomView, SLOT(setRefreshRate(float)));
+
+ // change in zoom index -> update the selector
+ connect(this, SIGNAL(updateZoomIndex(int)), m_pZoomBox, SLOT(setCurrentItem(int)));
+ connect(this, SIGNAL(updateRotationIndex(int)), m_pRotationBox, SLOT(setCurrentItem(int)));
+ connect(this, SIGNAL(updateFPSIndex(int)), m_pFPSBox, SLOT(setCurrentItem(int)));
+
+ // selector selects a zoom index -> set the zoom index
+ connect(m_pZoomBox, SIGNAL(activated(int)), this, SLOT(setZoomIndex(int)));
+ connect(m_pRotationBox, SIGNAL(activated(int)), this, SLOT(setRotationIndex(int)));
+ connect(m_pFPSBox, SIGNAL(activated(int)), this, SLOT(setFPSIndex(int)));
+
+ connect(m_zoomView, SIGNAL(contextMenu(QPoint)), this, SLOT(contextMenu(QPoint)));
+}
+
+/**
+ * Save options to config file.
+ */
+void KmagApp::saveOptions()
+{
+ config->setGroup("General Options");
+ config->writeEntry("Geometry", size());
+ config->writeEntry("ZoomIndex", m_zoomIndex);
+ config->writeEntry("Invertation", m_pInvert->isChecked());
+ config->writeEntry("RotationIndex", m_rotationIndex);
+ config->writeEntry("FPSIndex", m_fpsIndex);
+ config->writeEntry("SelRect", m_zoomView->getSelRectPos());
+ config->writeEntry("ShowMouse", m_zoomView->getShowMouseType());
+
+ if (m_modeFollowMouse->isChecked())
+ config->writeEntry("Mode", "followmouse");
+ else if (m_modeSelWin->isChecked())
+ config->writeEntry("Mode", "selectionwindow");
+ else if (m_modeEdgeTop->isChecked())
+ config->writeEntry("Mode", "edgetop");
+ else if (m_modeEdgeLeft->isChecked())
+ config->writeEntry("Mode", "edgeleft");
+ else if (m_modeEdgeRight->isChecked())
+ config->writeEntry("Mode", "edgeright");
+ else if (m_modeEdgeBottom->isChecked())
+ config->writeEntry("Mode", "edgebottom");
+
+ config->writeEntry ("EdgeSize", edgesize);
+
+ config->writeEntry("ShowMenu", m_pShowMenu->isChecked());
+ config->writeEntry("ShowMainToolBar", m_pShowMainToolBar->isChecked());
+ config->writeEntry("ShowViewToolBar", m_pShowViewToolBar->isChecked());
+ config->writeEntry("ShowSettingsToolBar", m_pShowSettingsToolBar->isChecked());
+
+ toolBar("mainToolBar")->saveSettings(config,"Main ToolBar");
+ toolBar("viewToolBar")->saveSettings(config,"View ToolBar");
+ toolBar("settingsToolBar")->saveSettings(config,"Settings ToolBar");
+}
+
+
+/**
+ * Read settings from config file.
+ */
+void KmagApp::readOptions()
+{
+ QColor blue (0,0,128);
+ QColor yellow (255,255,0);
+ QColor white (255,255,255);
+
+ config->setGroup ("WM");
+ setTitleColors (
+ config->readColorEntry("inactiveBackground", &blue),
+ config->readColorEntry("inactiveForeground", &white),
+ config->readColorEntry("inactiveTitleBtnBg", &yellow));
+
+ config->setGroup("General Options");
+
+ QSize defSize(460,390);
+ QSize size=config->readSizeEntry("Geometry", &defSize);
+ if(!size.isEmpty())
+ {
+ resize(size);
+ }
+
+ // set zoom - defaults to 2x
+ unsigned int zoomIndex = config->readUnsignedNumEntry("ZoomIndex", 4);
+ setZoomIndex(zoomIndex);
+ emit updateZoomIndex(m_zoomIndex);
+
+ m_pInvert->setChecked (config->readBoolEntry("Invertation", false));
+ slotToggleInvert();
+
+ unsigned int rotationIndex = config->readUnsignedNumEntry("RotationIndex", 0);
+ setRotationIndex(rotationIndex);
+ emit updateRotationIndex(m_rotationIndex);
+
+ unsigned int fpsIndex = config->readUnsignedNumEntry("FPSIndex", 2);
+ setFPSIndex(fpsIndex);
+ emit updateFPSIndex(m_fpsIndex);
+
+ QRect defaultRect(0,0,211,164);
+ m_zoomView->setSelRectPos(config->readRectEntry("SelRect", &defaultRect));
+
+ m_mouseCursorType = config->readUnsignedNumEntry("ShowMouse", m_defaultMouseCursorType);
+ m_zoomView->showMouse(m_mouseCursorType);
+ if(m_mouseCursorType)
+ m_hideCursor->setChecked(false);
+ else
+ m_hideCursor->setChecked(true);
+
+ if(config->hasGroup("Settings ToolBar"))
+ toolBar("settingsToolBar")->applySettings(config,"Settings ToolBar");
+
+ if(config->hasGroup("Main ToolBar"))
+ toolBar("mainToolBar")->applySettings(config,"Main ToolBar");
+
+ if(config->hasGroup("View ToolBar"))
+ toolBar("viewToolBar")->applySettings(config,"View ToolBar");
+
+ m_pShowMenu->setChecked(config->readBoolEntry("ShowMenu", true));
+ slotShowMenu();
+
+ m_pShowMainToolBar->setChecked(config->readBoolEntry("ShowMainToolBar", false));
+ slotShowMainToolBar();
+
+ m_pShowViewToolBar->setChecked(config->readBoolEntry("ShowViewToolBar", true));
+ slotShowViewToolBar();
+
+ m_pShowSettingsToolBar->setChecked(config->readBoolEntry("ShowSettingsToolBar", true));
+ slotShowSettingsToolBar();
+
+ config->setGroup("General Options");
+
+ edgesize = config->readNumEntry("EdgeSize", 0);
+ QString mode = config->readEntry("Mode", "followmouse");
+ if (mode == "selectionwindow")
+ slotModeSelWin();
+ else if (mode == "edgetop")
+ setEdgeMode (m_modeEdgeTop);
+ else if (mode == "edgeleft")
+ setEdgeMode (m_modeEdgeLeft);
+ else if (mode == "edgeright")
+ setEdgeMode (m_modeEdgeRight);
+ else if (mode == "edgebottom")
+ setEdgeMode (m_modeEdgeBottom);
+ else
+ slotModeFollowMouse();
+}
+
+bool KmagApp::queryClose()
+{
+ return (true);
+}
+
+bool KmagApp::queryExit()
+{
+ saveOptions();
+ return true;
+}
+
+
+/////////////////////////////////////////////////////////////////////
+// SLOT IMPLEMENTATION
+/////////////////////////////////////////////////////////////////////
+
+/**
+ * Shows/hides the mouse cursor
+ */
+void KmagApp::showMouseCursor(bool show)
+{
+ if(show) {
+ if(m_mouseCursorType == 0)
+ m_mouseCursorType = m_defaultMouseCursorType;
+ m_zoomView->showMouse(m_mouseCursorType);
+ } else {
+ m_zoomView->showMouse(0);
+ }
+}
+
+/**
+ * Zoom in.
+ */
+void KmagApp::zoomIn()
+{
+ // set the new index .. checking will done inside setZoom
+ setZoomIndex(m_zoomIndex+1);
+ // signal change in zoom index
+ emit updateZoomIndex((int)m_zoomIndex);
+}
+
+/**
+ * Zoom out.
+ */
+void KmagApp::zoomOut()
+{
+ // set the new index .. checking will done inside setZoom
+ setZoomIndex(m_zoomIndex-1);
+ // signal change in zoom index
+ emit updateZoomIndex((int)m_zoomIndex);
+}
+/**
+ * Sets the zoom index to index
+ */
+void KmagApp::setZoomIndex(int index)
+{
+ if(index < 0 || index >= (int)zoomArray.size()) {
+ // the index is invalid
+ kdWarning() << "Invalid index!" << endl;
+ return;
+ } else if((int)m_zoomIndex == index) {
+ // do nothing!
+ return;
+ } else {
+ m_zoomIndex = index;
+ }
+
+ if(m_zoomIndex == 0) {
+ // meaning that no more zooming-out is possible
+ // -> disable zoom-out icon
+ m_pZoomOut->setEnabled(false);
+ } else { // enable the icon
+ m_pZoomOut->setEnabled(true);
+ }
+
+ if(m_zoomIndex == zoomArray.size()-1) {
+ // meaning that no more zooming-in is possible
+ // -> disable zoom-in icon
+ m_pZoomIn->setEnabled(false);
+ } else { // enable the icon
+ m_pZoomIn->setEnabled(true);
+ }
+
+ // signal change in zoom value
+ emit updateZoomValue(zoomArray[m_zoomIndex]);
+}
+
+/**
+ * Shows/hides the mouse cursor
+ */
+void KmagApp::slotToggleInvert ()
+{
+ m_zoomView->setInvertation (m_pInvert->isChecked());
+}
+
+/**
+ * Sets the rotation index to index
+ */
+void KmagApp::setRotationIndex(int index)
+{
+ if(index < 0 || index >= (int)rotationArray.size()) {
+ // the index is invalid
+ kdWarning() << "Invalid index!" << endl;
+ return;
+ } else if((int)m_rotationIndex == index) {
+ // do nothing!
+ return;
+ } else {
+ m_rotationIndex = index;
+ }
+
+ // signal change in zoom value
+ emit updateRotationValue(rotationArray[m_rotationIndex]);
+}
+
+/**
+ * Sets the fps index to index
+ */
+void KmagApp::setFPSIndex(int index)
+{
+ if(index < 0 || index >= (int)fpsArray.size()) {
+ // the index is invalid
+ kdWarning() << "Invalid index!" << endl;
+ return;
+ } else if((int)m_fpsIndex == index) {
+ // do nothing!
+ return;
+ } else {
+ m_fpsIndex = index;
+ }
+
+ // signal change in fps value
+ emit updateFPSValue(fpsArray[m_fpsIndex]);
+}
+
+
+/**
+ * Save the zoomed image
+ */
+void KmagApp::saveZoomPixmap()
+{
+ bool toggled(false);
+
+ // stop refresh temporarily
+ if (m_zoomView->getRefreshStatus()) {
+ slotToggleRefresh();
+ toggled = true;
+ }
+
+ KURL url = KFileDialog::getSaveURL(QString::null,
+ KImageIO::pattern(KImageIO::Writing),
+ 0,i18n("Save Snapshot As"));
+
+ if(!url.filename().isEmpty()) {
+ if(!url.isLocalFile()) {
+ // create a temp file.. save image to it.. copy over the n/w and then delete the temp file.
+ KTempFile tempFile;
+ if(!m_zoomView->getPixmap().save(tempFile.name(), KImageIO::type(url.fileName()).latin1())) {
+ KMessageBox::error(0, i18n("Unable to save temporary file (before uploading to the network file you specified)."),
+ i18n("Error Writing File"));
+ } else {
+ if(!KIO::NetAccess::upload(tempFile.name(), url, this)) {
+ KMessageBox::error(0, i18n("Unable to upload file over the network."),
+ i18n("Error Writing File"));
+ } else {
+ KMessageBox::information(0, i18n("Current zoomed image saved to\n%1").arg(url.prettyURL()),
+ i18n("Information"), "save_confirm");
+ }
+ }
+ // remove the temporary file
+ tempFile.unlink();
+
+ } else {
+ if(!m_zoomView->getPixmap().save(url.path(), KImageIO::type(url.fileName()).latin1())) {
+ KMessageBox::error(0, i18n("Unable to save file. Please check if you have permission to write to the directory."),
+ i18n("Error Writing File"));
+ } else {
+ KMessageBox::information(0, i18n("Current zoomed image saved to\n%1").arg(url.prettyURL()),
+ i18n("Information"), "save_confirm");
+ }
+ }
+ }
+ if(toggled) {
+ slotToggleRefresh();
+ }
+}
+
+
+void KmagApp::slotToggleRefresh()
+{
+ m_zoomView->toggleRefresh();
+ if(m_zoomView->getRefreshStatus()) {
+ refreshSwitch->setIcon("stop.png");
+ refreshSwitch->setText(i18n("Stop"));
+ refreshSwitch->setToolTip(i18n("Click to stop window update"));
+ } else {
+ refreshSwitch->setIcon("reload.png");
+ refreshSwitch->setText(i18n("Start"));
+ refreshSwitch->setToolTip(i18n("Click to start window update"));
+ }
+}
+
+
+void KmagApp::slotModeSelWin()
+{
+ unsetEdgeMode(m_modeSelWin);
+
+ m_zoomView->fitToWindow();
+ m_zoomView->setFitToWindow (false);
+ m_zoomView->followMouse(false);
+ m_zoomView->showSelRect(true);
+}
+
+
+void KmagApp::slotModeFollowMouse()
+{
+ unsetEdgeMode(m_modeFollowMouse);
+
+ m_zoomView->setFitToWindow (true);
+ m_zoomView->followMouse(true);
+ m_zoomView->showSelRect(false);
+}
+
+
+void KmagApp::slotModeEdgeTop()
+{
+ // ask for edgesize
+ int newedgesize; bool ok;
+ newedgesize = KInputDialog::getInteger (i18n ("Magnify to Screen Edge - Select Size"),
+ i18n ("Size:"), edgesize > 0 ? edgesize : 300, 200,
+ QApplication::desktop()->screenGeometry( this ).height()/2,
+ 25, 10, &ok, 0, "getedgesize");
+
+ if (ok) {
+ edgesize = newedgesize;
+ setEdgeMode(m_modeEdgeTop);
+ }
+}
+
+
+void KmagApp::slotModeEdgeLeft()
+{
+ // ask for edgesize
+ int newedgesize; bool ok;
+ newedgesize = KInputDialog::getInteger (i18n ("Magnify to Left Screen Edge - Select Size"),
+ i18n ("Size:"), edgesize > 0 ? edgesize : 300, 200,
+ QApplication::desktop()->screenGeometry( this ).width()/2,
+ 25, 10, &ok, 0, "getedgesize");
+
+ if (ok) {
+ edgesize = newedgesize;
+ setEdgeMode(m_modeEdgeLeft);
+ }
+}
+
+
+void KmagApp::slotModeEdgeRight()
+{
+ // ask for edgesize
+ int newedgesize; bool ok;
+ newedgesize = KInputDialog::getInteger (i18n ("Magnify to Right Screen Edge - Select Size"),
+ i18n ("Size:"), edgesize > 0 ? edgesize : 300, 200,
+ QApplication::desktop()->screenGeometry( this ).width()/2,
+ 25, 10, &ok, 0, "getedgesize");
+
+ if (ok) {
+ edgesize = newedgesize;
+ setEdgeMode(m_modeEdgeRight);
+ }
+}
+
+
+void KmagApp::slotModeEdgeBottom()
+{
+ // ask for edgesize
+ int newedgesize; bool ok;
+ newedgesize = KInputDialog::getInteger (i18n ("Magnify to Bottom Screen Edge - Select Size"),
+ i18n ("Size:"), edgesize > 0 ? edgesize : 300, 200,
+ QApplication::desktop()->screenGeometry( this ).height()/2,
+ 25, 10, &ok, 0, "getedgesize");
+
+ if (ok) {
+ edgesize = newedgesize;
+ setEdgeMode(m_modeEdgeBottom);
+ }
+}
+
+
+void KmagApp::setEdgeMode (KToggleAction *mode)
+{
+ if (m_modeEdgeLeft || mode == m_modeEdgeRight) {
+ if (edgesize < 200 || edgesize > QApplication::desktop()->screenGeometry( this ).width()/2)
+ edgesize = QApplication::desktop()->screenGeometry( this ).width()/4;
+ } else {
+ if (edgesize < 200 || edgesize > QApplication::desktop()->screenGeometry( this ).height()/2)
+ edgesize = QApplication::desktop()->screenGeometry( this ).height()/4;
+ }
+
+ m_modeFollowMouse->setChecked(false);
+ m_modeSelWin->setChecked(false);
+ m_modeEdgeTop->setChecked(false);
+ m_modeEdgeLeft->setChecked(false);
+ m_modeEdgeRight->setChecked(false);
+ m_modeEdgeBottom->setChecked(false);
+ mode->setChecked (true);
+
+ m_zoomView->setFitToWindow (true);
+ m_zoomView->followMouse(true);
+ m_zoomView->showSelRect(false);
+
+ m_zoomView->reparent (0, QPoint(), false);
+ KWin::setType(m_zoomView->winId(), NET::Dock);
+ KWin::setState(m_zoomView->winId(), NET::Sticky | NET::KeepBelow | NET::SkipTaskbar | NET::SkipPager);
+ KWin::setOnAllDesktops(m_zoomView->winId(), true);
+
+ m_pShowMenu->setEnabled (false);
+ m_pShowMainToolBar->setEnabled (false);
+ m_pShowViewToolBar->setEnabled (false);
+ m_pShowSettingsToolBar->setEnabled (false);
+
+ hide();
+
+ if (mode == m_modeEdgeTop) {
+ QRect r = QApplication::desktop()->screenGeometry( this );
+ r.setBottom( r.top() + edgesize );
+ m_zoomView->setGeometry ( r );
+ KWin::setExtendedStrut (m_zoomView->winId(), 0, 0, 0, 0, 0, 0,
+ edgesize, r.left(), r.right(), 0, 0, 0);
+ } else if (mode == m_modeEdgeLeft) {
+ QRect r = QApplication::desktop()->screenGeometry( this );
+ r.setRight( r.left() + edgesize );
+ m_zoomView->setGeometry ( r );
+ KWin::setExtendedStrut (m_zoomView->winId(),
+ edgesize, r.top(), r.bottom(),
+ 0, 0, 0, 0, 0, 0, 0, 0, 0);
+ } else if (mode == m_modeEdgeRight) {
+ QRect r = QApplication::desktop()->screenGeometry( this );
+ r.setLeft( r.right() - edgesize );
+ m_zoomView->setGeometry ( r );
+ KWin::setExtendedStrut (m_zoomView->winId(), 0, 0, 0,
+ edgesize, r.top(), r.bottom(),
+ 0, 0, 0, 0, 0, 0);
+ } else {
+ QRect r = QApplication::desktop()->screenGeometry( this );
+ r.setTop( r.bottom() - edgesize );
+ m_zoomView->setGeometry ( r );
+ KWin::setExtendedStrut (m_zoomView->winId(), 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ edgesize, r.left(), r.right());
+ }
+ m_zoomView->show();
+}
+
+
+void KmagApp::unsetEdgeMode (KToggleAction *mode)
+{
+ edgesize = 0;
+
+ m_modeFollowMouse->setChecked(false);
+ m_modeSelWin->setChecked(false);
+ m_modeEdgeTop->setChecked(false);
+ m_modeEdgeLeft->setChecked(false);
+ m_modeEdgeRight->setChecked(false);
+ m_modeEdgeBottom->setChecked(false);
+ mode->setChecked (true);
+
+ m_zoomView->reparent (this, QPoint(), true);
+ setCentralWidget(m_zoomView);
+ KWin::setExtendedStrut (winId(), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+ m_pShowMenu->setEnabled (true);
+ m_pShowMainToolBar->setEnabled (true);
+ m_pShowViewToolBar->setEnabled (true);
+ m_pShowSettingsToolBar->setEnabled (true);
+
+ show();
+}
+
+
+void KmagApp::slotToggleHideCursor()
+{
+ showMouseCursor(!m_hideCursor->isChecked());
+}
+
+
+void KmagApp::slotFileNewWindow()
+{
+ KmagApp *new_window= new KmagApp();
+ new_window->show();
+}
+
+
+void KmagApp::slotFilePrint()
+{
+#ifndef QT_NO_PRINTER
+
+ bool toggled(false);
+
+#if KDE_VERSION < 220
+ QPrinter printer;
+#else
+ KPrinter printer;
+#endif
+
+ // stop refresh temporarily
+ if (m_zoomView->getRefreshStatus()) {
+ slotToggleRefresh();
+ toggled = true;
+ }
+
+ const QPixmap pixmap(m_zoomView->getPixmap());
+
+#if KDE_VERSION >= 220
+ // use some AI to get the best orientation
+ if(pixmap.width() > pixmap.height()) {
+ printer.setOrientation(KPrinter::Landscape);
+ } else {
+ printer.setOrientation(KPrinter::Portrait);
+ }
+#endif
+
+ if (printer.setup(this)) {
+ QPainter paint;
+
+ if(!paint.begin(&printer))
+ return;
+ // draw the pixmap
+ paint.drawPixmap(0, 0, pixmap);
+ // end the painting
+ paint.end();
+ }
+
+ if(toggled) {
+ slotToggleRefresh();
+ }
+#endif // QT_NO_PRINTER
+}
+
+void KmagApp::slotFileQuit()
+{
+ saveOptions();
+ // close the first window, the list makes the next one the first again.
+ // This ensures that queryClose() is called on each window to ask for closing
+ KMainWindow* w;
+ if (memberList)
+ {
+ for(w=memberList->first(); w!=0; w=memberList->first())
+ {
+ // only close the window if the closeEvent is accepted. If the user presses Cancel on the saveModified() dialog,
+ // the window and the application stay open.
+ if(!w->close())
+ break;
+ memberList->removeRef(w);
+ }
+ }
+}
+
+void KmagApp::copyToClipBoard()
+{
+ QClipboard *cb=KApplication::clipboard();
+ cb->setPixmap(m_zoomView->getPixmap());
+}
+
+void KmagApp::slotShowMenu()
+{
+ ///////////////////////////////////////////////////////////////////
+ // turn Menu on or off
+ if(!m_pShowMenu->isChecked())
+ {
+ menuBar()->hide();
+ }
+ else
+ {
+ menuBar()->show();
+ }
+
+
+}
+
+void KmagApp::slotShowMainToolBar()
+{
+ ///////////////////////////////////////////////////////////////////
+ // turn mainToolbar on or off
+ if(!m_pShowMainToolBar->isChecked())
+ {
+ toolBar("mainToolBar")->hide();
+ }
+ else
+ {
+ toolBar("mainToolBar")->show();
+ }
+}
+
+void KmagApp::slotShowViewToolBar()
+{
+ ///////////////////////////////////////////////////////////////////
+ // turn viewToolbar on or off
+ if(!m_pShowViewToolBar->isChecked())
+ {
+ toolBar("viewToolBar")->hide();
+ }
+ else
+ {
+ toolBar("viewToolBar")->show();
+ }
+}
+
+void KmagApp::slotShowSettingsToolBar()
+{
+ ///////////////////////////////////////////////////////////////////
+ // turn viewToolbar on or off
+ if(!m_pShowSettingsToolBar->isChecked() || edgesize > 0)
+ {
+ toolBar("settingsToolBar")->hide();
+ }
+ else
+ {
+ toolBar("settingsToolBar")->show();
+ }
+}
+
+void KmagApp::slotConfKeys()
+{
+ KKeyDialog::configure( actionCollection() );
+}
+
+void KmagApp::slotEditToolbars()
+{
+ saveMainWindowSettings( KGlobal::config(), "MainWindow" );
+ KEditToolbar dlg( actionCollection() );
+ connect( &dlg, SIGNAL( newToolbarConfig() ), this, SLOT( slotNewToolbarConfig() ) );
+ if ( dlg.exec() )
+ createGUI();
+}
+
+
+void KmagApp::contextMenu (QPoint pos)
+{
+ // show popup
+ KXMLGUIFactory *factory = this->factory();
+ QPopupMenu *popup = (QPopupMenu *)factory->container("mainPopUp",this);
+ if (popup != 0)
+ popup->popup(pos, 0);
+}
+
+
+void KmagApp::slotNewToolbarConfig()
+{
+ applyMainWindowSettings( KGlobal::config(), "MainWindow" );
+ createGUI();
+}