X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FTocWidget.cpp;h=538c04c177cb894dd2f4045301e7db29fb640087;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=159054cd9b8b554a76b846e9de9b0c321c0635ce;hpb=61e32e1c2526b696775f6d677f2136d26342dd2f;p=lyx.git diff --git a/src/frontends/qt4/TocWidget.cpp b/src/frontends/qt4/TocWidget.cpp index 159054cd9b..538c04c177 100644 --- a/src/frontends/qt4/TocWidget.cpp +++ b/src/frontends/qt4/TocWidget.cpp @@ -19,6 +19,7 @@ #include "TocModel.h" #include "Buffer.h" +#include "BufferView.h" #include "CutAndPaste.h" #include "FuncRequest.h" #include "FuncStatus.h" @@ -111,7 +112,8 @@ Inset * TocWidget::itemInset() const inset = dit.nextInset(); else if (current_type_ == "branch" - || current_type_ == "index") + || current_type_ == "index" + || current_type_ == "change") inset = &dit.inset(); else if (current_type_ == "table" @@ -129,10 +131,36 @@ bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd, FuncStatus & status) const { Inset * inset = itemInset(); - FuncRequest tmpcmd(cmd); - if (inset) - return inset->getStatus(cur, tmpcmd, status); + + QModelIndex const & index = tocTV->currentIndex(); + TocItem const & item = + gui_view_.tocModels().currentItem(current_type_, index); + + switch (cmd.action) + { + case LFUN_CHANGE_ACCEPT: + case LFUN_CHANGE_REJECT: + case LFUN_OUTLINE_UP: + case LFUN_OUTLINE_DOWN: + case LFUN_OUTLINE_IN: + case LFUN_OUTLINE_OUT: + case LFUN_SECTION_SELECT: + status.setEnabled(true); + return true; + + case LFUN_LABEL_COPY_AS_REF: { + // For labels in math, we need to supply the label as a string + FuncRequest label_copy(LFUN_LABEL_COPY_AS_REF, item.asString()); + if (inset) + return inset->getStatus(cur, label_copy, status); + } + + default: + if (inset) + return inset->getStatus(cur, tmpcmd, status); + } + return false; } @@ -140,10 +168,44 @@ bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd, void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd) { Inset * inset = itemInset(); - FuncRequest tmpcmd(cmd); - if (inset) - inset->dispatch(cur, tmpcmd); + + QModelIndex const & index = tocTV->currentIndex(); + TocItem const & item = + gui_view_.tocModels().currentItem(current_type_, index); + + // Start an undo group. + cur.beginUndoGroup(); + + switch (cmd.action) + { + case LFUN_CHANGE_ACCEPT: + case LFUN_CHANGE_REJECT: + case LFUN_SECTION_SELECT: + dispatch(item.action()); + cur.dispatch(tmpcmd); + break; + + case LFUN_LABEL_COPY_AS_REF: { + // For labels in math, we need to supply the label as a string + FuncRequest label_copy(LFUN_LABEL_COPY_AS_REF, item.asString()); + if (inset) + inset->dispatch(cur, label_copy); + break; + } + + case LFUN_OUTLINE_UP: + case LFUN_OUTLINE_DOWN: + case LFUN_OUTLINE_IN: + case LFUN_OUTLINE_OUT: + outline(cmd.action); + break; + + default: + if (inset) + inset->dispatch(cur, tmpcmd); + } + cur.endUndoGroup(); } @@ -187,6 +249,7 @@ void TocWidget::on_sortCB_stateChanged(int state) updateView(); } + void TocWidget::on_persistentCB_stateChanged(int state) { persistent_ = state == Qt::Checked; @@ -337,9 +400,16 @@ static bool canNavigate(QString const & type) } +/// Test whether sorting is possible +static bool isSortable(QString const & type) +{ + return type != "tableofcontents"; +} + + void TocWidget::updateView() { - if (!gui_view_.view()) { + if (!gui_view_.documentBufferView()) { enableControls(false); typeCO->setEnabled(false); tocTV->setModel(0); @@ -351,7 +421,7 @@ void TocWidget::updateView() depthSL->setEnabled(false); return; } - sortCB->setEnabled(true); + sortCB->setEnabled(isSortable(current_type_)); depthSL->setEnabled(true); typeCO->setEnabled(true); tocTV->setEnabled(false); @@ -366,14 +436,16 @@ void TocWidget::updateView() } sortCB->blockSignals(true); - sortCB->setChecked(gui_view_.tocModels().isSorted(current_type_)); + sortCB->setChecked(isSortable(current_type_) + && gui_view_.tocModels().isSorted(current_type_)); sortCB->blockSignals(false); + bool const can_navigate_ = canNavigate(current_type_); persistentCB->setEnabled(can_navigate_); bool controls_enabled = toc_model && toc_model->rowCount() > 0 - && !gui_view_.buffer()->isReadonly(); + && !gui_view_.documentBufferView()->buffer().isReadonly(); enableControls(controls_enabled); depthSL->setMaximum(gui_view_.tocModels().depth(current_type_));