ModelEditor: Store last used toolbar in diagram

Opening a diagram will automatically show the toolbar which was lastly
used for that diagram.

Change-Id: Ia78225ca0bd3d9fbebfcfd22691bcc702e69e5ea
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
Jochen Becher
2015-12-03 21:31:56 +01:00
parent 90ab6e9b94
commit 0750fd6de5
6 changed files with 85 additions and 27 deletions

View File

@@ -98,6 +98,8 @@
namespace ModelEditor {
namespace Internal {
static const char PROPERTYNAME_TOOLBARID[] = "ToolbarId";
class ModelEditor::ModelEditorPrivate
{
public:
@@ -215,6 +217,7 @@ void ModelEditor::init(QWidget *parent)
QFont font = d->leftToolBox->font();
font.setPointSizeF(font.pointSizeF() * 0.8);
d->leftToolBox->setFont(font);
connect(d->leftToolBox, &QToolBox::currentChanged, this, &ModelEditor::onToolbarSelectionChanged);
d->diagramStack = new QStackedWidget(d->leftGroup);
@@ -222,16 +225,17 @@ void ModelEditor::init(QWidget *parent)
d->diagramStack->addWidget(d->diagramView);
d->noDiagramLabel = new QLabel(d->diagramStack);
const QString placeholderText = tr("<html><body style=\"color:#909090; font-size:14px\">"
"<div align='center'>"
"<div style=\"font-size:20px\">Open a diagram</div>"
"<table><tr><td>"
"<hr/>"
"<div style=\"margin-top: 5px\">&bull; Double-click on diagram in model tree</div>"
"<div style=\"margin-top: 5px\">&bull; Select \"Open Diagram\" from package's context menu in model tree</div>"
"</td></tr></table>"
"</div>"
"</body></html>");
const QString placeholderText =
tr("<html><body style=\"color:#909090; font-size:14px\">"
"<div align='center'>"
"<div style=\"font-size:20px\">Open a diagram</div>"
"<table><tr><td>"
"<hr/>"
"<div style=\"margin-top: 5px\">&bull; Double-click on diagram in model tree</div>"
"<div style=\"margin-top: 5px\">&bull; Select \"Open Diagram\" from package's context menu in model tree</div>"
"</td></tr></table>"
"</div>"
"</body></html>");
d->noDiagramLabel->setText(placeholderText);
d->diagramStack->addWidget(d->noDiagramLabel);
d->diagramStack->setCurrentWidget(d->noDiagramLabel);
@@ -295,22 +299,22 @@ void ModelEditor::init(QWidget *parent)
toolbarLayout->addWidget(d->diagramSelector, 1);
toolbarLayout->addStretch(1);
toolbarLayout->addWidget(createToolbarCommandButton(
Constants::ACTION_ADD_PACKAGE, [this]() { onAddPackage(); },
QIcon(QStringLiteral(":/modelinglib/48x48/package.png")),
tr("Add Package"), d->toolbar));
toolbarLayout->addWidget(createToolbarCommandButton(
Constants::ACTION_ADD_COMPONENT, [this]() { onAddComponent(); },
QIcon(QStringLiteral(":/modelinglib/48x48/component.png")),
tr("Add Component"), d->toolbar));
toolbarLayout->addWidget(createToolbarCommandButton(
Constants::ACTION_ADD_CLASS, [this]() { onAddClass(); },
QIcon(QStringLiteral(":/modelinglib/48x48/class.png")),
tr("Add Class"), d->toolbar));
toolbarLayout->addWidget(createToolbarCommandButton(
Constants::ACTION_ADD_CANVAS_DIAGRAM, [this]() { onAddCanvasDiagram(); },
QIcon(QStringLiteral(":/modelinglib/48x48/canvas-diagram.png")),
tr("Add Canvas Diagram"), d->toolbar));
toolbarLayout->addWidget(
createToolbarCommandButton(Constants::ACTION_ADD_PACKAGE, [this]() { onAddPackage(); },
QIcon(QStringLiteral(":/modelinglib/48x48/package.png")),
tr("Add Package"), d->toolbar));
toolbarLayout->addWidget(
createToolbarCommandButton(Constants::ACTION_ADD_COMPONENT, [this]() { onAddComponent(); },
QIcon(QStringLiteral(":/modelinglib/48x48/component.png")),
tr("Add Component"), d->toolbar));
toolbarLayout->addWidget(
createToolbarCommandButton(Constants::ACTION_ADD_CLASS, [this]() { onAddClass(); },
QIcon(QStringLiteral(":/modelinglib/48x48/class.png")),
tr("Add Class"), d->toolbar));
toolbarLayout->addWidget(
createToolbarCommandButton(Constants::ACTION_ADD_CANVAS_DIAGRAM, [this]() { onAddCanvasDiagram(); },
QIcon(QStringLiteral(":/modelinglib/48x48/canvas-diagram.png")),
tr("Add Canvas Diagram"), d->toolbar));
toolbarLayout->addSpacing(20);
}
@@ -849,6 +853,11 @@ void ModelEditor::onRightHorizSplitterChanged(const QByteArray &state)
d->rightHorizSplitter->restoreState(state);
}
void ModelEditor::onToolbarSelectionChanged()
{
storeToolbarIdInDiagram(currentDiagram());
}
void ModelEditor::initToolbars()
{
QHash<QString, QWidget *> toolBars;
@@ -860,9 +869,11 @@ void ModelEditor::initToolbars()
QLayout *toolBarLayout = 0;
if (!toolBar) {
toolBar = new QWidget(d->leftToolBox);
toolBar->setProperty(PROPERTYNAME_TOOLBARID, toolbar.id());
toolBarLayout = new QVBoxLayout(toolBar);
toolBarLayout->setContentsMargins(2, 2, 2, 2);
toolBarLayout->setSpacing(6);
// TODO add a user defined string attribute to toolbar as toolbar title
d->leftToolBox->addItem(toolBar, toolbar.id());
toolBars.insert(toolbar.id(), toolBar);
} else {
@@ -929,6 +940,7 @@ void ModelEditor::initToolbars()
if (!toolBars.isEmpty()) {
QString generalId = QStringLiteral("General");
auto toolBar = new QWidget(d->leftToolBox);
toolBar->setProperty(PROPERTYNAME_TOOLBARID, generalId);
auto toolBarLayout = new QVBoxLayout(toolBar);
toolBarLayout->setContentsMargins(2, 2, 2, 2);
toolBarLayout->setSpacing(6);
@@ -988,6 +1000,17 @@ void ModelEditor::openDiagram(qmt::MDiagram *diagram, bool addToHistory)
d->diagramStack->setCurrentWidget(d->diagramView);
updateSelectedArea(SelectedArea::Nothing);
addDiagramToSelector(diagram);
if (!diagram->toolbarId().isEmpty()) {
for (int i = 0; i < d->leftToolBox->count(); ++i) {
QWidget *widget = d->leftToolBox->widget(i);
if (widget && widget->property(PROPERTYNAME_TOOLBARID).toString() == diagram->toolbarId()) {
d->leftToolBox->setCurrentIndex(i);
break;
}
}
} else {
storeToolbarIdInDiagram(diagram);
}
}
}
@@ -1108,6 +1131,24 @@ QString ModelEditor::buildDiagramLabel(const qmt::MDiagram *diagram)
return label;
}
void ModelEditor::storeToolbarIdInDiagram(qmt::MDiagram *diagram)
{
int leftToolboxIndex = d->leftToolBox->currentIndex();
if (diagram && leftToolboxIndex >= 0 && leftToolboxIndex < d->leftToolBox->count()) {
QWidget *widget = d->leftToolBox->widget(leftToolboxIndex);
if (widget) {
QString toolbarId = widget->property(PROPERTYNAME_TOOLBARID).toString();
if (toolbarId != diagram->toolbarId()) {
// NOTE: This update is done without calling ModelController::startUpdateObject() by intention.
// This update does not need to be seen by any other controller nor shall it
// No undo shall be possible
// The document should not be set to modified state
diagram->setToolbarId(toolbarId);
}
}
}
}
void ModelEditor::addToNavigationHistory(const qmt::MDiagram *diagram)
{
if (Core::EditorManager::currentEditor() == this)