]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
On Linux show in crash message box the backtrace
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index be4c9c7696adc5cda0af02bb524bb7c660bdfc9b..83ac1bf12c2e3202860a463c951372dd4a3da701 100644 (file)
 
 #include <vector>
 
+#define DELAY_UPDATE_VIEW
+
 using namespace std;
 
 namespace lyx {
 namespace frontend {
 
 TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
-       : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view)
+       : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view), update_delay_(0)
+
 {
        setupUi(this);
 
@@ -149,12 +152,12 @@ bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_OUTLINE_IN:
        case LFUN_OUTLINE_OUT:
        case LFUN_SECTION_SELECT:
-               status.setEnabled(true);
+               status.setEnabled(item.dit() != 0);
                return true;
 
-       case LFUN_LABEL_COPY_AS_REF: {
+       case LFUN_LABEL_COPY_AS_REFERENCE: {
                // For labels in math, we need to supply the label as a string
-               FuncRequest label_copy(LFUN_LABEL_COPY_AS_REF, item.asString());
+               FuncRequest label_copy(LFUN_LABEL_COPY_AS_REFERENCE, item.asString());
                if (inset)
                        return inset->getStatus(cur, label_copy, status);
        }
@@ -184,19 +187,26 @@ void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd)
        {
        case LFUN_CHANGE_ACCEPT:
        case LFUN_CHANGE_REJECT:
+               dispatch(item.action());
+               cur.dispatch(tmpcmd);
+               break;
+
        case LFUN_SECTION_SELECT:
                dispatch(item.action());
                cur.dispatch(tmpcmd);
+               // necessary to get the selection drawn.
+               cur.buffer()->changed(true);
+               gui_view_.setFocus();
                break;
 
-       case LFUN_LABEL_COPY_AS_REF: {
+       case LFUN_LABEL_COPY_AS_REFERENCE: {
                // For labels in math, we need to supply the label as a string
-               FuncRequest label_copy(LFUN_LABEL_COPY_AS_REF, item.asString());
+               FuncRequest label_copy(LFUN_LABEL_COPY_AS_REFERENCE, item.asString());
                if (inset)
                        inset->dispatch(cur, label_copy);
                break;
        }
-       
+
        case LFUN_OUTLINE_UP:
        case LFUN_OUTLINE_DOWN:
        case LFUN_OUTLINE_IN:
@@ -242,14 +252,14 @@ void TocWidget::on_updateTB_clicked()
        // The backend update can take some time so we disable
        // the controls while waiting.
        enableControls(false);
-       gui_view_.tocModels().updateBackend();
+       gui_view_.currentBufferView()->buffer().updateBuffer();
 }
 
 
 void TocWidget::on_sortCB_stateChanged(int state)
 {
        gui_view_.tocModels().sort(current_type_, state == Qt::Checked);
-       updateView();
+       updateViewForce();
 }
 
 
@@ -259,6 +269,7 @@ void TocWidget::on_persistentCB_stateChanged(int state)
 }
 
 
+#if 0
 /* FIXME (Ugras 17/11/06):
 I have implemented a indexDepth function to get the model indices. In my
 opinion, somebody should derive a new qvariant class for tocModelItem
@@ -271,7 +282,7 @@ static int indexDepth(QModelIndex const & index, int depth = -1)
        return index.parent() == QModelIndex()
                ? depth : indexDepth(index.parent(), depth);
 }
-
+#endif
 
 void TocWidget::on_depthSL_valueChanged(int depth)
 {
@@ -288,27 +299,10 @@ void TocWidget::setTreeDepth(int depth)
        if (!tocTV->model())
                return;
 
-#if QT_VERSION >= 0x040300
-       // this should be faster than our own code below
        if (depth == 0)
                tocTV->collapseAll();
        else
                tocTV->expandToDepth(depth - 1);
-#else
-       // expanding and then collapsing is probably better,
-       // but my qt 4.1.2 doesn't have expandAll()..
-       //tocTV->expandAll();
-       QModelIndexList indices = tocTV->model()->match(
-               tocTV->model()->index(0, 0),
-               Qt::DisplayRole, "*", -1,
-               Qt::MatchFlags(Qt::MatchWildcard|Qt::MatchRecursive));
-
-       int size = indices.size();
-       for (int i = 0; i < size; i++) {
-               QModelIndex index = indices[i];
-               tocTV->setExpanded(index, indexDepth(index) < depth_);
-       }
-#endif
 }
 
 
@@ -317,7 +311,7 @@ void TocWidget::on_typeCO_currentIndexChanged(int index)
        if (index == -1)
                return;
        current_type_ = typeCO->itemData(index).toString();
-       updateView();
+       updateViewForce();
        if (typeCO->hasFocus())
                gui_view_.setFocus();
 }
@@ -389,6 +383,27 @@ void TocWidget::enableControls(bool enable)
 
 void TocWidget::updateView()
 {
+// Enable if you dont want the delaying business, cf #7138.
+#ifndef DELAY_UPDATE_VIEW
+       updateViewForce();
+       return;
+#endif
+       // already scheduled?
+       if (update_delay_ == -1)
+               return;
+       QTimer::singleShot(update_delay_, this, SLOT(updateViewForce()));
+       // Subtler optimization for having the delay more UI invisible.
+       // We trigger update immediately for sparse editation actions,
+       // i.e. there was no editation/cursor movement in last 2 sec.
+       // At worst there will be +1 redraw after 2s in a such "calm" mode.
+       if (update_delay_ != 0)
+               updateViewForce();
+       update_delay_ = -1;
+}
+
+void TocWidget::updateViewForce()
+{
+       update_delay_ = 2000;
        if (!gui_view_.documentBufferView()) {
                tocTV->setModel(0);
                depthSL->setMaximum(0);
@@ -472,9 +487,11 @@ void TocWidget::filterContents()
 static QString decodeType(QString const & str)
 {
        QString type = str;
-       if (type.contains("tableofcontents")) {
+       if (type.contains("tableofcontents"))
                type = "tableofcontents";
-       } else if (type.contains("floatlist")) {
+       else if (type.contains("lstlistoflistings"))
+               type = "listing";
+       else if (type.contains("floatlist")) {
                if (type.contains("\"figure"))
                        type = "figure";
                else if (type.contains("\"table"))
@@ -495,7 +512,7 @@ void TocWidget::init(QString const & str)
                new_index = typeCO->findData(decodeType(str));
 
        // If everything else fails, settle on the table of contents which is
-       // guaranted to exist.
+       // guaranteed to exist.
        if (new_index == -1) {
                current_type_ = "tableofcontents";
                new_index = typeCO->findData(current_type_);
@@ -506,6 +523,9 @@ void TocWidget::init(QString const & str)
        typeCO->blockSignals(true);
        typeCO->setCurrentIndex(new_index);
        typeCO->blockSignals(false);
+
+       // no delay when the whole outliner is reseted.
+       update_delay_ = 0;
 }
 
 } // namespace frontend