]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
QDialogButtonBox for the remaining dialogs.
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index ff929c08f73b388ae5428645f6f16cde6d615f70..dcd9c4d0e50420b61595f859bb3ec86773ff4640 100644 (file)
@@ -45,8 +45,7 @@ namespace frontend {
 
 TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
        : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view),
-         update_timer_short_(new QTimer(this)),
-         update_timer_long_(new QTimer(this))
+         timer_(new QTimer(this))
 {
        setupUi(this);
 
@@ -56,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);
 
@@ -88,21 +94,8 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
                this, SLOT(filterContents()));
 
        // setting the update timer
-       update_timer_short_->setSingleShot(true);
-       update_timer_long_->setSingleShot(true);
-       update_timer_short_->setInterval(0);
-       update_timer_long_->setInterval(2000);
-       connect(update_timer_short_, SIGNAL(timeout()),
-               this, SLOT(realUpdateView()));
-       connect(update_timer_long_, SIGNAL(timeout()),
-               this, SLOT(realUpdateView()));
-
-       // fix #9826: Outline disclosure of subsection content disappears one second
-       // after doubleclicking content item.
-       // This is only meant as a workaround. See #6675 for more general issues
-       // regarding unwanted collapse of the tree view.
-       connect(tocTV, SIGNAL(expanded(const QModelIndex &)),
-               update_timer_long_, SLOT(stop()));
+       timer_->setSingleShot(true);
+       connect(timer_, SIGNAL(timeout()), this, SLOT(finishUpdateView()));
 
        init(QString());
 }
@@ -163,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: {
@@ -185,6 +178,7 @@ bool TocWidget::getStatus(Cursor & cur, FuncRequest const & cmd,
 
 void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd)
 {
+
        Inset * inset = itemInset();
        FuncRequest tmpcmd(cmd);
 
@@ -242,10 +236,12 @@ void TocWidget::on_tocTV_activated(QModelIndex const & index)
 
 void TocWidget::on_tocTV_pressed(QModelIndex const & index)
 {
+
        Qt::MouseButtons const button = QApplication::mouseButtons();
        if (button & Qt::LeftButton) {
                goTo(index);
                gui_view_.setFocus();
+               gui_view_.activateWindow();
        }
 }
 
@@ -255,7 +251,7 @@ void TocWidget::goTo(QModelIndex const & index)
        LYXERR(Debug::GUI, "goto " << index.row()
                << ", " << index.column());
 
-       gui_view_.tocModels().goTo(current_type_, index);
+       sendDispatch(gui_view_.tocModels().goTo(current_type_, index));
 }
 
 
@@ -320,6 +316,7 @@ void TocWidget::setTreeDepth(int depth)
 
 void TocWidget::on_typeCO_currentIndexChanged(int index)
 {
+
        if (index == -1)
                return;
        current_type_ = typeCO->itemData(index).toString();
@@ -334,14 +331,29 @@ void TocWidget::outline(FuncCode func_code)
        QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
        if (list.isEmpty())
                return;
+
+       //if another window is active, this attempt will fail,
+       //but it will work at least for the second attempt
+       gui_view_.activateWindow(); 
+
        enableControls(false);
        goTo(list[0]);
-       dispatch(FuncRequest(func_code));
+       sendDispatch(FuncRequest(func_code));
        enableControls(true);
        gui_view_.setFocus();
 }
 
 
+void TocWidget::sendDispatch(FuncRequest fr)
+{
+
+       fr.setViewOrigin(&gui_view_);
+       DispatchResult dr=dispatch(fr);
+       if (dr.error())
+               gui_view_.message(dr.message());
+}
+
+
 void TocWidget::on_moveUpTB_clicked()
 {
        outline(LFUN_OUTLINE_UP);
@@ -394,26 +406,6 @@ void TocWidget::enableControls(bool enable)
 
 
 void TocWidget::updateView()
-{
-       // 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_timer_long_->isActive())
-               update_timer_short_->start();
-       // resets the timer to trigger after 2s
-       update_timer_long_->start();
-}
-
-
-void TocWidget::updateViewNow()
-{
-       update_timer_long_->stop();
-       update_timer_short_->start();
-}
-
-
-void TocWidget::realUpdateView()
 {
        if (!gui_view_.documentBufferView()) {
                tocTV->setModel(0);
@@ -425,7 +417,7 @@ void TocWidget::realUpdateView()
        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);
 
@@ -443,8 +435,7 @@ void TocWidget::realUpdateView()
                && 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();
@@ -452,25 +443,44 @@ void TocWidget::realUpdateView()
 
        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::checkModelChanged()
+void TocWidget::updateViewNow()
 {
-       if (!gui_view_.documentBufferView() ||
-           gui_view_.tocModels().model(current_type_) != tocTV->model())
-               realUpdateView();
+       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();
 }
 
 
@@ -542,6 +552,7 @@ void TocWidget::init(QString const & str)
        typeCO->blockSignals(true);
        typeCO->setCurrentIndex(new_index);
        typeCO->blockSignals(false);
+       updateViewNow();
 }
 
 } // namespace frontend