X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Ffrontends%2Fqt4%2FTocWidget.cpp;h=538c04c177cb894dd2f4045301e7db29fb640087;hb=425d092204118ea6c24c28e85fdf03fcf2bb51a4;hp=688c7fe74a06ce26554e48474b125b753511c000;hpb=49fb2980eb480ba519457de1080b96e4f91da982;p=lyx.git diff --git a/src/frontends/qt4/TocWidget.cpp b/src/frontends/qt4/TocWidget.cpp index 688c7fe74a..538c04c177 100644 --- a/src/frontends/qt4/TocWidget.cpp +++ b/src/frontends/qt4/TocWidget.cpp @@ -19,8 +19,10 @@ #include "TocModel.h" #include "Buffer.h" +#include "BufferView.h" #include "CutAndPaste.h" #include "FuncRequest.h" +#include "FuncStatus.h" #include "LyXFunc.h" #include "Menus.h" #include "TocBackend.h" @@ -95,32 +97,115 @@ void TocWidget::showContextMenu(const QPoint & pos) } -void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd) +Inset * TocWidget::itemInset() const { - switch(cmd.action) { + QModelIndex const & index = tocTV->currentIndex(); + TocItem const & item = + gui_view_.tocModels().currentItem(current_type_, index); + DocIterator const & dit = item.dit(); - case LFUN_COPY_LABEL_AS_REF: - case LFUN_INSERT_LABEL_AS_REF: { - QModelIndex index = tocTV->currentIndex(); - TocItem const & item = - gui_view_.tocModels().currentItem(current_type_, index); - if (!item.str().empty()) { - InsetCommandParams p(REF_CODE, "ref"); - p["reference"] = item.str(); - if (cmd.action == LFUN_COPY_LABEL_AS_REF) { - cap::clearSelection(); - cap::copyInset(cur, new InsetRef(*cur.buffer(), p), item.str()); - } else { - string const data = InsetCommand::params2string("ref", p); - dispatch(FuncRequest(LFUN_INSET_INSERT, data)); - } - } - break; + Inset * inset = 0; + if (current_type_ == "label" + || current_type_ == "graphics" + || current_type_ == "citation" + || current_type_ == "child") + inset = dit.nextInset(); + + else if (current_type_ == "branch" + || current_type_ == "index" + || current_type_ == "change") + inset = &dit.inset(); + + else if (current_type_ == "table" + || current_type_ == "listing" + || current_type_ == "figure") { + DocIterator tmp_dit(dit); + tmp_dit.pop_back(); + inset = &tmp_dit.inset(); + } + return inset; +} + + +bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd, + FuncStatus & status) const +{ + Inset * inset = itemInset(); + FuncRequest tmpcmd(cmd); + + 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; +} + + +void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd) +{ + Inset * inset = itemInset(); + FuncRequest tmpcmd(cmd); + + 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(); } @@ -164,6 +249,7 @@ void TocWidget::on_sortCB_stateChanged(int state) updateView(); } + void TocWidget::on_persistentCB_stateChanged(int state) { persistent_ = state == Qt::Checked; @@ -282,7 +368,7 @@ void TocWidget::select(QModelIndex const & index) } -/// Test if outlining operation is possible +/// Test whether outlining operation is possible static bool canOutline(QString const & type) { return type == "tableofcontents"; @@ -300,33 +386,43 @@ void TocWidget::enableControls(bool enable) moveDownTB->setEnabled(enable); moveInTB->setEnabled(enable); moveOutTB->setEnabled(enable); - if (!enable) { - depthSL->setMaximum(0); - depthSL->setValue(0); - } } -/// Test if synchronized navigation is possible +/// Test whether synchronized navigation is possible static bool canNavigate(QString const & type) { - // It is not possible to have synchronous navigation in a correctl - // and efficient way with the label type because Toc::item() do a linear - // seatch. Even if fixed, it might even not be desirable to do so if we - // want to support drag&drop of labels and references. + // It is not possible to have synchronous navigation in a correct + // and efficient way with the label and change type because Toc::item() + // does a linear search. Even when fixed, it might even not be desirable + // to do so if we want to support drag&drop of labels and references. return type != "label" && type != "change"; } +/// 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); tocTV->setEnabled(false); + depthSL->setMaximum(0); + depthSL->setValue(0); + persistentCB->setEnabled(false); + sortCB->setEnabled(false); + depthSL->setEnabled(false); return; } + sortCB->setEnabled(isSortable(current_type_)); + depthSL->setEnabled(true); typeCO->setEnabled(true); tocTV->setEnabled(false); tocTV->setUpdatesEnabled(false); @@ -340,21 +436,26 @@ 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); - persistentCB->setChecked(persistent_); + + 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_)); depthSL->setValue(depth_); - if (!persistent_) + if (!persistent_ && can_navigate_) setTreeDepth(depth_); - if (canNavigate(current_type_)) + if (can_navigate_) { + persistentCB->setChecked(persistent_); select(gui_view_.tocModels().currentIndex(current_type_)); + } tocTV->setEnabled(true); tocTV->setUpdatesEnabled(true); }