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
|
|
|
|
*/
|