]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
rename buffer parameter math_number_before to math_numbering_side
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index bb15f31e2b71bf9ca7dca027c130aa4267856c0f..b96a7c644cfc97e657066f6823c51f02e4ddc852 100644 (file)
 
 #include <QHeaderView>
 #include <QMenu>
-#include <QTimer>
 
 #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), update_delay_(0)
-
+       : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view),
+         timer_(new QTimer(this))
 {
        setupUi(this);
 
@@ -58,6 +55,13 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
        moveDownTB->setIcon(QIcon(getPixmap("images/", "outline-down", "svgz,png")));
        updateTB->setIcon(QIcon(getPixmap("images/", "reload", "svgz,png")));
 
+       QSize icon_size = gui_view.iconSize();
+       moveOutTB->setIconSize(icon_size);
+       moveInTB->setIconSize(icon_size);
+       moveUpTB->setIconSize(icon_size);
+       moveDownTB->setIconSize(icon_size);
+       updateTB->setIconSize(icon_size);
+
        // avoid flickering
        tocTV->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
 
@@ -86,9 +90,13 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
                this, SLOT(showContextMenu(const QPoint &)));
        connect(tocTV, SIGNAL(customContextMenuRequested(const QPoint &)),
                this, SLOT(showContextMenu(const QPoint &)));
-       connect(filterLE, SIGNAL(textEdited(QString)), 
+       connect(filterLE, SIGNAL(textEdited(QString)),
                this, SLOT(filterContents()));
 
+       // setting the update timer
+       timer_->setSingleShot(true);
+       connect(timer_, SIGNAL(timeout()), this, SLOT(finishUpdateView()));
+
        init(QString());
 }
 
@@ -98,7 +106,7 @@ void TocWidget::showContextMenu(const QPoint & pos)
        std::string name = "context-toc-" + fromqstr(current_type_);
        QMenu * menu = guiApp->menus().menu(toqstr(name), gui_view_);
        if (!menu)
-               return; 
+               return;
        menu->exec(mapToGlobal(pos));
 }
 
@@ -109,9 +117,9 @@ Inset * TocWidget::itemInset() const
        TocItem const & item =
                gui_view_.tocModels().currentItem(current_type_, index);
        DocIterator const & dit = item.dit();
-       
+
        Inset * inset = 0;
-       if (current_type_ == "label" 
+       if (current_type_ == "label"
                  || current_type_ == "graphics"
                  || current_type_ == "citation"
                  || current_type_ == "child")
@@ -120,7 +128,7 @@ Inset * TocWidget::itemInset() const
        else if (current_type_ == "branch"
                         || current_type_ == "index"
                         || current_type_ == "change"
-                        || current_type_ == "table" 
+                        || current_type_ == "table"
                     || current_type_ == "listing"
                     || current_type_ == "figure")
                inset = &dit.inset();
@@ -148,7 +156,7 @@ bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd,
        case LFUN_OUTLINE_IN:
        case LFUN_OUTLINE_OUT:
        case LFUN_SECTION_SELECT:
-               status.setEnabled(item.dit() != 0);
+               status.setEnabled((bool)item.dit());
                return true;
 
        case LFUN_LABEL_COPY_AS_REFERENCE: {
@@ -231,6 +239,7 @@ void TocWidget::on_tocTV_pressed(QModelIndex const & index)
        if (button & Qt::LeftButton) {
                goTo(index);
                gui_view_.setFocus();
+               gui_view_.activateWindow();
        }
 }
 
@@ -256,7 +265,7 @@ void TocWidget::on_updateTB_clicked()
 void TocWidget::on_sortCB_stateChanged(int state)
 {
        gui_view_.tocModels().sort(current_type_, state == Qt::Checked);
-       updateViewForce();
+       updateViewNow();
 }
 
 
@@ -308,7 +317,7 @@ void TocWidget::on_typeCO_currentIndexChanged(int index)
        if (index == -1)
                return;
        current_type_ = typeCO->itemData(index).toString();
-       updateViewForce();
+       updateViewNow();
        if (typeCO->hasFocus())
                gui_view_.setFocus();
 }
@@ -380,27 +389,6 @@ 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);
@@ -411,11 +399,11 @@ void TocWidget::updateViewForce()
        setEnabled(true);
        bool const is_sortable = isSortable();
        sortCB->setEnabled(is_sortable);
-       bool focus_ = tocTV->hasFocus();
+       bool focus = tocTV->hasFocus();
        tocTV->setEnabled(false);
        tocTV->setUpdatesEnabled(false);
 
-       QAbstractItemModel * toc_model = 
+       QAbstractItemModel * toc_model =
                        gui_view_.tocModels().model(current_type_);
        if (tocTV->model() != toc_model) {
                tocTV->setModel(toc_model);
@@ -429,8 +417,7 @@ void TocWidget::updateViewForce()
                && gui_view_.tocModels().isSorted(current_type_));
        sortCB->blockSignals(false);
 
-       bool const can_navigate_ = canNavigate();
-       persistentCB->setEnabled(can_navigate_);
+       persistentCB->setEnabled(canNavigate());
 
        bool controls_enabled = toc_model && toc_model->rowCount() > 0
                && !gui_view_.documentBufferView()->buffer().isReadonly();
@@ -438,17 +425,44 @@ void TocWidget::updateViewForce()
 
        depthSL->setMaximum(gui_view_.tocModels().depth(current_type_));
        depthSL->setValue(depth_);
-       if (!persistent_ && can_navigate_)
-               setTreeDepth(depth_);
-       if (can_navigate_) {
-               persistentCB->setChecked(persistent_);
-               select(gui_view_.tocModels().currentIndex(current_type_));
-       }
-       filterContents();
        tocTV->setEnabled(true);
        tocTV->setUpdatesEnabled(true);
-       if (focus_)
+       if (focus)
                tocTV->setFocus();
+
+       // Expensive operations are on a timer.  We finish the update immediately
+       // for sparse edition actions, i.e. there was no edition/cursor movement
+       // recently, then every 300ms.
+       if (!timer_->isActive()) {
+               finishUpdateView();
+               timer_->start(300);
+       }
+}
+
+
+void TocWidget::updateViewNow()
+{
+       timer_->stop();
+       updateView();
+}
+
+
+void TocWidget::finishUpdateView()
+{
+       // Profiling shows that this is the expensive stuff in the context of typing
+       // text and moving with arrows. For bigger operations, this is negligible,
+       // and outweighted by TocModels::reset() anyway.
+       if (canNavigate()) {
+               if (!persistent_)
+                       setTreeDepth(depth_);
+               persistentCB->setChecked(persistent_);
+               // select the item at current cursor location
+               if (gui_view_.documentBufferView()) {
+                       DocIterator const & dit = gui_view_.documentBufferView()->cursor();
+                       select(gui_view_.tocModels().currentIndex(current_type_, dit));
+               }
+       }
+       filterContents();
 }
 
 
@@ -470,7 +484,7 @@ void TocWidget::filterContents()
                                filterLE->text(), Qt::CaseInsensitive);
                tocTV->setRowHidden(index.row(), index.parent(), !matches);
        }
-       // recursively unhide parents of unhidden children 
+       // recursively unhide parents of unhidden children
        for (int i = size - 1; i >= 0; i--) {
                QModelIndex index = indices[i];
                if (!tocTV->isRowHidden(index.row(), index.parent())
@@ -520,9 +534,7 @@ 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;
+       updateViewNow();
 }
 
 } // namespace frontend