]> git.lyx.org Git - lyx.git/blobdiff - src/frontends/qt4/TocWidget.cpp
TOC context menu (part 4)
[lyx.git] / src / frontends / qt4 / TocWidget.cpp
index 1667091ffd1adbe485712260dc3d80190ae0ed70..57b0282d1342052e6b7a0682c121f08309af50bd 100644 (file)
 
 #include "TocWidget.h"
 
+#include "GuiApplication.h"
 #include "GuiView.h"
 #include "qt_helpers.h"
 #include "TocModel.h"
 
 #include "Buffer.h"
+#include "CutAndPaste.h"
 #include "FuncRequest.h"
 #include "LyXFunc.h"
+#include "Menus.h"
+#include "TocBackend.h"
+
+#include "insets/InsetCommand.h"
+#include "insets/InsetRef.h"
 
 #include "support/debug.h"
 #include "support/lassert.h"
 
 #include <QHeaderView>
+#include <QMenu>
 #include <QTimer>
 
 #include <vector>
@@ -35,15 +43,15 @@ namespace lyx {
 namespace frontend {
 
 TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
-       : QWidget(parent), depth_(0), gui_view_(gui_view)
+       : QWidget(parent), depth_(0), persistent_(false), gui_view_(gui_view)
 {
        setupUi(this);
 
-       moveOutTB->setIcon(QIcon(":/images/promote.png"));
-       moveInTB->setIcon(QIcon(":/images/demote.png"));
-       moveUpTB->setIcon(QIcon(":/images/up.png"));
-       moveDownTB->setIcon(QIcon(":/images/down.png"));
-       updateTB->setIcon(QIcon(":/images/reload.png"));
+       moveOutTB->setIcon(QIcon(getPixmap("images/", "promote", "png")));
+       moveInTB->setIcon(QIcon(getPixmap("images/", "demote", "png")));
+       moveUpTB->setIcon(QIcon(getPixmap("images/", "up", "png")));
+       moveDownTB->setIcon(QIcon(getPixmap("images/", "down", "png")));
+       updateTB->setIcon(QIcon(getPixmap("images/", "reload", "png")));
 
        // avoid flickering
        tocTV->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
@@ -65,6 +73,41 @@ TocWidget::TocWidget(GuiView & gui_view, QWidget * parent)
        // Make sure the buttons are disabled when first shown without a loaded
        // Buffer.
        enableControls(false);
+
+       // make us responsible for the context menu of the tabbar
+       setContextMenuPolicy(Qt::CustomContextMenu);
+       connect(this, SIGNAL(customContextMenuRequested(const QPoint &)),
+               this, SLOT(showContextMenu(const QPoint &)));
+       connect(tocTV, SIGNAL(customContextMenuRequested(const QPoint &)),
+               this, SLOT(showContextMenu(const QPoint &)));
+
+       init(QString());
+}
+
+
+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; 
+       menu->exec(mapToGlobal(pos));
+}
+
+
+void TocWidget::doDispatch(Cursor & cur, FuncRequest const & cmd)
+{
+       QModelIndex const & index = tocTV->currentIndex();
+       TocItem const & item =
+               gui_view_.tocModels().currentItem(current_type_, index);
+       DocIterator const & dit = item.dit();
+       
+       Inset * inset = 0;
+       if (current_type_ == "label")
+               inset = dit.nextInset();
+
+       if (inset)
+               inset->dispatch(cur, FuncRequest(cmd));
 }
 
 
@@ -74,10 +117,13 @@ void TocWidget::on_tocTV_activated(QModelIndex const & index)
 }
 
 
-void TocWidget::on_tocTV_clicked(QModelIndex const & index)
+void TocWidget::on_tocTV_pressed(QModelIndex const & index)
 {
-       goTo(index);
-       gui_view_.setFocus();
+       Qt::MouseButtons const button = QApplication::mouseButtons();
+       if (button & Qt::LeftButton) {
+               goTo(index);
+               gui_view_.setFocus();
+       }
 }
 
 
@@ -105,6 +151,12 @@ void TocWidget::on_sortCB_stateChanged(int state)
        updateView();
 }
 
+void TocWidget::on_persistentCB_stateChanged(int state)
+{
+       persistent_ = state == Qt::Checked;
+}
+
+
 /* 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
@@ -134,6 +186,13 @@ 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();
@@ -147,6 +206,7 @@ void TocWidget::setTreeDepth(int depth)
                QModelIndex index = indices[i];
                tocTV->setExpanded(index, indexDepth(index) < depth_);
        }
+#endif
 }
 
 
@@ -219,7 +279,6 @@ static bool canOutline(QString const & type)
 void TocWidget::enableControls(bool enable)
 {
        updateTB->setEnabled(enable);
-       sortCB->setEnabled(enable);
 
        if (!canOutline(current_type_))
                enable = false;
@@ -242,7 +301,7 @@ static bool canNavigate(QString const & type)
        // 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.
-       return type != "label";
+       return type != "label" && type != "change";
 }
 
 
@@ -259,23 +318,28 @@ void TocWidget::updateView()
        tocTV->setEnabled(false);
        tocTV->setUpdatesEnabled(false);
 
-       QAbstractItemModel * toc_model = gui_view_.tocModels().model(current_type_);    
+       QAbstractItemModel * toc_model = gui_view_.tocModels().model(current_type_);
        if (tocTV->model() != toc_model) {
                tocTV->setModel(toc_model);
                tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
-               setTreeDepth(depth_);
+               if (persistent_)
+                       setTreeDepth(depth_);
        }
 
        sortCB->blockSignals(true);
        sortCB->setChecked(gui_view_.tocModels().isSorted(current_type_));
        sortCB->blockSignals(false);
 
+       persistentCB->setChecked(persistent_);
+
        bool controls_enabled = toc_model && toc_model->rowCount() > 0
                && !gui_view_.buffer()->isReadonly();
        enableControls(controls_enabled);
 
        depthSL->setMaximum(gui_view_.tocModels().depth(current_type_));
        depthSL->setValue(depth_);
+       if (!persistent_)
+               setTreeDepth(depth_);
        if (canNavigate(current_type_))
                select(gui_view_.tocModels().currentIndex(current_type_));
        tocTV->setEnabled(true);
@@ -313,6 +377,8 @@ void TocWidget::init(QString const & str)
        if (new_index == -1) {
                current_type_ = "tableofcontents";
                new_index = typeCO->findData(current_type_);
+       } else {
+               current_type_ = typeCO->itemData(new_index).toString();
        }
 
        typeCO->blockSignals(true);
@@ -323,4 +389,4 @@ void TocWidget::init(QString const & str)
 } // namespace frontend
 } // namespace lyx
 
-#include "TocWidget_moc.cpp"
+#include "moc_TocWidget.cpp"