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