summaryrefslogtreecommitdiffstats
path: root/kolourpaint/kpmainwindow.h
diff options
context:
space:
mode:
Diffstat (limited to 'kolourpaint/kpmainwindow.h')
-rw-r--r--kolourpaint/kpmainwindow.h739
1 files changed, 739 insertions, 0 deletions
diff --git a/kolourpaint/kpmainwindow.h b/kolourpaint/kpmainwindow.h
new file mode 100644
index 00000000..f5514848
--- /dev/null
+++ b/kolourpaint/kpmainwindow.h
@@ -0,0 +1,739 @@
+
+/*
+ Copyright (c) 2003,2004,2005 Clarence Dang <dang@kde.org>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+
+#ifndef KP_MAIN_WINDOW_H
+#define KP_MAIN_WINDOW_H
+
+
+#define DEBUG_KP_MAIN_WINDOW 0
+
+#include <qpoint.h>
+#include <qptrlist.h>
+#include <qsize.h>
+#include <qvaluevector.h>
+
+#include <kmainwindow.h>
+#include <kurl.h>
+
+#include <kpdefs.h>
+#include <kpdocumentsaveoptions.h>
+#include <kppixmapfx.h>
+
+
+class QPainter;
+class QPoint;
+class QPopupMenu;
+class QRect;
+class QSize;
+class QStringList;
+
+class KAction;
+class KFontAction;
+class KFontSizeAction;
+class KSelectAction;
+class KToggleAction;
+class KToolBar;
+class KPrinter;
+class KRecentFilesAction;
+class KScanDialog;
+class KToggleFullScreenAction;
+
+class kpColor;
+class kpColorToolBar;
+class kpCommand;
+class kpCommandHistory;
+class kpDocument;
+class kpDocumentMetaInfo;
+class kpDocumentSaveOptions;
+class kpViewManager;
+class kpViewScrollableContainer;
+class kpSelection;
+class kpSelectionTransparency;
+class kpSingleKeyTriggersAction;
+class kpSqueezedTextLabel;
+class kpTextStyle;
+class kpThumbnail;
+class kpThumbnailView;
+class kpTool;
+class kpToolText;
+class kpToolToolBar;
+class kpZoomedView;
+
+
+class kpMainWindow : public KMainWindow
+{
+Q_OBJECT
+
+public:
+ // Opens a new window with a blank document.
+ kpMainWindow ();
+
+ // Opens a new window with the document specified by <url>
+ // or creates a blank document if <url> could not be opened.
+ kpMainWindow (const KURL &url);
+
+ // Opens a new window with the document <newDoc>
+ // (<newDoc> can be 0 although this would result in a new
+ // window without a document at all).
+ kpMainWindow (kpDocument *newDoc);
+
+public:
+ double configColorSimilarity () const;
+ void configSetColorSimilarity (double val);
+
+private:
+ bool m_configFirstTime;
+ bool m_configShowGrid;
+ bool m_configShowPath;
+ double m_configColorSimilarity;
+
+ bool m_configThumbnailShown;
+ QRect m_configThumbnailGeometry;
+ bool m_configZoomedThumbnail;
+
+ void readGeneralSettings ();
+ void readThumbnailSettings ();
+ void init ();
+
+ // (only called for restoring a previous session e.g. starting KDE with
+ // a previously saved session; it's not called on normal KolourPaint
+ // startup)
+ virtual void readProperties (KConfig *cfg);
+ // (only called for saving the current session e.g. logging out of KDE
+ // with the KolourPaint window open; it's not called on normal KolourPaint
+ // exit)
+ virtual void saveProperties (KConfig *cfg);
+
+public:
+ ~kpMainWindow ();
+
+private:
+ bool m_isFullyConstructed;
+
+public:
+ kpDocument *document () const;
+ kpViewManager *viewManager () const;
+ kpColorToolBar *colorToolBar () const;
+ kpToolToolBar *toolToolBar () const;
+ kpCommandHistory *commandHistory () const;
+
+private:
+ kpViewScrollableContainer *m_scrollView;
+ kpZoomedView *m_mainView;
+ kpThumbnail *m_thumbnail;
+ kpThumbnailView *m_thumbnailView;
+ kpDocument *m_document;
+ kpViewManager *m_viewManager;
+ kpColorToolBar *m_colorToolBar;
+ kpToolToolBar *m_toolToolBar;
+ kpCommandHistory *m_commandHistory;
+
+private:
+ void setupActions ();
+ void enableDocumentActions (bool enable = true);
+
+public:
+ bool actionsSingleKeyTriggersEnabled () const;
+ void enableActionsSingleKeyTriggers (bool enable = true);
+
+private:
+ void setDocument (kpDocument *newDoc);
+
+ virtual bool queryClose ();
+
+ virtual void dragEnterEvent (QDragEnterEvent *e);
+ virtual void dropEvent (QDropEvent *e);
+
+private slots:
+ void slotScrollViewAboutToScroll ();
+ void slotScrollViewAfterScroll ();
+
+private:
+ virtual void moveEvent (QMoveEvent *e);
+
+private slots:
+ void slotUpdateCaption ();
+ void slotDocumentRestored ();
+
+
+ /*
+ * Tools
+ */
+
+private:
+ void setupToolActions ();
+ void createToolBox ();
+ void enableToolsDocumentActions (bool enable = true);
+
+private slots:
+ void updateToolOptionPrevNextActionsEnabled ();
+
+private:
+ kpTool *m_toolAirSpray, *m_toolBrush, *m_toolColorPicker,
+ *m_toolColorWasher, *m_toolCurve, *m_toolEllipse,
+ *m_toolEllipticalSelection, *m_toolEraser,
+ *m_toolFloodFill, *m_toolFreeFormSelection,
+ *m_toolLine, *m_toolPen, *m_toolPolygon,
+ *m_toolPolyline, *m_toolRectangle, *m_toolRectSelection,
+ *m_toolRoundedRectangle;
+ kpToolText *m_toolText;
+
+ QPtrList <kpTool> m_tools;
+ int m_lastToolNumber;
+
+ bool m_toolActionsEnabled;
+ kpSingleKeyTriggersAction *m_actionPrevToolOptionGroup1,
+ *m_actionNextToolOptionGroup1,
+ *m_actionPrevToolOptionGroup2,
+ *m_actionNextToolOptionGroup2;
+
+ int m_settingSelectionTransparency;
+
+ int m_docResizeWidth, m_docResizeHeight;
+ bool m_docResizeToBeCompleted;
+
+public:
+ kpTool *tool () const;
+ bool toolHasBegunShape () const;
+ bool toolIsASelectionTool (bool includingTextTool = true) const;
+ bool toolIsTextTool () const;
+
+ kpSelectionTransparency selectionTransparency () const;
+ // The drawing background color is set to <transparency>.transparentColor()
+ // if the <transparency> is in Transparent mode or if <forceColorChange>
+ // is true (not the default). [x]
+ //
+ // If <transparency> is in Opaque mode and <forceColorChange> is false,
+ // the background color is not changed because:
+ //
+ // 1. It is ignored by the selection in Opaque mode anyway.
+ // 2. This avoids irritating the user with an unnecessary background
+ // color change.
+ //
+ // The only case where you should set <forceColorChange> to true is in
+ // kpToolSelectionTransparencyCommand to ensure that the state
+ // is identical to when the command was constructed.
+ // Later: I don't think setting it to true is ever necessary since:
+ //
+ // 1. The background color only counts in Transparent mode.
+ //
+ // 2. Any kpToolSelectionTransparencyCommand that switches to
+ // Transparent mode will automatically set the background
+ // color due to the first part of [x] anyway.
+ //
+ // The other fields of <transparency> are copied into the main window
+ // as expected.
+ void setSelectionTransparency (const kpSelectionTransparency &transparency,
+ bool forceColorChange = false);
+ int settingSelectionTransparency () const;
+
+private slots:
+ void slotToolSelected (kpTool *tool);
+
+private:
+ void readLastTool ();
+ int toolNumber () const;
+ void saveLastTool ();
+
+private:
+ bool maybeDragScrollingMainView () const;
+private slots:
+ bool slotDragScroll (const QPoint &docPoint,
+ const QPoint &docLastPoint,
+ int zoomLevel,
+ bool *didSomething);
+ bool slotEndDragScroll ();
+
+private slots:
+ void slotBeganDocResize ();
+ void slotContinuedDocResize (const QSize &size);
+ void slotCancelledDocResize ();
+ void slotEndedDocResize (const QSize &size);
+
+ void slotDocResizeMessageChanged (const QString &string);
+
+private slots:
+ void slotActionPrevToolOptionGroup1 ();
+ void slotActionNextToolOptionGroup1 ();
+ void slotActionPrevToolOptionGroup2 ();
+ void slotActionNextToolOptionGroup2 ();
+
+public slots:
+ void slotToolAirSpray ();
+ void slotToolBrush ();
+ void slotToolColorPicker ();
+ void slotToolColorWasher ();
+ void slotToolCurve ();
+ void slotToolEllipse ();
+ void slotToolEllipticalSelection ();
+ void slotToolEraser ();
+ void slotToolFloodFill ();
+ void slotToolFreeFormSelection ();
+ void slotToolLine ();
+ void slotToolPen ();
+ void slotToolPolygon ();
+ void slotToolPolyline ();
+ void slotToolRectangle ();
+ void slotToolRectSelection ();
+ void slotToolRoundedRectangle ();
+ void slotToolText ();
+
+
+ /*
+ * File Menu
+ */
+
+private:
+ void setupFileMenuActions ();
+ void enableFileMenuDocumentActions (bool enable = true);
+
+ KAction *m_actionNew, *m_actionOpen;
+ KRecentFilesAction *m_actionOpenRecent;
+ KAction *m_actionScan, *m_actionSave, *m_actionSaveAs, *m_actionExport,
+ *m_actionReload,
+ *m_actionPrint, *m_actionPrintPreview,
+ *m_actionMail,
+ *m_actionSetAsWallpaperTiled, *m_actionSetAsWallpaperCentered,
+ *m_actionClose, *m_actionQuit;
+
+ KScanDialog *m_scanDialog;
+
+ KURL m_lastExportURL;
+ kpDocumentSaveOptions m_lastExportSaveOptions;
+ bool m_exportFirstTime;
+
+private:
+ void addRecentURL (const KURL &url);
+
+private slots:
+ void slotNew ();
+
+private:
+ QSize defaultDocSize () const;
+ void saveDefaultDocSize (const QSize &size);
+
+private:
+ bool shouldOpenInNewWindow () const;
+ void setDocumentChoosingWindow (kpDocument *doc);
+
+private:
+ kpDocument *openInternal (const KURL &url,
+ const QSize &fallbackDocSize,
+ bool newDocSameNameIfNotExist);
+ // Same as above except that it:
+ //
+ // 1. Assumes a default fallback document size.
+ // 2. If the URL is successfully opened (with the special exception of
+ // the "kolourpaint doesnotexist.png" case), it is bubbled up to the
+ // top in the Recent Files Action.
+ //
+ // As a result of this behavior, this should only be called in response
+ // to a user open request e.g. File / Open or "kolourpaint doesexist.png".
+ // It should not be used for session restore - in that case, it does not
+ // make sense to bubble the Recent Files list.
+ bool open (const KURL &url, bool newDocSameNameIfNotExist = false);
+
+ KURL::List askForOpenURLs (const QString &caption,
+ const QString &startURL,
+ bool allowMultipleURLs = true);
+
+private slots:
+ void slotOpen ();
+ void slotOpenRecent (const KURL &url);
+
+ void slotScan ();
+ void slotScanned (const QImage &image, int);
+
+ bool save (bool localOnly = false);
+ bool slotSave ();
+
+private:
+ KURL askForSaveURL (const QString &caption,
+ const QString &startURL,
+ const QPixmap &pixmapToBeSaved,
+ const kpDocumentSaveOptions &startSaveOptions,
+ const kpDocumentMetaInfo &docMetaInfo,
+ const QString &forcedSaveOptionsGroup,
+ bool localOnly,
+ kpDocumentSaveOptions *chosenSaveOptions,
+ bool isSavingForFirstTime,
+ bool *allowOverwritePrompt,
+ bool *allowLossyPrompt);
+
+private slots:
+ bool saveAs (bool localOnly = false);
+ bool slotSaveAs ();
+
+ bool slotExport ();
+
+ void slotEnableReload ();
+ bool slotReload ();
+
+private:
+ void sendFilenameToPrinter (KPrinter *printer);
+ void sendPixmapToPrinter (KPrinter *printer, bool showPrinterSetupDialog);
+
+private slots:
+ void slotPrint ();
+ void slotPrintPreview ();
+
+ void slotMail ();
+
+private:
+ void setAsWallpaper (bool centered);
+private slots:
+ void slotSetAsWallpaperCentered ();
+ void slotSetAsWallpaperTiled ();
+
+ void slotClose ();
+ void slotQuit ();
+
+
+ /*
+ * Edit Menu
+ */
+
+private:
+ kpPixmapFX::WarnAboutLossInfo pasteWarnAboutLossInfo ();
+ void setupEditMenuActions ();
+ void enableEditMenuDocumentActions (bool enable = true);
+
+ bool m_editMenuDocumentActionsEnabled;
+
+ KAction *m_actionUndo, *m_actionRedo,
+ *m_actionCut, *m_actionCopy,
+ *m_actionPaste, *m_actionPasteInNewWindow,
+ *m_actionDelete,
+ *m_actionSelectAll, *m_actionDeselect,
+ *m_actionCopyToFile, *m_actionPasteFromFile;
+
+ KURL m_lastPasteFromURL;
+
+ KURL m_lastCopyToURL;
+ kpDocumentSaveOptions m_lastCopyToSaveOptions;
+ bool m_copyToFirstTime;
+
+public:
+ QPopupMenu *selectionToolRMBMenu ();
+
+private slots:
+ void slotCut ();
+ void slotCopy ();
+ void slotEnablePaste ();
+private:
+ QRect calcUsefulPasteRect (int pixmapWidth, int pixmapHeight);
+ void paste (const kpSelection &sel,
+ bool forceTopLeft = false);
+public:
+ // (<forceNewTextSelection> is ignored if <text> is empty)
+ void pasteText (const QString &text,
+ bool forceNewTextSelection = false,
+ const QPoint &newTextSelectionTopLeft = KP_INVALID_POINT);
+ void pasteTextAt (const QString &text, const QPoint &point,
+ // Allow tiny adjustment of <point> so that mouse
+ // pointer is not exactly on top of the topLeft of
+ // any new text selection (so that it doesn't look
+ // weird by being on top of a resize handle just after
+ // a paste).
+ bool allowNewTextSelectionPointShift = false);
+public slots:
+ void slotPaste ();
+private slots:
+ void slotPasteInNewWindow ();
+public slots:
+ void slotDelete ();
+
+ void slotSelectAll ();
+private:
+ void addDeselectFirstCommand (kpCommand *cmd);
+public slots:
+ void slotDeselect ();
+private slots:
+ void slotCopyToFile ();
+ void slotPasteFromFile ();
+
+
+ /*
+ * View Menu
+ */
+
+private:
+ bool m_viewMenuDocumentActionsEnabled;
+
+ void setupViewMenuActions ();
+ bool viewMenuDocumentActionsEnabled () const;
+ void enableViewMenuDocumentActions (bool enable = true);
+ void actionShowGridUpdate ();
+
+ KAction *m_actionFullScreenBIC,
+ *m_actionActualSize,
+ *m_actionFitToPage, *m_actionFitToWidth, *m_actionFitToHeight,
+ *m_actionZoomIn, *m_actionZoomOut;
+ KSelectAction *m_actionZoom;
+ KToggleAction *m_actionShowGrid,
+ *m_actionShowThumbnail, *m_actionZoomedThumbnail;
+
+ QValueVector <int> m_zoomList;
+
+private:
+ void sendZoomListToActionZoom ();
+ int zoomLevelFromString (const QString &string);
+ QString zoomLevelToString (int zoomLevel);
+ void zoomTo (int zoomLevel, bool centerUnderCursor = false);
+
+private slots:
+ void finishZoomTo ();
+
+private slots:
+ void slotActualSize ();
+ void slotFitToPage ();
+ void slotFitToWidth ();
+ void slotFitToHeight ();
+
+public:
+ void zoomIn (bool centerUnderCursor = false);
+ void zoomOut (bool centerUnderCursor = false);
+
+public slots:
+ void slotZoomIn ();
+ void slotZoomOut ();
+
+private:
+ void zoomAccordingToZoomAction (bool centerUnderCursor = false);
+
+private slots:
+ void slotZoom ();
+
+ void slotShowGridToggled ();
+private:
+ void updateMainViewGrid ();
+
+private:
+ QRect mapToGlobal (const QRect &rect) const;
+ QRect mapFromGlobal (const QRect &rect) const;
+
+private slots:
+ void slotDestroyThumbnailIfNotVisible (bool tnIsVisible);
+ void slotDestroyThumbnail ();
+ void slotDestroyThumbnailInitatedByUser ();
+ void slotCreateThumbnail ();
+
+private:
+ QTimer *m_thumbnailSaveConfigTimer;
+
+public:
+ void notifyThumbnailGeometryChanged ();
+
+private slots:
+ void slotSaveThumbnailGeometry ();
+ void slotShowThumbnailToggled ();
+ void updateThumbnailZoomed ();
+ void slotZoomedThumbnailToggled ();
+ void slotThumbnailShowRectangleToggled ();
+
+private:
+ void enableViewZoomedThumbnail (bool enable = true);
+ void enableViewShowThumbnailRectangle (bool enable = true);
+ void enableThumbnailOptionActions (bool enable = true);
+ void createThumbnailView ();
+ void destroyThumbnailView ();
+ void updateThumbnail ();
+
+
+ /*
+ * Image Menu
+ */
+
+private:
+ bool isSelectionActive () const;
+ bool isTextSelection () const;
+
+ QString autoCropText () const;
+
+ void setupImageMenuActions ();
+ void enableImageMenuDocumentActions (bool enable = true);
+
+ bool m_imageMenuDocumentActionsEnabled;
+
+ KAction *m_actionResizeScale,
+ *m_actionCrop, *m_actionAutoCrop,
+ *m_actionFlip, *m_actionRotate, *m_actionSkew,
+ *m_actionConvertToBlackAndWhite, *m_actionConvertToGrayscale,
+ *m_actionMoreEffects,
+ *m_actionInvertColors, *m_actionClear;
+
+private slots:
+ void slotImageMenuUpdateDueToSelection ();
+
+public:
+ kpColor backgroundColor (bool ofSelection = false) const;
+ void addImageOrSelectionCommand (kpCommand *cmd,
+ bool addSelCreateCmdIfSelAvail = true,
+ bool addSelPullCmdIfSelAvail = true);
+
+private slots:
+ void slotResizeScale ();
+public slots:
+ void slotCrop ();
+private slots:
+ void slotAutoCrop ();
+ void slotFlip ();
+ void slotRotate ();
+ void slotSkew ();
+ void slotConvertToBlackAndWhite ();
+ void slotConvertToGrayscale ();
+ void slotInvertColors ();
+ void slotClear ();
+ void slotMoreEffects ();
+
+
+ /*
+ * Settings Menu
+ */
+
+private:
+ void setupSettingsMenuActions ();
+ void enableSettingsMenuDocumentActions (bool enable = true);
+
+ KToggleAction *m_actionShowPath;
+ KAction *m_actionKeyBindings, *m_actionConfigureToolbars, *m_actionConfigure;
+ KToggleFullScreenAction *m_actionFullScreen;
+
+private slots:
+ void slotFullScreen ();
+
+ void slotEnableSettingsShowPath ();
+ void slotShowPathToggled ();
+
+ void slotKeyBindings ();
+
+ void slotConfigureToolBars ();
+ void slotNewToolBarConfig ();
+
+ void slotConfigure ();
+
+
+ /*
+ * Status Bar
+ */
+
+private:
+ bool m_statusBarCreated;
+ kpSqueezedTextLabel *m_statusBarMessageLabel;
+
+ bool m_statusBarShapeLastPointsInitialised;
+ QPoint m_statusBarShapeLastStartPoint, m_statusBarShapeLastEndPoint;
+ bool m_statusBarShapeLastSizeInitialised;
+ QSize m_statusBarShapeLastSize;
+
+ enum
+ {
+ StatusBarItemMessage,
+ StatusBarItemShapePoints,
+ StatusBarItemShapeSize,
+ StatusBarItemDocSize,
+ StatusBarItemDocDepth,
+ StatusBarItemZoom
+ };
+
+ void addPermanentStatusBarItem (int id, int maxTextLen);
+ void createStatusBar ();
+
+private slots:
+ void setStatusBarMessage (const QString &message = QString::null);
+ void setStatusBarShapePoints (const QPoint &startPoint = KP_INVALID_POINT,
+ const QPoint &endPoint = KP_INVALID_POINT);
+ void setStatusBarShapeSize (const QSize &size = KP_INVALID_SIZE);
+ void setStatusBarDocSize (const QSize &size = KP_INVALID_SIZE);
+ void setStatusBarDocDepth (int depth = 0);
+ void setStatusBarZoom (int zoom = 0);
+
+ void recalculateStatusBarMessage ();
+ void recalculateStatusBarShape ();
+
+ void recalculateStatusBar ();
+
+
+ /*
+ * Text ToolBar
+ */
+
+private:
+ void setupTextToolBarActions ();
+ void readAndApplyTextSettings ();
+
+public:
+ void enableTextToolBarActions (bool enable = true);
+
+private slots:
+ void slotTextFontFamilyChanged ();
+ void slotTextFontSizeChanged ();
+ void slotTextBoldChanged ();
+ void slotTextItalicChanged ();
+ void slotTextUnderlineChanged ();
+ void slotTextStrikeThruChanged ();
+
+public:
+ KToolBar *textToolBar ();
+ bool isTextStyleBackgroundOpaque () const;
+ kpTextStyle textStyle () const;
+ void setTextStyle (const kpTextStyle &textStyle_);
+ int settingTextStyle () const;
+
+private:
+ KFontAction *m_actionTextFontFamily;
+ KFontSizeAction *m_actionTextFontSize;
+ KToggleAction *m_actionTextBold, *m_actionTextItalic,
+ *m_actionTextUnderline, *m_actionTextStrikeThru;
+
+ int m_settingTextStyle;
+ QString m_textOldFontFamily;
+ int m_textOldFontSize;
+
+
+ /*
+ * Help Menu
+ */
+private:
+ void setupHelpMenuActions ();
+ void enableHelpMenuDocumentActions (bool enable = true);
+
+private slots:
+ void slotHelpTakingScreenshots ();
+ void slotHelpTakingScreenshotsFollowLink (const QString &link);
+
+
+private:
+ // There is no need to maintain binary compatibility at this stage.
+ // The d-pointer is just so that you can experiment without recompiling
+ // the kitchen sink.
+ class kpMainWindowPrivate *d;
+};
+
+
+#endif // KP_MAIN_WINDOW_H