LLToolBarView

Objectives

The LLToolbarView class is designed to handle and orchestrate the simultaneous use of the 3 toolbars on the main view: left, bottom and right.

Design

LLToolbarView exists as a single global (gToolBarView) instantiated by LLViewerWindow.

In order to have the toolbars always drawn on top of all floaters, a toolbar_view_holder is defined in main_view.xml and is placed immediately above the floater_view.

In LLViewerWindow::initBase(), this toolbar_view_holder panel is acquired and passed to the LLToolbarView constructor to instantiate gToolBarView. This requirement is why gToolBarView is handled as a global instead of using the LLSingleton pattern: it's easier to control its exact creation moment in the application initialization.

General Layout

The toolbars view layout is specified in panel_toolbar_view.xml.

It is made of a horizontal layout stack containing 2 regions:

The carets, used to indicate drop position on Drag and Drop, are specified icon xui so each toolbar can have its own xui driven caret.

Toolbars Layout

The LLToolbarView maintains pointers to each individual LLToolBar. When the LLToolbarView is instantiated, the toolbars are not immediately loaded. This is because the content of each toolbar is set on a per user account basis and, therefore, the application needs to wait till after login to know which toolbars to load.

The toolbar content is saved as user specific settings in toolbars.xml. If the user specific toolbars.xml cannot be found or opened, the default toolbars.xml is loaded. This default is also the one loaded when hitting the "Restore default" button in the toybox (see toybox wiki).

When changing the toolbars and when quitting the application, a toolbars.xml is saved in the user's settings.

For more information on the toolbar specific layout design (view option, etc...), see the toolbar wiki.

Relevant Code:

Drag and Drop

Each tool can be individually dragged and dropped from any toolbar or toybox to any other. The LLToolbarView orchestrate 2 main functions here:

When starting to drag, the handleDragTool() is called and creates the various data to be passed as payload to the general LLToolDragAndDrop::beginMultiDrag() call. This general Drag and Drop framework though is meant to move around in a general way any kind of asset that can be identified with a unique UUID and a type. In order to latch the tool drag and drop action to the general drag and drop framework, we had to create a set of specific types:

That being defined, the LLToolbarView can discriminate between a legit widget asset being dragged and other assets. When it detects such a drag event as happening, LLToolbarView::draw() displays the background drop zone for each toolbar. The color of this is specified as ToolbarDropZoneColor in colors.xml.

Also all other viewer drop target can react correctly to a dragged widget and display the "no" cursor.

In the future, we'll be able to use the same mechanism so that other viewer widget can become draggable or declare themselves as accepting droppable widgets. This should help making the viewer UI fully customizable.

On drop, the LLToolBarView::handleDropTool() method makes sure that the tool is added to the correct toolbar in the right place and also removed from other toolbars so to avoid duplication of tools and, in effect, moving tools from a toolbar to another.

Relevant Code: