diff options
Diffstat (limited to 'src/viewcontainer.h')
-rw-r--r-- | src/viewcontainer.h | 249 |
1 files changed, 249 insertions, 0 deletions
diff --git a/src/viewcontainer.h b/src/viewcontainer.h new file mode 100644 index 0000000..c798530 --- /dev/null +++ b/src/viewcontainer.h @@ -0,0 +1,249 @@ +/*************************************************************************** + * Copyright (C) 2005 by David Saxton * + * [email protected] * + * * + * 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. * + ***************************************************************************/ + +#ifndef VIEWCONTAINER_H +#define VIEWCONTAINER_H + +#include <qdragobject.h> +#include <qmap.h> +#include <qsplitter.h> +#include <qvaluelist.h> + +class KTechlab; +class View; +class ViewArea; +class ViewContainer; + +class KConfig; +class QHBoxLayout; +class QLayout; +class QSplitter; + +typedef QMap< uint, ViewArea* > ViewAreaMap; +typedef QValueList<int> IntList; + +class ViewContainerDrag : public QStoredDrag +{ +public: + ViewContainerDrag( ViewContainer *viewContainer ); + + ViewContainer *viewContainer() const { return p_viewContainer; } + +protected: + ViewContainer *p_viewContainer; +}; + + +/** +Contains either exactly one View, or two ViewAreas, seperated by a QSplitter. +If it contains one view, then the value returned in id() is that of the view. +If it contains two ViewAreas, then the value returned by id() is -1. +@author David Saxton +*/ +class ViewArea : public QSplitter +{ +Q_OBJECT +public: + enum Position + { + Right, + Bottom + }; + + ViewArea( QWidget *parent, ViewContainer *viewContainer, int id, const char *name = 0 ); + ~ViewArea(); + + ViewContainer *viewContainer() const { return p_viewContainer; } + int id() const { return m_id; } + /** + * Splits this ViewArea into two, and returns a pointer to the new ViewArea + */ + ViewArea *createViewArea( Position position, uint id ); + /** + * Adds the given View to the main part of the layout + */ + void setView( View *view ); + /** + * Saves the state of this ViewArea and any contained ViewAreas + */ + void saveState( KConfig *config ); + /** + * Restores the state of this ViewArea and any contained ViewAreas + * @param groupName e.g. "ViewContainer 1" + */ + void restoreState( KConfig *config, int id, const QString &groupName ); + /** + * Returns true if this ViewArea can save useful information as to its state + * (i.e. it's children can save useful information about their state, or has + * a view with a url in it) + */ + bool canSaveUsefulStateInfo() const; + /** + * Calls View::setKTechlabDeleted. + */ + void setKTechlabDeleted(); + + static QString fileKey( int id ); + static QString containsKey( int id ); + static QString orientationKey( int id ); + +protected slots: + void viewAreaDestroyed( QObject *obj ); + void viewDestroyed(); + +protected: + int m_id; + QGuardedPtr<View> p_view; + ViewArea *p_viewArea1; + ViewArea *p_viewArea2; + ViewContainer *p_viewContainer; +}; + +/** +@author David Saxton +*/ +class ViewContainer : public QWidget +{ +Q_OBJECT +public: + /** + * Constructs a new ViewContainer, along with a default ViewArea ready for + * parenting a View, with an id of 0. parent is only used if ktechlab is + * null; otherwise the parent widget is ktechlab's tabWidget() + */ + ViewContainer( const QString & caption, KTechlab * ktechlab, QWidget * parent = 0 ); + ~ViewContainer(); + + /** + * Returns the view in the ViewArea with the given id + */ + View *view( uint id ) const; + /** + * Returns the ViewArea with the given id + */ + ViewArea *viewArea( uint id ) const; + /** + * The active view area is the one that is focused. + */ + void setActiveViewArea( uint id ); + /** + * Returns the id of the active ViewArea + */ + uint activeViewArea() const { return m_activeViewArea; } + /** + * Returns a pointer to the view of the active view area + */ + View *activeView() const { return view( activeViewArea() ); } + /** + * Attempts to close the given viewarea, returning true if successful (i.e + * if the user did not object to the close request ) + */ + bool closeViewArea( uint id ); + /** + * Creates a view area (parent QWidget, splitter et al) ready for inclusion + * of a view. + * @param relativeViewArea the viewarea to position the new viewarea next to, if -1 then is taken to be the active view area + * @param position Top, Right, Bottom or Left of given relativeViewArea + * @returns id of the the view area, or -1 if unsucessful + */ + int createViewArea( int relativeViewArea, ViewArea::Position position = ViewArea::Right ); + /** + * Attempts to close each view area, returning false if any fail to be + * closed + */ + bool closeViewContainer(); + /** + * @returns number of views in this view container + */ + uint viewCount() const { return m_viewAreaMap.size(); } + /** + * Called when the view container is focused (e.g. user clicks on the tab + * for this view container) + */ + void setFocused(); + /** + * Called when the view container is unfocused (e.g. user clicks on another + * tab). + */ + void setUnfocused(); + /** + * Create a new view container, and make a new instance of each view in + * that view container. + */ + ViewContainer* duplicateViewContainer(); + /** + * Copies each view in this ViewContainer into the given ViewContainer + */ + void copyViewContainerIntoExisting( ViewContainer *viewContainer ); + /** + * Sets the pointer to the view area with the given id + */ + void setViewAreaId( ViewArea *viewArea, uint id ); + /** + * Removes a ViewArea from internal lists + */ + void setViewAreaRemoved( uint id ); + /** + * Sets the id to be "used" + */ + void setIdUsed( int id ); + /** + * Writes the state of the View Container (layout of views and view URLs) + * to the given KConfig. Doesn't change the group - so preset it if + * needed! + */ + void saveState( KConfig *config ); + /** + * Reads in the saved config state (as written by saveState), and restores + * the ViewContainer with all appropriate views open + * @param groupName e.g. "ViewContainer 1" + */ + void restoreState( KConfig *config, const QString &groupName ); + /** + * Returns a unique id (negative) for a ViewArea that is now a Parent of other ViewAreas + */ + int uniqueParentId(); + /** + * Returns a unique id (positive) for a new ViewArea + */ + int uniqueNewId(); + /** + * Returns true if this ViewArea can save useful information as to its state + * (i.e. it's children can save useful information about their state, or has + * a view with a url in it) + */ + bool canSaveUsefulStateInfo() const; + /** + * Calls setKTechlabDeleted for each ViewArea. + */ + void setKTechlabDeleted(); + +public slots: + /** + * Sets the tab caption et al from the contents of this ViewContainer + */ + void updateCaption(); + +protected slots: + void baseViewAreaDestroyed( QObject *obj ); + +protected: + void restoreViewArea( KConfig *config, int id, ViewArea *viewArea ); + void findActiveViewArea(); + int m_activeViewArea; + ViewArea *m_baseViewArea; + ViewAreaMap m_viewAreaMap; + IntList m_usedIDs; + KTechlab *p_ktechlab; + bool b_focused; + bool b_deleted; +}; + +#endif |