]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
If we are in a closeEvent, we don't want to close all buffers, because these may...
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index 159054cd9b8b554a76b846e9de9b0c321c0635ce..9add9ed43ed23effb06d249df7339cbb9db74f26 100644 (file)
@@ -111,7 +111,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 +130,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 +167,40 @@ 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);
+
+       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);
+       }
 }
 
 
@@ -187,6 +244,7 @@ void TocWidget::on_sortCB_stateChanged(int state)
        updateView();
 }
 
+
 void TocWidget::on_persistentCB_stateChanged(int state)
 {
        persistent_ = state == Qt::Checked;
@@ -337,6 +395,13 @@ 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()) {
@@ -351,7 +416,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,9 +431,11 @@ 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_);