forked from qt-creator/qt-creator
		
	Signed-off-by: Abhishek Patil <abhishek.patil@vcreatelogic.com> Merge-request: 145 Reviewed-by: con <qtc-committer@nokia.com>
		
			
				
	
	
		
			172 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			172 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
/*!
 | 
						|
    \page nav-widget.html
 | 
						|
    \title 6. Adding Navigation Widget
 | 
						|
	
 | 
						|
	Navigation panel in Qt Creator is the area where Project, File System, Bookmark and Open Documents siderbars are
 | 
						|
	shown. Sidebar is one of the widgets in the "Navigation Panel" Take a look at the marked area in the screenshot below.
 | 
						|
 | 
						|
	\inlineimage qtc-firstnavigation-6.png
 | 
						|
	
 | 
						|
	
 | 
						|
	Qt Creator makes it possible for us to divide the navigation panel into windows and view more than one side bar at the
 | 
						|
	same time. Take a look at the screenshot below.
 | 
						|
	
 | 
						|
	
 | 
						|
	\inlineimage qtc-secondnavigation-6.png
 | 
						|
	
 | 
						|
	
 | 
						|
	In this chapter we will understand how to add a new side bar to Qt Creator.
 | 
						|
	
 | 
						|
	\section1 6.1 Core::INavigationWidgetFactory interface
 | 
						|
	
 | 
						|
	The Core of Qt Creator exposes an interface called Core::INavigationWidgetFactory. The interface is defined as follows in
 | 
						|
	plugins/corelib/inavigationwidgetfactory.h
 | 
						|
	
 | 
						|
	\code
 | 
						|
    class CORE_EXPORT INavigationWidgetFactory : public QObject
 | 
						|
    {
 | 
						|
        Q_OBJECT
 | 
						|
 | 
						|
    public:
 | 
						|
        INavigationWidgetFactory();
 | 
						|
        virtual ~INavigationWidgetFactory();
 | 
						|
        virtual QString displayName() = 0;
 | 
						|
        virtual QKeySequence activationSequence();
 | 
						|
        virtual NavigationView createWidget() = 0;
 | 
						|
        virtual void saveSettings(int position, QWidget *widget);
 | 
						|
        virtual void restoreSettings(int position, QWidget *widget);
 | 
						|
    };
 | 
						|
	\endcode
 | 
						|
	
 | 
						|
	And NavigationView (the return type of createWidget()) is
 | 
						|
	
 | 
						|
	\code
 | 
						|
    struct NavigationView
 | 
						|
    {
 | 
						|
        QWidget *widget;
 | 
						|
        QList<QToolButton *> doockToolBarWidgets;
 | 
						|
    };
 | 
						|
	
 | 
						|
	\endcode
 | 
						|
	
 | 
						|
	Plugins that provide a navigation siderbar (or widget) must implement this interface. In addition to implementing the
 | 
						|
	interface, the plugin has to use "expose" an instance of that interface using methods described in section 4.2.2.
 | 
						|
	
 | 
						|
	\section1 6.2 Preparing a navigation sidebar (widget)
 | 
						|
	 
 | 
						|
	 Suppose that we wanted to provide a Directory browser as a side bar widget from our plugin.
 | 
						|
	 
 | 
						|
	\section2 Step 1: Let's Implement FileSystemModel such that it will show only one column.
 | 
						|
    
 | 
						|
    The Implementation of FileSystemModel is as follows:
 | 
						|
    \code
 | 
						|
    #include <QFileSystemModel>
 | 
						|
    
 | 
						|
    class FileSystemModel : public QFileSystemModel
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        FileSystemModel(QObject* parent=0);
 | 
						|
        ~FileSystemModel();
 | 
						|
        int columnCount(const QModelIndex &parent = QModelIndex()}const;
 | 
						|
    };
 | 
						|
    \endcode
 | 
						|
    
 | 
						|
    General Constructor and Destructor
 | 
						|
    \code
 | 
						|
    FileSystemModel::FileSyatemModel(QObject *parent)
 | 
						|
        :QFileSystemModel(parent)
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    FileSystemModel::~FileSystemModel()
 | 
						|
    {
 | 
						|
    }
 | 
						|
    \endcode
 | 
						|
    
 | 
						|
    Implement the virtual function columnCount to return only one column.
 | 
						|
    
 | 
						|
    \code
 | 
						|
    int FileSystemModel::columnCount(const QModelIndex &parent)const
 | 
						|
    {
 | 
						|
        Q_UNUSED(parent)
 | 
						|
        return 1;
 | 
						|
    }
 | 
						|
    \endcode
 | 
						|
    With this FileSystemModel is ready.
 | 
						|
    	
 | 
						|
	\section2 Step 2: Implementing the INavigationWidgetFactory Interface
 | 
						|
    We implement the INavigationWidgetFactory interface in a class whose defination is as follows
 | 
						|
    
 | 
						|
    \code
 | 
						|
    #include<coreplugin/inavigationwidgetfactory.h>
 | 
						|
    
 | 
						|
    class DirNavigationFactory:: public Core::INavigationWidgetFactory
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        DirNavigationFactory(){}
 | 
						|
        ~DirNavigationFactory(){}
 | 
						|
        Core::NavigationView createWidget();
 | 
						|
        QString displayName();
 | 
						|
    };
 | 
						|
    
 | 
						|
    \endcode
 | 
						|
    
 | 
						|
    The createWidget() method is implemented to return an instance of the QTreeView which uses 
 | 
						|
    FileSystemModel that was explained in previous step.
 | 
						|
    \code
 | 
						|
    Core::NavigationView DirNavigationFactory::createWidget()
 | 
						|
    {
 | 
						|
        Core::NavigationView view;
 | 
						|
 | 
						|
        // Create FileSystemModel and set the defauls path as home path
 | 
						|
        FileSystemModel* model = new FileSystemModel;
 | 
						|
        model->setRootPath(QDir::homePath());
 | 
						|
 | 
						|
        // Create TreeView and set model
 | 
						|
        QTreeView* tree = new QTreeView;
 | 
						|
        tree->setModel(model);
 | 
						|
 | 
						|
        view.widget = tree;
 | 
						|
 | 
						|
        return view;
 | 
						|
    }
 | 
						|
	\endcode
 | 
						|
			
 | 
						|
	The \bold {displayName()} method is implemented to return a descriptive name that Qt Creator should use for showing the
 | 
						|
	side-bar.
 | 
						|
	
 | 
						|
    \code
 | 
						|
    QString DirNavigationFactory::displayName()
 | 
						|
    {
 | 
						|
        return "Dir View";
 | 
						|
    }
 | 
						|
	\endcode
 | 
						|
		
 | 
						|
	With this the \bold {INavigationWidgetFactory} implementation is ready.
 | 
						|
	
 | 
						|
	\section2 Step 3: Implementing the Dir-view plugin
 | 
						|
	We implement the Dir-view plugin class similar to the \bold {DoNothingPlugin} class described in Chapter 2. Hence, we only
 | 
						|
	describe the implementation of the initialize method of the \bold {DirModelPluginPlugin} class here.
 | 
						|
	
 | 
						|
	\code
 | 
						|
    bool DirModelPluginPlugin::initialize(const QStringList& args, QString *errMsg)
 | 
						|
    {
 | 
						|
        Q_UNUSED(args);
 | 
						|
        Q_UNUSED(errMsg);
 | 
						|
        addAutoReleasedObject(new DirNavigationFactory);
 | 
						|
        return true;
 | 
						|
    }
 | 
						|
	\endcode
 | 
						|
	
 | 
						|
	In the \bold {initialize()} method an instance of the \bold {INavigationWidgetFactory} implementation is created and added to the object
 | 
						|
	pool. Once the object is added to the pool, \bold {ExtensionSystem::PluginManager} emits the \bold {objectAdded()} signal, which is
 | 
						|
	then trapped by the Core of Qt Creator. The Core then makes use of our implementation of \bold {INavigationWidgetFactory}
 | 
						|
	interface and places an instance of DirExplorerSideBar in the navigation panel.
 | 
						|
	
 | 
						|
	\section2 Step 4: Testing the plugin
 | 
						|
	Upon compiling the plugin and restarting Qt Creator, we can notice the "Dir View" side bar as shown below.
 | 
						|
	
 | 
						|
	\inlineimage qtc-dirview-6.png
 | 
						|
		 
 | 
						|
*/
 |