Sub-scene breadcrumbs

This commit is contained in:
manongjohn 2023-10-21 09:36:52 -04:00
parent 32a45890bb
commit 1044a9fb4b
22 changed files with 623 additions and 44 deletions

View file

@ -2255,6 +2255,14 @@ Ruler {
#RenameCellField {
padding-right: 3;
}
#XsheetBreadcrumbs {
padding: 0;
margin: 0;
border-bottom: 1 solid #111111;
}
#XsheetBreadcrumbs::separator:horizontal {
margin: 0 0 0 2;
}
/* xsheetColumnHeader (Context Menus)
----------------------------------------------------------------------------- */
#xsheetColumnAreaMenu_Preview {

View file

@ -2255,6 +2255,14 @@ Ruler {
#RenameCellField {
padding-right: 3;
}
#XsheetBreadcrumbs {
padding: 0;
margin: 0;
border-bottom: 1 solid #060606;
}
#XsheetBreadcrumbs::separator:horizontal {
margin: 0 0 0 2;
}
/* xsheetColumnHeader (Context Menus)
----------------------------------------------------------------------------- */
#xsheetColumnAreaMenu_Preview {

View file

@ -2255,6 +2255,14 @@ Ruler {
#RenameCellField {
padding-right: 3;
}
#XsheetBreadcrumbs {
padding: 0;
margin: 0;
border-bottom: 1 solid #a8a8a8;
}
#XsheetBreadcrumbs::separator:horizontal {
margin: 0 0 0 2;
}
/* xsheetColumnHeader (Context Menus)
----------------------------------------------------------------------------- */
#xsheetColumnAreaMenu_Preview {

View file

@ -2255,6 +2255,14 @@ Ruler {
#RenameCellField {
padding-right: 3;
}
#XsheetBreadcrumbs {
padding: 0;
margin: 0;
border-bottom: 1 solid #2c2c2c;
}
#XsheetBreadcrumbs::separator:horizontal {
margin: 0 0 0 2;
}
/* xsheetColumnHeader (Context Menus)
----------------------------------------------------------------------------- */
#xsheetColumnAreaMenu_Preview {

View file

@ -40,6 +40,15 @@
padding-right: 3;
}
#XsheetBreadcrumbs {
padding: 0;
margin: 0;
border-bottom: 1 solid @accent;
&::separator:horizontal {
margin: 0 0 0 2;
}
}
/* xsheetColumnHeader (Context Menus)
----------------------------------------------------------------------------- */

View file

@ -2255,6 +2255,14 @@ Ruler {
#RenameCellField {
padding-right: 3;
}
#XsheetBreadcrumbs {
padding: 0;
margin: 0;
border-bottom: 1 solid #5a5a5a;
}
#XsheetBreadcrumbs::separator:horizontal {
margin: 0 0 0 2;
}
/* xsheetColumnHeader (Context Menus)
----------------------------------------------------------------------------- */
#xsheetColumnAreaMenu_Preview {

View file

@ -5,6 +5,8 @@
#include "tcommon.h"
#include "toonz/txshchildlevel.h"
#undef DVAPI
#undef DVVAR
#ifdef TOONZLIB_EXPORTS
@ -36,11 +38,29 @@ class TXshChildLevel;
properties, getAncestor(), getAncestorCount(), getAncestorAffine(),
getTopXsheet().
*/
//=============================================================================
//! The Node class is a container of element necessary to define a sub-xsheet.
/*!
The class contain a pointer to \b TXsheet \b m_xsheet, two integer to
identify column
\b m_col and row \b m_row, a \b TXshChildLevelP \b m_cl and a bool \b
m_justCreated.
*/
class AncestorNode {
public:
TXsheet *m_xsheet;
int m_row, m_col;
std::map<int, int> m_rowTable;
TXshChildLevelP m_cl;
bool m_justCreated;
AncestorNode()
: m_xsheet(0), m_row(0), m_col(0), m_rowTable(), m_justCreated(false) {}
};
class DVAPI ChildStack {
class Node;
std::vector<Node *> m_stack;
std::vector<AncestorNode *> m_stack;
TXsheet *m_xsheet;
ToonzScene *m_scene;
@ -114,6 +134,8 @@ visible in \b row.
*/
bool getAncestorAffine(TAffine &aff, int row) const;
AncestorNode *getAncestorInfo(int ancestorDepth);
private:
// not implemented
ChildStack(const ChildStack &);

View file

@ -407,6 +407,9 @@ public:
bool isShowQuickToolbarEnabled() const {
return getBoolValue(showQuickToolbar);
}
bool isShowXsheetBreadcrumbsEnabled() const {
return getBoolValue(showXsheetBreadcrumbs);
}
bool isExpandFunctionHeaderEnabled() const {
return getBoolValue(expandFunctionHeader);
}

View file

@ -136,6 +136,7 @@ enum PreferencesItemId {
inputCellsWithoutDoubleClickingEnabled,
shortcutCommandsWhileRenamingCellEnabled,
showQuickToolbar,
showXsheetBreadcrumbs,
expandFunctionHeader,
showColumnNumbers,
parentColorsInXsheetColumn,

View file

@ -142,6 +142,7 @@ set(MOC_HEADERS
cameracapturelevelcontrol.h
navtageditorpopup.h
viewereventlogpopup.h
xshbreadcrumbs.h
)
set(HEADERS
@ -390,6 +391,7 @@ set(SOURCES
cameracapturelevelcontrol.cpp
navtageditorpopup.cpp
viewereventlogpopup.cpp
xshbreadcrumbs.cpp
)
if(WITH_TRANSLATION)

View file

@ -2481,6 +2481,8 @@ void MainWindow::defineActions() {
"view_file");
createRightClickMenuAction(MI_ToggleQuickToolbar,
QT_TR_NOOP("Toggle Quick Toolbar"), "");
createRightClickMenuAction(MI_ToggleXsheetBreadcrumbs,
QT_TR_NOOP("Toggle Sub-Scene Breadcrumbs"), "");
createRightClickMenuAction(MI_ToggleXsheetCameraColumn,
QT_TR_NOOP("Show/Hide Camera Column"), "");
createRightClickMenuAction(MI_SetKeyframes, QT_TR_NOOP("&Set Key"), "Z",

View file

@ -328,6 +328,7 @@
#define MI_UnlockAllColumns "MI_UnlockAllColumns"
#define MI_ToggleColumnLocks "MI_ToggleColumnLocks"
#define MI_ToggleQuickToolbar "MI_ToggleQuickToolbar"
#define MI_ToggleXsheetBreadcrumbs "MI_ToggleXsheetBreadcrumbs"
#define MI_FoldColumns "MI_FoldColumns"
#define MI_ToggleXsheetCameraColumn "MI_ToggleXsheetCameraColumn"
#define MI_ToggleCurrentTimeIndicator "MI_ToggleCurrentTimeIndicator"

View file

@ -735,6 +735,13 @@ void PreferencesPopup::onShowQuickToolbarClicked() {
//-----------------------------------------------------------------------------
void PreferencesPopup::onShowXsheetBreadcrumbsClicked() {
TApp::instance()->getCurrentScene()->notifyPreferenceChanged(
"XsheetBreadcrumbs");
}
//-----------------------------------------------------------------------------
void PreferencesPopup::onModifyExpressionOnMovingReferencesChanged() {
TApp::instance()->getCurrentScene()->notifyPreferenceChanged(
"modifyExpressionOnMovingReferences");
@ -1375,8 +1382,9 @@ QString PreferencesPopup::getUIString(PreferencesItemId id) {
{shortcutCommandsWhileRenamingCellEnabled,
tr("Enable Tahoma2D Commands' Shortcut Keys While Renaming Cell")},
{showQuickToolbar, tr("Show Quick Toolbar")},
{expandFunctionHeader,
tr("Expand Function Editor Header to Match Quick Toolbar Height*")},
{showXsheetBreadcrumbs, tr("Show Sub-Scene Breadcrumbs")},
{expandFunctionHeader, tr("Expand Function Editor Header to Match Quick "
"Toolbar/Breadcrumb Height*")},
{showColumnNumbers, tr("Show Column Numbers")},
{parentColorsInXsheetColumn,
tr("Show Column Parent's Color in the Xsheet")},
@ -2126,8 +2134,12 @@ QWidget* PreferencesPopup::createXsheetPage() {
insertUI(useArrowKeyToShiftCellSelection, lay);
insertUI(inputCellsWithoutDoubleClickingEnabled, lay);
insertUI(shortcutCommandsWhileRenamingCellEnabled, lay);
QGridLayout* xshToolbarLay = insertGroupBoxUI(showQuickToolbar, lay);
{ insertUI(expandFunctionHeader, xshToolbarLay); }
QGridLayout* xshToolbarLay = insertGroupBox(tr("Scene Tools"), lay);
{
insertUI(showQuickToolbar, xshToolbarLay);
insertUI(showXsheetBreadcrumbs, xshToolbarLay);
insertUI(expandFunctionHeader, xshToolbarLay);
}
insertUI(showColumnNumbers, lay);
insertUI(parentColorsInXsheetColumn, lay);
insertUI(highlightLineEverySecond, lay);
@ -2150,6 +2162,8 @@ QWidget* PreferencesPopup::createXsheetPage() {
&PreferencesPopup::onShowKeyframesOnCellAreaChanged);
m_onEditedFuncMap.insert(showQuickToolbar,
&PreferencesPopup::onShowQuickToolbarClicked);
m_onEditedFuncMap.insert(showXsheetBreadcrumbs,
&PreferencesPopup::onShowXsheetBreadcrumbsClicked);
return widget;
}

View file

@ -165,6 +165,7 @@ private:
// Xsheet
void onShowKeyframesOnCellAreaChanged();
void onShowQuickToolbarClicked();
void onShowXsheetBreadcrumbsClicked();
// Animation
void onModifyExpressionOnMovingReferencesChanged();
// Preview

View file

@ -0,0 +1,344 @@
#include "xshbreadcrumbs.h"
// Tnz6 includes
#include "xsheetviewer.h"
#include "tapp.h"
#include "menubarcommandids.h"
// TnzLib includes
#include "toonz/preferences.h"
#include "toonz/toonzscene.h"
#include "toonz/tscenehandle.h"
#include "toonz/childstack.h"
#include "toonzqt/menubarcommand.h"
#include "toonzqt/tselectionhandle.h"
#include "toonzqt/dvscrollwidget.h"
// Qt includes
#include <QWidgetAction>
#include <QLabel>
#include <QComboBox>
//=============================================================================
BreadcrumbClickableLabel::BreadcrumbClickableLabel(QString labelName,
QWidget *parent,
Qt::WindowFlags f)
: QLabel(labelName, parent) {
setStyleSheet("text-decoration: underline;");
}
BreadcrumbClickableLabel::~BreadcrumbClickableLabel() {}
void BreadcrumbClickableLabel::mousePressEvent(QMouseEvent *event) {
emit clicked();
}
namespace XsheetGUI {
//=============================================================================
Breadcrumb::Breadcrumb(CrumbType crumbType, QString crumbName,
CrumbWidgetType crumbWidgetType, QWidget *parent)
: QWidget(parent)
, m_crumbType(crumbType)
, m_col(-1)
, m_colList(0)
, m_distanceFromCurrent(0) {
if (crumbWidgetType == CrumbWidgetType::LABEL)
m_crumbWidget = new QLabel(crumbName, parent);
else if (crumbWidgetType == CrumbWidgetType::BUTTON) {
BreadcrumbClickableLabel *crumbButton =
new BreadcrumbClickableLabel(crumbName, parent);
m_crumbWidget = crumbButton;
connect(crumbButton, SIGNAL(clicked()), this, SLOT(onButtonClicked()));
} else if (crumbWidgetType == CrumbWidgetType::COMBOBOX) {
QComboBox *crumbCB = new QComboBox(parent);
m_crumbWidget = crumbCB;
connect(crumbCB, SIGNAL(currentIndexChanged(int)), this,
SLOT(onComboBoxIndexChanged(int)));
}
}
void Breadcrumb::onButtonClicked() {
TApp *app = TApp::instance();
ToonzScene *scene = app->getCurrentScene()->getScene();
ChildStack *childStack = scene->getChildStack();
if (m_crumbType == CrumbType::CHILD) {
TXsheet *xsh = childStack->getXsheet();
int r = app->getCurrentFrame()->getFrameIndex();
int r0, r1;
xsh->getCellRange(m_col, r0, r1);
if (r1 < r0) r1 = r0;
if (r < r0)
r = r0;
else if (r > r1)
r = r1;
else {
TXshCell cell = xsh->getCell(r, m_col);
while (cell.isEmpty()) cell = xsh->getCell(++r, m_col);
}
app->getCurrentColumn()->setColumnIndex(m_col);
app->getCurrentFrame()->setFrameIndex(r);
app->getCurrentSelection()->getSelection()->selectNone();
QAction *openChildAction =
CommandManager::instance()->getAction(MI_OpenChild);
if (!openChildAction) return;
openChildAction->trigger();
} else if (m_crumbType == CrumbType::ANCESTOR) {
QAction *closeChildAction =
CommandManager::instance()->getAction(MI_CloseChild);
if (!closeChildAction) return;
TUndoManager::manager()->beginBlock();
for (int i = 0; i > m_distanceFromCurrent; i--) closeChildAction->trigger();
TUndoManager::manager()->endBlock();
}
}
void Breadcrumb::onComboBoxIndexChanged(int index) {
if (m_crumbType != CrumbType::CHILD || !index) return;
TApp *app = TApp::instance();
ToonzScene *scene = app->getCurrentScene()->getScene();
ChildStack *childStack = scene->getChildStack();
TXsheet *xsh = childStack->getXsheet();
int col = m_colList[index - 1];
int r = app->getCurrentFrame()->getFrameIndex();
int r0, r1;
xsh->getCellRange(col, r0, r1);
if (r1 < r0) r1 = r0;
if (r < r0)
r = r0;
else if (r > r1)
r = r1;
else {
TXshCell cell = xsh->getCell(r, col);
while (cell.isEmpty()) cell = xsh->getCell(++r, col);
}
app->getCurrentColumn()->setColumnIndex(col);
app->getCurrentFrame()->setFrameIndex(r);
app->getCurrentSelection()->getSelection()->selectNone();
QAction *openChildAction =
CommandManager::instance()->getAction(MI_OpenChild);
if (!openChildAction) return;
openChildAction->trigger();
}
//=============================================================================
// BreadcrumbArea
//-----------------------------------------------------------------------------
BreadcrumbArea::BreadcrumbArea(XsheetViewer *parent, Qt::WindowFlags flags)
: m_viewer(parent) {
setObjectName("cornerWidget");
setFixedHeight(29);
setObjectName("XsheetBreadcrumbs");
m_breadcrumbWidgets.clear();
updateBreadcrumbs();
}
//-----------------------------------------------------------------------------
void BreadcrumbArea::showBreadcrumbs(bool show) {
show ? this->show() : this->hide();
}
//-----------------------------------------------------------------------------
void BreadcrumbArea::toggleBreadcrumbArea() {
bool breadcrumbsEnabled =
Preferences::instance()->isShowXsheetBreadcrumbsEnabled();
Preferences::instance()->setValue(showXsheetBreadcrumbs, !breadcrumbsEnabled);
TApp::instance()->getCurrentScene()->notifyPreferenceChanged(
"XsheetBreadcrumbs");
}
//-----------------------------------------------------------------------------
void BreadcrumbArea::showEvent(QShowEvent *e) {
TApp *app = TApp::instance();
connect(app->getCurrentXsheet(), SIGNAL(xsheetSwitched()), this,
SLOT(updateBreadcrumbs()));
connect(app->getCurrentXsheet(), SIGNAL(xsheetChanged()), this,
SLOT(updateBreadcrumbs()));
updateBreadcrumbs();
}
//-----------------------------------------------------------------------------
void BreadcrumbArea::hideEvent(QHideEvent *e) {
TApp *app = TApp::instance();
disconnect(app->getCurrentXsheet(), SIGNAL(xsheetSwitched()), this,
SLOT(updateBreadcrumbs()));
disconnect(app->getCurrentXsheet(), SIGNAL(xsheetChanged()), this,
SLOT(updateBreadcrumbs()));
}
//-----------------------------------------------------------------------------
void BreadcrumbArea::updateBreadcrumbs() {
if (isHidden()) return;
// Remove the current layout
QLayout *currentLayout = layout();
if (currentLayout) {
QLayoutItem *item;
while ((item = currentLayout->takeAt(0)) != nullptr) {
currentLayout->removeWidget(item->widget());
item->widget()->deleteLater();
}
delete currentLayout;
}
m_breadcrumbWidgets.clear();
// Rebuild the breadcrumb widget list
TApp *app = TApp::instance();
ToonzScene *scene = app->getCurrentScene()->getScene();
ChildStack *childStack = scene->getChildStack();
TXsheet *xsh = childStack->getXsheet();
int ancestorCount = childStack->getAncestorCount();
// Look for any sub-xsheets in current xsheet
std::vector<int> childCol;
for (int col = 0; col < xsh->getColumnCount(); col++) {
if (xsh->isColumnEmpty(col)) continue;
int r0, r1;
xsh->getCellRange(col, r0, r1);
TXshCell cell = xsh->getCell(r0, col);
TXshLevel *xl = cell.m_level.getPointer();
if (!xl) continue;
TXshChildLevel *cl = xl->getChildLevel();
if (!cl) continue;
childCol.push_back(col);
}
QString separator = tr(" > ");
Breadcrumb *crumb;
QString childName;
if (childCol.size() == 1) {
TStageObjectId columnId = TStageObjectId::ColumnId(childCol[0]);
TStageObject *columnObject = xsh->getStageObject(columnId);
childName = QString::fromStdString(columnObject->getName());
crumb = new Breadcrumb(CrumbType::CHILD, childName, CrumbWidgetType::BUTTON,
this);
crumb->setColumnNumber(childCol[0]);
m_breadcrumbWidgets.push_back(crumb);
} else if (childCol.size() > 1) {
crumb =
new Breadcrumb(CrumbType::CHILD, 0, CrumbWidgetType::COMBOBOX, this);
crumb->setColumnNumberList(childCol);
QComboBox *childCB = dynamic_cast<QComboBox *>(crumb->getCrumbWidget());
childCB->blockSignals(true);
childCB->addItem(tr("---"));
for (int i = 0; i < childCol.size(); i++) {
TStageObjectId columnId = TStageObjectId::ColumnId(childCol[i]);
TStageObject *columnObject = xsh->getStageObject(columnId);
childName = QString::fromStdString(columnObject->getName());
childCB->addItem(childName);
}
childCB->blockSignals(false);
m_breadcrumbWidgets.push_back(crumb);
}
if (m_breadcrumbWidgets.size())
m_breadcrumbWidgets.push_back(new Breadcrumb(
CrumbType::SEPARATOR, separator, CrumbWidgetType::LABEL, this));
QString ancestorName;
for (int i = ancestorCount; i > 0; i--) {
AncestorNode *ancestor = childStack->getAncestorInfo(i - 1);
if (!ancestor || !ancestor->m_cl || !ancestor->m_xsheet) break;
TStageObjectId columnId = TStageObjectId::ColumnId(ancestor->m_col);
TStageObject *columnObject = ancestor->m_xsheet->getStageObject(columnId);
ancestorName = QString::fromStdString(columnObject->getName());
// Add label for current xsheet, button for everything else
if (i == ancestorCount)
crumb = new Breadcrumb(CrumbType::ANCESTOR, ancestorName,
CrumbWidgetType::LABEL, this);
else {
crumb = new Breadcrumb(CrumbType::ANCESTOR, ancestorName,
CrumbWidgetType::BUTTON, this);
crumb->setDistanceFromCurrent(i - ancestorCount);
}
m_breadcrumbWidgets.push_back(crumb);
m_breadcrumbWidgets.push_back(new Breadcrumb(
CrumbType::SEPARATOR, separator, CrumbWidgetType::LABEL, this));
}
ancestorName = tr("Main");
if (!ancestorCount)
crumb = new Breadcrumb(CrumbType::ANCESTOR, ancestorName,
CrumbWidgetType::LABEL, this);
else {
crumb = new Breadcrumb(CrumbType::ANCESTOR, ancestorName,
CrumbWidgetType::BUTTON, this);
crumb->setDistanceFromCurrent(-ancestorCount);
}
m_breadcrumbWidgets.push_back(crumb);
// Now let's put everything in a layout
m_breadcrumbLayout = new QHBoxLayout();
m_breadcrumbLayout->setMargin(0);
m_breadcrumbLayout->setSpacing(0);
{
if (!m_viewer->orientation()->isVerticalTimeline())
m_breadcrumbLayout->addSpacing(220);
m_breadcrumbLayout->addWidget(new QLabel(tr("Scene Depth:"), this), 0,
Qt::AlignCenter);
m_breadcrumbLayout->addSpacing(5);
std::vector<Breadcrumb *>::reverse_iterator rit;
for (rit = m_breadcrumbWidgets.rbegin(); rit != m_breadcrumbWidgets.rend();
++rit) {
m_breadcrumbLayout->addWidget((*rit)->getCrumbWidget(), 0,
Qt::AlignCenter);
}
}
m_breadcrumbLayout->addStretch(1);
QHBoxLayout *hLayout = new QHBoxLayout;
hLayout->setMargin(0);
hLayout->setSpacing(0);
setLayout(hLayout);
DvScrollWidget *scrollWidget = new DvScrollWidget;
hLayout->addWidget(scrollWidget);
QWidget *crumbContainer = new QWidget;
scrollWidget->setWidget(crumbContainer);
crumbContainer->setSizePolicy(QSizePolicy::MinimumExpanding,
QSizePolicy::Fixed);
crumbContainer->setFixedHeight(24);
crumbContainer->setLayout(m_breadcrumbLayout);
}
//============================================================
class ToggleXsheetBreadcrumbsCommand final : public MenuItemHandler {
public:
ToggleXsheetBreadcrumbsCommand()
: MenuItemHandler(MI_ToggleXsheetBreadcrumbs) {}
void execute() override { BreadcrumbArea::toggleBreadcrumbArea(); }
} ToggleXsheetBreadcrumbsCommand;
} // namespace XsheetGUI

View file

@ -0,0 +1,97 @@
#pragma once
#ifndef XSHBREADCRUMBS_H
#define XSHBREADCRUMBS_H
#include <QWidget>
#include <QLabel>
#include <QHBoxLayout>
#include "toonz/txsheet.h"
//-----------------------------------------------------------------------------
// forward declaration
class XsheetViewer;
class QAction;
//-----------------------------------------------------------------------------
class BreadcrumbClickableLabel : public QLabel {
Q_OBJECT
public:
BreadcrumbClickableLabel(QString labelName, QWidget *parent = Q_NULLPTR,
Qt::WindowFlags f = Qt::WindowFlags());
~BreadcrumbClickableLabel();
signals:
void clicked();
protected:
void mousePressEvent(QMouseEvent *event);
};
//-----------------------------------------------------------------------------
namespace XsheetGUI {
enum CrumbType { SEPARATOR = 0, CURRENT, ANCESTOR, CHILD };
enum CrumbWidgetType { LABEL = 0, BUTTON, COMBOBOX };
class Breadcrumb : public QWidget {
Q_OBJECT
QWidget *m_crumbWidget;
CrumbType m_crumbType;
int m_col;
std::vector<int> m_colList;
int m_distanceFromCurrent;
public:
Breadcrumb(CrumbType crumbType, QString crumbName,
CrumbWidgetType crumbWidgetType, QWidget *parent);
~Breadcrumb() {}
void setColumnNumber(int col) { m_col = col; }
void setColumnNumberList(std::vector<int> colList) { m_colList = colList; }
void setDistanceFromCurrent(int distance) {
m_distanceFromCurrent = distance;
}
QWidget *getCrumbWidget() { return m_crumbWidget; }
public slots:
void onButtonClicked();
void onComboBoxIndexChanged(int);
};
//=============================================================================
// BreadcrumbArea
//-----------------------------------------------------------------------------
class BreadcrumbArea final : public QFrame {
Q_OBJECT
XsheetViewer *m_viewer;
std::vector<Breadcrumb *> m_breadcrumbWidgets;
QHBoxLayout *m_breadcrumbLayout;
public:
BreadcrumbArea(XsheetViewer *parent = 0,
Qt::WindowFlags flags = Qt::WindowFlags());
static void toggleBreadcrumbArea();
void showBreadcrumbs(bool show);
protected:
void showEvent(QShowEvent *e) override;
void hideEvent(QHideEvent *e) override;
public slots:
void updateBreadcrumbs();
};
} // namespace XsheetGUI
#endif // XSHBREADCRUMBS_H

View file

@ -3224,6 +3224,7 @@ void ColumnArea::contextMenuEvent(QContextMenuEvent *event) {
}
menu.addSeparator();
menu.addAction(cmdManager->getAction(MI_ToggleQuickToolbar));
menu.addAction(cmdManager->getAction(MI_ToggleXsheetBreadcrumbs));
QAction *flipOrientation = new QAction(tr("Toggle Orientation"), this);

View file

@ -57,12 +57,13 @@ TEnv::IntVar FrameDisplayStyleInXsheetRowArea(
namespace XsheetGUI {
//-----------------------------------------------------------------------------
const int ColumnWidth = 74;
const int RowHeight = 20;
const int SCROLLBAR_WIDTH = 16;
const int TOOLBAR_HEIGHT = 29;
const int ZOOM_FACTOR_MAX = 100;
const int ZOOM_FACTOR_MIN = 20;
const int ColumnWidth = 74;
const int RowHeight = 20;
const int SCROLLBAR_WIDTH = 16;
const int TOOLBAR_HEIGHT = 29;
const int BREADCRUMB_HEIGHT = 29;
const int ZOOM_FACTOR_MAX = 100;
const int ZOOM_FACTOR_MIN = 20;
} // namespace XsheetGUI
//=============================================================================
@ -255,6 +256,12 @@ XsheetViewer::XsheetViewer(QWidget *parent, Qt::WindowFlags flags)
m_toolbar = new XsheetGUI::QuickToolbar(this, Qt::WindowFlags(), true);
m_toolbarScrollArea->setWidget(m_toolbar);
m_breadcrumbArea = new XsheetGUI::BreadcrumbArea(this, Qt::WindowFlags());
m_breadcrumbScrollArea = new XsheetScrollArea(this);
m_breadcrumbScrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_breadcrumbScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
m_breadcrumbScrollArea->setWidget(m_breadcrumbArea);
m_noteArea = new XsheetGUI::NoteArea(this);
m_noteScrollArea = new XsheetScrollArea(this);
m_noteScrollArea->setObjectName("xsheetArea");
@ -416,6 +423,31 @@ void XsheetViewer::positionSections() {
}
} else {
m_toolbar->showToolbar(false);
m_toolbarScrollArea->setGeometry(0, 0, 0, 0);
}
if (Preferences::instance()->isShowXsheetBreadcrumbsEnabled()) {
m_breadcrumbArea->showBreadcrumbs(true);
int w = visibleRegion().boundingRect().width();
if (o->isVerticalTimeline())
m_breadcrumbScrollArea->setGeometry(0, headerFrame.from(), w,
XsheetGUI::BREADCRUMB_HEIGHT);
else
m_breadcrumbScrollArea->setGeometry(0, headerLayer.from(), w,
XsheetGUI::BREADCRUMB_HEIGHT);
m_breadcrumbArea->setFixedWidth(w);
if (o->isVerticalTimeline()) {
headerFrame = headerFrame.adjusted(XsheetGUI::BREADCRUMB_HEIGHT,
XsheetGUI::BREADCRUMB_HEIGHT);
bodyFrame = bodyFrame.adjusted(XsheetGUI::BREADCRUMB_HEIGHT, 0);
} else {
headerLayer = headerLayer.adjusted(XsheetGUI::BREADCRUMB_HEIGHT,
XsheetGUI::BREADCRUMB_HEIGHT);
bodyLayer = bodyLayer.adjusted(XsheetGUI::BREADCRUMB_HEIGHT, 0);
}
} else {
m_breadcrumbArea->showBreadcrumbs(false);
m_breadcrumbScrollArea->setGeometry(0, 0, 0, 0);
}
m_noteScrollArea->setGeometry(o->frameLayerRect(headerFrame, headerLayer));
@ -1465,7 +1497,7 @@ void XsheetViewer::onXsheetChanged() {
//-----------------------------------------------------------------------------
void XsheetViewer::onPreferenceChanged(const QString &prefName) {
if (prefName == "QuickToolbar") {
if (prefName == "QuickToolbar" || prefName == "XsheetBreadcrumbs") {
positionSections();
refreshContentSize(0, 0);
} else if (prefName == "XsheetCamera") {

View file

@ -16,6 +16,7 @@
#include "saveloadqsettings.h"
#include "toonzqt/spreadsheetviewer.h"
#include "orientation.h"
#include "xshbreadcrumbs.h"
#include <boost/optional.hpp>
using boost::optional;
@ -581,12 +582,15 @@ class XsheetViewer final : public QFrame, public SaveLoadQSettings {
XsheetScrollArea *m_rowScrollArea;
XsheetScrollArea *m_noteScrollArea;
XsheetScrollArea *m_toolbarScrollArea;
XsheetScrollArea *m_breadcrumbScrollArea;
XsheetGUI::ColumnArea *m_columnArea;
XsheetGUI::RowArea *m_rowArea;
XsheetGUI::CellArea *m_cellArea;
XsheetGUI::NoteArea *m_noteArea;
XsheetGUI::QuickToolbar *m_toolbar;
XsheetGUI::BreadcrumbArea *m_breadcrumbArea;
LayerFooterPanel *m_layerFooterPanel;
Spreadsheet::FrameScroller m_frameScroller;

View file

@ -3,31 +3,10 @@
#include "toonz/childstack.h"
#include "toonz/toonzscene.h"
#include "toonz/txsheet.h"
#include "toonz/txshchildlevel.h"
#include "toonz/txshcell.h"
#include "toonz/txshleveltypes.h"
#include "toonz/scenefx.h"
//=============================================================================
//! The Node class is a container of element necessary to define a sub-xsheet.
/*!
The class contain a pointer to \b TXsheet \b m_xsheet, two integer to
identify column
\b m_col and row \b m_row, a \b TXshChildLevelP \b m_cl and a bool \b
m_justCreated.
*/
class ChildStack::Node {
public:
TXsheet *m_xsheet;
int m_row, m_col;
std::map<int, int> m_rowTable;
TXshChildLevelP m_cl;
bool m_justCreated;
Node()
: m_xsheet(0), m_row(0), m_col(0), m_rowTable(), m_justCreated(false) {}
};
//=============================================================================
// ChildStack
@ -64,7 +43,7 @@ bool ChildStack::openChild(int row, int col) {
childLevel = cell.m_level->getChildLevel();
if (!childLevel) return false;
TXsheet *childXsheet = childLevel->getXsheet();
Node *node = new Node();
AncestorNode *node = new AncestorNode();
node->m_row = row;
node->m_col = col;
node->m_xsheet = m_xsheet;
@ -95,7 +74,7 @@ bool ChildStack::closeChild(int &row, int &col) {
->updateFrameCount(); // non dovrebbe essere necessario, ma non si sa mai
int childFrameCount = childXsh->getFrameCount();
Node *node = m_stack.back();
AncestorNode *node = m_stack.back();
m_stack.pop_back();
TXsheet *parentXsh = node->m_xsheet;
@ -168,7 +147,7 @@ bool ChildStack::getAncestorAffine(TAffine &aff, int row) const {
if (it == m_stack[i]->m_rowTable.end()) break;
row = it->second;
Node *node = m_stack[i];
AncestorNode *node = m_stack[i];
TAffine aff2;
if (!getColumnPlacement(aff2, node->m_xsheet, row, node->m_col, false))
return false;
@ -177,3 +156,11 @@ bool ChildStack::getAncestorAffine(TAffine &aff, int row) const {
}
return true;
}
//-----------------------------------------------------------------------------
AncestorNode *ChildStack::getAncestorInfo(int ancestorDepth) {
if (ancestorDepth < 0 || ancestorDepth >= m_stack.size()) return nullptr;
return m_stack[ancestorDepth];
}

View file

@ -588,6 +588,8 @@ void Preferences::definePreferenceItems() {
define(shortcutCommandsWhileRenamingCellEnabled,
"shortcutCommandsWhileRenamingCellEnabled", QMetaType::Bool, false);
define(showQuickToolbar, "showQuickToolbar", QMetaType::Bool, false);
define(showXsheetBreadcrumbs, "showXsheetBreadcrumbs", QMetaType::Bool,
false);
define(expandFunctionHeader, "expandFunctionHeader", QMetaType::Bool, false);
define(showColumnNumbers, "showColumnNumbers", QMetaType::Bool, false);
define(parentColorsInXsheetColumn, "parentColorsInXsheetColumn",

View file

@ -221,12 +221,17 @@ FunctionViewer::FunctionViewer(QWidget *parent, Qt::WindowFlags flags)
bool toolBarVisible =
Preferences::instance()->isShowQuickToolbarEnabled() &&
Preferences::instance()->isExpandFunctionHeaderEnabled();
bool breadcrumbsVisible =
Preferences::instance()->isShowXsheetBreadcrumbsEnabled() &&
Preferences::instance()->isExpandFunctionHeaderEnabled();
if (QSpacerItem *spacer = m_leftLayout->itemAt(0)->spacerItem()) {
spacer->changeSize(1, m_spacing + ((toolBarVisible) ? 10 : 0),
spacer->changeSize(1, m_spacing + ((toolBarVisible) ? 10 : 0) +
((breadcrumbsVisible) ? 10 : 0),
QSizePolicy::Fixed, QSizePolicy::Fixed);
spacer->invalidate();
} else
m_leftLayout->setSpacing(m_spacing + ((toolBarVisible) ? 30 : 0));
m_leftLayout->setSpacing(m_spacing + ((toolBarVisible) ? 30 : 0) +
((breadcrumbsVisible) ? 10 : 0));
if (m_toggleStart ==
Preferences::FunctionEditorToggle::ShowGraphEditorInPopup) {
m_functionGraph->hide();
@ -511,14 +516,19 @@ void FunctionViewer::toggleMode() {
bool toolBarVisible =
Preferences::instance()->isShowQuickToolbarEnabled() &&
Preferences::instance()->isExpandFunctionHeaderEnabled();
bool breadcrumbsVisible =
Preferences::instance()->isShowXsheetBreadcrumbsEnabled() &&
Preferences::instance()->isExpandFunctionHeaderEnabled();
if (QSpacerItem *spacer = m_leftLayout->itemAt(0)->spacerItem()) {
spacer->changeSize(1, m_spacing + ((toolBarVisible) ? 10 : 0),
spacer->changeSize(1, m_spacing + ((toolBarVisible) ? 10 : 0) +
((breadcrumbsVisible) ? 10 : 0),
QSizePolicy::Fixed, QSizePolicy::Fixed);
spacer->invalidate();
m_numericalColumns->updateHeaderHeight();
m_leftLayout->setSpacing(0);
} else
m_leftLayout->setSpacing(m_spacing + ((toolBarVisible) ? 30 : 0));
m_leftLayout->setSpacing(m_spacing + ((toolBarVisible) ? 30 : 0) +
((breadcrumbsVisible) ? 10 : 0));
updateGeometry();
m_toggleStatus = 0;
} else {
@ -666,7 +676,9 @@ void FunctionViewer::doSwitchCurrentObject(TStageObject *obj) {
//-----------------------------------------------------------------------------
void FunctionViewer::onPreferenceChanged(const QString &prefName) {
if (prefName != "XSheetToolbar" && !prefName.isEmpty()) return;
if (prefName != "QuickToolbar" && prefName != "XsheetBreadcrumbs" &&
!prefName.isEmpty())
return;
if (!Preferences::instance()->isExpandFunctionHeaderEnabled()) return;
if (m_toggleStart ==
Preferences::FunctionEditorToggle::ShowFunctionSpreadsheetInPopup)
@ -689,16 +701,21 @@ void FunctionViewer::onPreferenceChanged(const QString &prefName) {
bool toolBarVisible =
Preferences::instance()->isShowQuickToolbarEnabled() &&
Preferences::instance()->isExpandFunctionHeaderEnabled();
bool breadcrumbsVisible =
Preferences::instance()->isShowXsheetBreadcrumbsEnabled() &&
Preferences::instance()->isExpandFunctionHeaderEnabled();
m_functionGraph->hide();
m_numericalColumns->show();
if (QSpacerItem *spacer = m_leftLayout->itemAt(0)->spacerItem()) {
spacer->changeSize(1, m_spacing + ((toolBarVisible) ? 10 : 0),
spacer->changeSize(1, m_spacing + ((toolBarVisible) ? 10 : 0) +
((breadcrumbsVisible) ? 10 : 0),
QSizePolicy::Fixed, QSizePolicy::Fixed);
spacer->invalidate();
m_numericalColumns->updateHeaderHeight();
m_leftLayout->setSpacing(0);
} else
m_leftLayout->setSpacing(m_spacing + ((toolBarVisible) ? 30 : 0));
m_leftLayout->setSpacing(m_spacing + ((toolBarVisible) ? 30 : 0) +
((breadcrumbsVisible) ? 30 : 0));
updateGeometry();
}