]> git.lyx.org Git - features.git/commitdiff
* ControlToc:
authorAbdelrazak Younes <younes@lyx.org>
Mon, 12 Mar 2007 14:23:44 +0000 (14:23 +0000)
committerAbdelrazak Younes <younes@lyx.org>
Mon, 12 Mar 2007 14:23:44 +0000 (14:23 +0000)
  - initialiseParams(): overload ControlCommand::initialiseParams() so that we can update the model at this point (QToc is the controller _and_ the model).
  - update(): new
  - updateBackend(): new protected method to update the TocBackend (called for the "Update" button).

* QToc:
  - is now a QObject
  - modelReset: new Qt signal to indicate a model reset to associated dialog(s).
  - QToc(): avoid the duplicate update() call that will be done in the show command anyway.

* Dialogs.C
  - use new TocWidget in a DockView.

* TocWidget.[Ch]: renamed from QTocDialog. This striped down widget is only a widget that connects to the 'QToc' model/controller.

* DockView.h: new template class that encapsulates a given Widget inside a DockWidget and presents a Dialog::View interface.

* QTocUi.ui:
  - now is a simple Widget.
  - rearrange the buttons a bit
  - get rid of the unneeded close button.
  - modify the shortcut to "Promote" to 'r' because of a clash with "Alt-p" number (we really need real, always valid, shortcuts for all outline action!)

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@17416 a592a061-630c-0410-9148-cb99ea01b6c8

14 files changed:
development/scons/scons_manifest.py
src/frontends/controllers/ControlToc.C
src/frontends/controllers/ControlToc.h
src/frontends/qt4/Dialogs.C
src/frontends/qt4/DockView.h [new file with mode: 0644]
src/frontends/qt4/Makefile.am
src/frontends/qt4/Makefile.dialogs
src/frontends/qt4/QToc.C
src/frontends/qt4/QToc.h
src/frontends/qt4/QTocDialog.C [deleted file]
src/frontends/qt4/QTocDialog.h [deleted file]
src/frontends/qt4/TocWidget.C [new file with mode: 0644]
src/frontends/qt4/TocWidget.h [new file with mode: 0644]
src/frontends/qt4/ui/QTocUi.ui

index 78b055b6b6266e3580b06ba316b31d107b771ba7..660b504dea06ccb8a6b69f46399db6b405b422fa 100644 (file)
@@ -726,7 +726,8 @@ src_frontends_qt4_moc_files = Split('''
     QTexinfoDialog.C
     QThesaurusDialog.C
     TocModel.C
-    QTocDialog.C
+    TocWidget.C
+    QToc.C
     GuiView.C
     QURLDialog.C
     QVSpaceDialog.C
@@ -743,6 +744,7 @@ src_frontends_qt4_header_files = Split('''
     BiblioModuleBase.h
     BulletsModule.h
     ColorCache.h
+    DockView.h
     FileDialog_private.h
     GuiApplication.h
     GuiClipboard.h
@@ -831,7 +833,6 @@ src_frontends_qt4_header_files = Split('''
     QThesaurus.h
     QThesaurusDialog.h
     QToc.h
-    QTocDialog.h
     QURLDialog.h
     QVSpace.h
     QVSpaceDialog.h
@@ -841,6 +842,7 @@ src_frontends_qt4_header_files = Split('''
     QWrapDialog.h
     Qt2BC.h
     TocModel.h
+    TocWidget.h
     UrlView.h
     checkedwidgets.h
     emptytable.h
@@ -953,7 +955,6 @@ src_frontends_qt4_files = Split('''
     QThesaurus.C
     QThesaurusDialog.C
     QToc.C
-    QTocDialog.C
     QURLDialog.C
     QVSpace.C
     QVSpaceDialog.C
@@ -963,6 +964,7 @@ src_frontends_qt4_files = Split('''
     QWrapDialog.C
     Qt2BC.C
     TocModel.C
+    TocWidget.C
     UrlView.C
     checkedwidgets.C
     emptytable.C
index a3c099be929a854e04c2b40238ae49ed41fee9a6..9bd998956464b40a82889a03213ecba28bdef63b 100644 (file)
@@ -37,8 +37,15 @@ namespace frontend {
 
 ControlToc::ControlToc(Dialog & d)
        : ControlCommand(d, "tableofcontents", "toc")
-{}
+{
+}
+
 
+bool ControlToc::initialiseParams(string const & data)
+{
+       update();
+       return ControlCommand::initialiseParams(data);
+}
 
 void ControlToc::goTo(TocItem const & item)
 {
@@ -83,6 +90,12 @@ vector<string> const & ControlToc::getTypes() const
 }
 
 
+void ControlToc::updateBackend()
+{
+       kernel().buffer().tocBackend().update();
+}
+
+
 TocIterator const ControlToc::getCurrentTocItem(
        string const & type) const
 {
index 9f30415154417fb00b20de4a67bf0dec5c53bc0c..273349b30f2bd0084c906266a552b301caa86e61 100644 (file)
@@ -27,6 +27,11 @@ class ControlToc : public ControlCommand {
 public:
        ///
        ControlToc(Dialog &);
+       ///
+       virtual ~ControlToc() {}
+
+       /// \c ControlCommand inherited method.
+       bool initialiseParams(std::string const & data);
 
        /// Goto this paragraph id
        void goTo(TocItem const &);
@@ -51,9 +56,14 @@ public:
        void outlineIn();
        ///
        void outlineOut();
-       
        /// Test if outlining operation is possible
        bool canOutline(std::string const & type);
+       ///
+       void updateBackend();
+
+public:
+       /// Update the model data if needed.
+       virtual void update() = 0;
 };
 
 } // namespace frontend
index df2e5b0d6fa8b64b4de401abf9ba5cbbd14451aa..c0c35b1d420685ed0a107eb60eb42cca4f92e438 100644 (file)
@@ -44,6 +44,8 @@
 
 #include "Qt2BC.h"
 #include "ButtonController.h"
+#include "DockView.h"
+#include "GuiView.h"
 #include "QAbout.h"
 #include "QBibitem.h"
 #include "QBibtex.h"
@@ -78,7 +80,7 @@
 #include "QTabularCreate.h"
 #include "QTexinfo.h"
 #include "QToc.h"
-#include "QTocDialog.h"
+#include "TocWidget.h"
 #include "UrlView.h"
 #include "QVSpace.h"
 #include "QWrap.h"
@@ -92,7 +94,6 @@
 
 #include <boost/assert.hpp>
 
-
 using std::string;
 
 using namespace lyx::frontend;
@@ -131,6 +132,7 @@ private:
 
 namespace lyx {
 
+
 bool Dialogs::isValidName(string const & name) const
 {
        return std::find_if(dialognames, end_dialognames,
@@ -300,7 +302,9 @@ Dialogs::DialogPtr Dialogs::build(string const & name)
        } else if (name == "toc") {
                QToc * qtoc = new QToc(*dialog);
                dialog->setController(qtoc);
-               dialog->setView(new QTocDialog(*dialog, qtoc));
+               GuiView & gui_view = static_cast<GuiView &>(lyxview_);
+               dialog->setView(new DockView<QToc, TocWidget>(
+                       *dialog, qtoc, &gui_view, _("Toc")));
                dialog->bc().bp(new OkCancelPolicy);
        } else if (name == "url") {
                dialog->setController(new ControlCommand(*dialog, name, name));
diff --git a/src/frontends/qt4/DockView.h b/src/frontends/qt4/DockView.h
new file mode 100644 (file)
index 0000000..ec68c18
--- /dev/null
@@ -0,0 +1,67 @@
+// -*- C++ -*-
+/**
+ * \file DockView.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef DOCK_VIEW_H
+#define DOCK_VIEW_H
+
+#include "controllers/dialog.h"
+
+#include <boost/scoped_ptr.hpp>
+
+#include <QDockWidget>
+#include <QMainWindow>
+
+namespace lyx {
+namespace frontend {
+
+/// Dock Widget container for LyX dialogs.
+/// This template class that encapsulates a given Widget inside a
+/// DockWidget and presents a Dialog::View interface
+template<class Controller, class Widget>
+class DockView : public QDockWidget, public Dialog::View 
+{
+public:
+       DockView(
+               Dialog & dialog, ///< The (one) parent Dialog class.
+               Controller * form, ///< Associated model/controller
+               QMainWindow * parent, ///< the main window where to dock.
+               docstring const & title ///< Window title (shown in the top title bar).
+               )
+               : QDockWidget(toqstr(title), parent), Dialog::View(dialog, title)
+       {
+               widget_.reset(new Widget(form));
+               setWidget(widget_.get());
+               parent->addDockWidget(Qt::LeftDockWidgetArea, this);
+       }
+
+       /// Dialog::View inherited methods
+       //@{
+       void apply() {}
+       void hide()     { QDockWidget::hide(); }
+       void show()     { QDockWidget::show(); }
+       bool isVisible() const  
+       { return QDockWidget::isVisible(); }
+       void redraw() {}
+       void update()
+       {
+               widget_->update();
+               QDockWidget::update();
+       }
+       //@}
+private:
+       /// The encapsulated widget.
+       boost::scoped_ptr<Widget> widget_;
+};
+
+} // frontend
+} // lyx
+
+#endif // TOC_WIDGET_H
index 4d5b35e0dccd0465a5ad06bf6fccb4c7ad341e5c..20113224e77b1f4992eaa1a59b2749622968563d 100644 (file)
@@ -32,6 +32,7 @@ AM_CPPFLAGS += \
 libqt4_la_SOURCES = \
        Alert_pimpl.C \
        ColorCache.h ColorCache.C \
+       DockView.h \
        Dialogs.C \
        FileDialog.C \
        GuiClipboard.h GuiClipboard.C \
@@ -78,7 +79,6 @@ libqt4_la_SOURCES = \
        QTabularCreate.C QTabularCreate.h \
        QTexinfo.C QTexinfo.h \
        QThesaurus.C QThesaurus.h \
-       QToc.C QToc.h \
        QVSpace.C QVSpace.h \
        QWrap.C QWrap.h \
        Qt2BC.C Qt2BC.h \
index 93090810e6f679b97681ee501166798a4d8b7747..b928defe0e3d079064915563673993fbcebea718 100644 (file)
@@ -131,7 +131,8 @@ MOCFILES = \
        QTexinfoDialog.C QTexinfoDialog.h \
        QThesaurusDialog.C QThesaurusDialog.h \
        TocModel.C TocModel.h \
-       QTocDialog.C QTocDialog.h \
+       TocWidget.C TocWidget.h \
+       QToc.C QToc.h \
        QURLDialog.C QURLDialog.h \
        QVSpaceDialog.C QVSpaceDialog.h \
        QWrapDialog.C QWrapDialog.h \
index eeec2489aa634af038b6ed95084d8f65845a2206..a6885d0dcdcd1041040c620d123b1670cb399c8e 100644 (file)
@@ -12,6 +12,7 @@
 #include <config.h>
 
 #include "QToc.h"
+
 #include "TocModel.h"
 #include "Qt2BC.h"
 #include "qt_helpers.h"
@@ -35,7 +36,6 @@ namespace frontend {
 QToc::QToc(Dialog & parent)
        : ControlToc(parent)
 {
-       update();
 }
 
 
@@ -130,6 +130,7 @@ void QToc::update()
 {
        updateType();
        updateToc();
+       modelReset();
 }
 
 
@@ -184,3 +185,5 @@ void QToc::updateToc()
 
 } // namespace frontend
 } // namespace lyx
+
+#include "QToc_moc.cpp"
index 5827be40cb56d42e8b2a4fb85c94cc98d7ec8c4d..ea71c2b3671143eb867c61d7ef974bec0075c52e 100644 (file)
@@ -16,6 +16,7 @@
 
 #include "ControlToc.h"
 
+#include <QObject>
 #include <QStandardItemModel>
 #include <QStringListModel>
 
@@ -25,8 +26,9 @@ namespace frontend {
 class ControlToc;
 class TocModel;
 
-class QToc : public ControlToc
+class QToc : public QObject, public ControlToc
 {
+       Q_OBJECT
 public:
 
        QToc(Dialog &);
@@ -54,14 +56,17 @@ public:
        ///
        int getTocDepth();
 
-private:
+Q_SIGNALS:
+       /// Signal that the internal toc_models_ has been reset.
+       void modelReset();
 
+private:
+       ///
        std::vector<TocModel *> toc_models_;
-
+       ///
        QStringListModel type_model_;
-
+       ///
        int type_;
-       int outline_type_;
 };
 
 } // namespace frontend
diff --git a/src/frontends/qt4/QTocDialog.C b/src/frontends/qt4/QTocDialog.C
deleted file mode 100644 (file)
index 2df9d46..0000000
+++ /dev/null
@@ -1,298 +0,0 @@
-/**
- * \file QTocDialog.C
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author John Levon
- * \author Abdelrazak Younes
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#include <config.h>
-
-#include "QTocDialog.h"
-#include "QToc.h"
-#include "Qt2BC.h"
-#include "qt_helpers.h"
-#include "controllers/ControlToc.h"
-
-#include "debug.h"
-
-#include <QTreeWidgetItem>
-#include <QPushButton>
-#include <QCloseEvent>
-#include <QHeaderView>
-
-#include <vector>
-#include <string>
-#include <stack>
-
-using std::endl;
-using std::pair;
-using std::stack;
-using std::vector;
-using std::string;
-
-
-namespace lyx {
-namespace frontend {
-
-QTocDialog::QTocDialog(Dialog & dialog, QToc * form)
-       : Dialog::View(dialog, _("Toc")), form_(form), depth_(2)
-{
-       setupUi(this);
-
-       updateGui();
-
-       connect(tocTV->selectionModel(),
-               SIGNAL(currentChanged(const QModelIndex &,
-                       const QModelIndex &)),
-               this, SLOT(selectionChanged(const QModelIndex &,
-                       const QModelIndex &)));
-}
-
-
-QTocDialog::~QTocDialog()
-{
-       accept();
-}
-
-
-void QTocDialog::selectionChanged(const QModelIndex & current,
-                                 const QModelIndex & /*previous*/)
-{
-       lyxerr[Debug::GUI]
-               << "selectionChanged index " << current.row()
-               << ", " << current.column()
-               << endl;
-
-       form_->goTo(current);
-}
-
-
-void QTocDialog::on_closePB_clicked()
-{
-       accept();
-}
-
-
-void QTocDialog::on_updatePB_clicked()
-{
-       update();
-}
-
-/* FIXME (Ugras 17/11/06):
-I have implemented a getIndexDepth function to get the model indices. In my
-opinion, somebody should derive a new qvariant class for tocModelItem
-which saves the string data and depth information. that will save the
-depth calculation.
-*/
-int QTocDialog::getIndexDepth(QModelIndex const & index, int depth)
-{
-       ++depth;
-       return (index.parent() == QModelIndex())? depth : getIndexDepth(index.parent(),depth);
-}
-
-
-void QTocDialog::on_depthSL_valueChanged(int depth)
-{
-       if (depth == depth_)
-               return;
-       setTreeDepth(depth);
-}
-
-
-void QTocDialog::setTreeDepth(int depth)
-{
-       if(depth!=-1)
-               depth_ = depth;
-
-       // expanding and then collapsing is probably better, 
-       // but my qt 4.1.2 doesn't have expandAll()..
-       //tocTV->expandAll(); 
-       QModelIndexList indices = 
-               form_->tocModel()->match(form_->tocModel()->index(0,0),
-                                       Qt::DisplayRole, "*", -1, 
-                                       Qt::MatchWildcard|Qt::MatchRecursive);
-       
-       int size = indices.size();
-       for (int i = 0; i < size; i++) {
-               QModelIndex index = indices[i];
-               if (getIndexDepth(index) < depth_) 
-                       tocTV->expand(index); 
-               else
-                       tocTV->collapse(index); 
-       }
-}
-
-
-void QTocDialog::on_typeCO_activated(int value)
-{
-       form_->setTocModel(value);
-       tocTV->setModel(form_->tocModel());
-       reconnectSelectionModel();
-       enableButtons();
-       update();
-}
-
-
-void QTocDialog::on_moveUpPB_clicked()
-{
-       enableButtons(false);
-       QModelIndex index = tocTV->selectionModel()->selectedIndexes()[0];
-       form_->goTo(index);
-       form_->outlineUp();
-       update();
-}
-
-
-void QTocDialog::on_moveDownPB_clicked()
-{
-       enableButtons(false);
-       QModelIndex index = tocTV->selectionModel()->selectedIndexes()[0];
-       form_->goTo(index);
-       form_->outlineDown();
-       update();
-}
-
-
-void QTocDialog::on_moveInPB_clicked()
-{
-       enableButtons(false);
-       QModelIndex index = tocTV->selectionModel()->selectedIndexes()[0];
-       form_->goTo(index);
-       form_->outlineIn();
-       update();
-}
-
-
-void QTocDialog::on_moveOutPB_clicked()
-{
-       enableButtons(false);
-       QModelIndex index = tocTV->selectionModel()->selectedIndexes()[0];
-       form_->goTo(index);
-       form_->outlineOut();
-       update();
-}
-
-
-void QTocDialog::select(QModelIndex const & index)
-{
-//     tocTV->setModel(form_->tocModel());
-
-       if (!index.isValid()) {
-               lyxerr[Debug::GUI]
-                       << "QTocDialog::select(): QModelIndex is invalid!" << endl;
-               return;
-       }
-
-       tocTV->scrollTo(index);
-       tocTV->selectionModel()->select(index, QItemSelectionModel::Select);
-}
-
-
-void QTocDialog::enableButtons(bool enable)
-{
-       updatePB->setEnabled(enable);
-
-       if (!form_->canOutline())
-               enable = false;
-
-       moveUpPB->setEnabled(enable);
-       moveDownPB->setEnabled(enable);
-       moveInPB->setEnabled(enable);
-       moveOutPB->setEnabled(enable);
-}
-
-
-void QTocDialog::update()
-{
-       form_->updateToc();
-       updateGui();
-}
-
-
-void QTocDialog::updateGui()
-{
-       QStringListModel * type_model = form_->typeModel();
-       if (type_model->stringList().isEmpty()) {
-               enableButtons();
-               typeCO->setModel(type_model);
-               tocTV->setModel(new QStandardItemModel);
-               tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
-               depthSL->setEnabled(false);
-               return;
-       }
-
-       typeCO->setModel(type_model);
-       typeCO->setCurrentIndex(form_->getType());
-
-       if (form_->tocModel()) {
-               tocTV->setModel(form_->tocModel());
-               tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
-       }
-       // avoid flickering
-       tocTV-> setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
-       tocTV->showColumn(0);
-       // hide the pointless QHeader for now
-       // in the future, new columns may appear
-       // like labels, bookmarks, etc...
-       // tocTV->header()->hide();
-       tocTV->header()->setVisible(false);
-       enableButtons();
-
-       reconnectSelectionModel();
-       depthSL->setEnabled(true);
-       depthSL->setMaximum(form_->getTocDepth());
-       setTreeDepth();
-       select(form_->getCurrentIndex());
-
-       lyxerr[Debug::GUI]
-               << "form_->tocModel()->rowCount " << form_->tocModel()->rowCount()
-               << "\nform_->tocModel()->columnCount " << form_->tocModel()->columnCount()
-               << endl;
-//     setTitle(form_->guiname())
-}
-
-
-void QTocDialog::reconnectSelectionModel()
-{
-       connect(tocTV->selectionModel(),
-               SIGNAL(currentChanged(const QModelIndex &,
-                       const QModelIndex &)),
-               this, SLOT(selectionChanged(const QModelIndex &,
-                       const QModelIndex &)));
-}
-
-
-void QTocDialog::apply()
-{
-       // Nothing to do here... for now.
-       // Ideas welcome... (Abdel, 17042006)
-}
-
-
-void QTocDialog::hide()
-{
-       accept();
-}
-
-
-void QTocDialog::show()
-{
-       form_->update();
-       QDialog::show();
-}
-
-
-bool QTocDialog::isVisible() const
-{
-       return QDialog::isVisible();
-}
-
-
-} // namespace frontend
-} // namespace lyx
-
-#include "QTocDialog_moc.cpp"
diff --git a/src/frontends/qt4/QTocDialog.h b/src/frontends/qt4/QTocDialog.h
deleted file mode 100644 (file)
index c93e95e..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-// -*- C++ -*-
-/**
- * \file QTocDialog.h
- * This file is part of LyX, the document processor.
- * Licence details can be found in the file COPYING.
- *
- * \author John Levon
- * \author Abdelrazak Younes
- *
- * Full author contact details are available in file CREDITS.
- */
-
-#ifndef QTOCDIALOG_H
-#define QTOCDIALOG_H
-
-#include "ui/QTocUi.h"
-#include "controllers/ControlToc.h"
-
-#include <QDialog>
-
-class QTreeViewItem;
-
-namespace lyx {
-namespace frontend {
-
-class QToc;
-
-class QTocDialog : public QDialog, public Ui::QTocUi, public Dialog::View  {
-       Q_OBJECT
-public:
-       QTocDialog(Dialog &, QToc * form);
-
-       ~QTocDialog();
-
-       virtual void apply();
-
-       /// Hide the dialog from sight
-       void hide();
-
-       /// Redraw the dialog (e.g. if the colors have been remapped).
-       void redraw() {}
-
-       /// Create the dialog if necessary, update it and display it.
-       void show();
-
-       /// Update the display of the dialog whilst it is still visible.
-       void update();
-
-       /// Update Gui of the display.
-       void updateGui();
-
-       /// \return true if the dialog is visible.
-       bool isVisible() const;
-
-protected Q_SLOTS:
-       ///
-       void select(QModelIndex const & index);
-       ///
-       void selectionChanged(const QModelIndex & current,
-               const QModelIndex & previous);
-
-       void on_closePB_clicked();
-       void on_updatePB_clicked();
-       void on_depthSL_valueChanged(int depth);
-       void on_typeCO_activated(int value);
-       void on_moveUpPB_clicked();
-       void on_moveDownPB_clicked();
-       void on_moveInPB_clicked();
-       void on_moveOutPB_clicked();
-
-protected:
-       ///
-       void enableButtons(bool enable = true);
-       /// Reconnects the selection model change signal when TOC changed.
-       void reconnectSelectionModel();
-       ///
-       int getIndexDepth(QModelIndex const & index, int depth = -1);
-       ///
-       void setTreeDepth(int depth = -1);
-
-private:
-
-       QToc * form_;
-
-       /// depth of list shown
-       int depth_;
-};
-
-} // namespace frontend
-} // namespace lyx
-
-#endif // QTOCDIALOG_H
diff --git a/src/frontends/qt4/TocWidget.C b/src/frontends/qt4/TocWidget.C
new file mode 100644 (file)
index 0000000..2fb8b9b
--- /dev/null
@@ -0,0 +1,268 @@
+/**
+ * \file TocWidget.C
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#include <config.h>
+
+#include "TocWidget.h"
+
+#include "QToc.h"
+#include "qt_helpers.h"
+
+#include "debug.h"
+
+#include <QHeaderView>
+#include <QPushButton>
+#include <QTreeWidgetItem>
+
+#include <vector>
+#include <string>
+#include <stack>
+
+using std::endl;
+using std::pair;
+using std::stack;
+using std::vector;
+using std::string;
+
+
+namespace lyx {
+namespace frontend {
+
+
+TocWidget::TocWidget(QToc * form, QMainWindow * parent)
+       : QWidget(parent), form_(form), depth_(0)
+{
+       setupUi(this);
+
+       connect(form, SIGNAL(modelReset()),
+               SLOT(updateGui()));
+
+       // avoid flickering
+       tocTV->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
+
+       tocTV->showColumn(0);
+
+       // hide the pointless QHeader for now
+       // in the future, new columns may appear
+       // like labels, bookmarks, etc...
+       // tocTV->header()->hide();
+       tocTV->header()->setVisible(false);
+}
+
+
+void TocWidget::selectionChanged(const QModelIndex & current,
+                                 const QModelIndex & /*previous*/)
+{
+       lyxerr[Debug::GUI]
+               << "selectionChanged index " << current.row()
+               << ", " << current.column()
+               << endl;
+
+       form_->goTo(current);
+}
+
+
+void TocWidget::on_updatePB_clicked()
+{
+       form_->updateBackend();
+       form_->update();
+       update();
+}
+
+/* FIXME (Ugras 17/11/06):
+I have implemented a getIndexDepth function to get the model indices. In my
+opinion, somebody should derive a new qvariant class for tocModelItem
+which saves the string data and depth information. that will save the
+depth calculation.
+*/
+int TocWidget::getIndexDepth(QModelIndex const & index, int depth)
+{
+       ++depth;
+       return (index.parent() == QModelIndex())? depth : getIndexDepth(index.parent(),depth);
+}
+
+
+void TocWidget::on_depthSL_valueChanged(int depth)
+{
+       if (depth == depth_)
+               return;
+       setTreeDepth(depth);
+}
+
+
+void TocWidget::setTreeDepth(int depth)
+{
+       depth_ = depth;
+
+       // expanding and then collapsing is probably better, 
+       // but my qt 4.1.2 doesn't have expandAll()..
+       //tocTV->expandAll(); 
+       QModelIndexList indices = 
+               form_->tocModel()->match(form_->tocModel()->index(0,0),
+                                       Qt::DisplayRole, "*", -1, 
+                                       Qt::MatchWildcard|Qt::MatchRecursive);
+       
+       int size = indices.size();
+       for (int i = 0; i < size; i++) {
+               QModelIndex index = indices[i];
+               if (getIndexDepth(index) < depth_) 
+                       tocTV->expand(index); 
+               else
+                       tocTV->collapse(index); 
+       }
+}
+
+
+void TocWidget::on_typeCO_activated(int value)
+{
+       form_->setTocModel(value);
+       updateGui();
+}
+
+
+void TocWidget::on_moveUpPB_clicked()
+{
+       enableButtons(false);
+       QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
+       if (!list.isEmpty()) {
+               enableButtons(false);
+               form_->goTo(list[0]);
+               form_->outlineUp();
+               enableButtons(true);
+       }
+}
+
+
+void TocWidget::on_moveDownPB_clicked()
+{
+       enableButtons(false);
+       QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
+       if (!list.isEmpty()) {
+               enableButtons(false);
+               form_->goTo(list[0]);
+               form_->outlineDown();
+               enableButtons(true);
+       }
+}
+
+
+void TocWidget::on_moveInPB_clicked()
+{
+       enableButtons(false);
+       QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
+       if (!list.isEmpty()) {
+               enableButtons(false);
+               form_->goTo(list[0]);
+               form_->outlineIn();
+               enableButtons(true);
+       }
+}
+
+
+void TocWidget::on_moveOutPB_clicked()
+{
+       QModelIndexList const & list = tocTV->selectionModel()->selectedIndexes();
+       if (!list.isEmpty()) {
+               enableButtons(false);
+               form_->goTo(list[0]);
+               form_->outlineOut();
+               enableButtons(true);
+       }
+}
+
+
+void TocWidget::select(QModelIndex const & index)
+{
+       if (!index.isValid()) {
+               lyxerr[Debug::GUI]
+                       << "TocWidget::select(): QModelIndex is invalid!" << endl;
+               return;
+       }
+
+       tocTV->selectionModel()->blockSignals(true);
+       tocTV->scrollTo(index);
+       tocTV->selectionModel()->setCurrentIndex(index,
+               QItemSelectionModel::ClearAndSelect);
+       tocTV->selectionModel()->blockSignals(false);
+}
+
+
+void TocWidget::enableButtons(bool enable)
+{
+       updatePB->setEnabled(enable);
+
+       if (!form_->canOutline())
+               enable = false;
+
+       moveUpPB->setEnabled(enable);
+       moveDownPB->setEnabled(enable);
+       moveInPB->setEnabled(enable);
+       moveOutPB->setEnabled(enable);
+}
+
+
+void TocWidget::update()
+{
+       select(form_->getCurrentIndex());
+       QWidget::update();
+}
+
+
+void TocWidget::updateGui()
+{
+       QStringListModel * type_model = form_->typeModel();
+       if (type_model->stringList().isEmpty()) {
+               enableButtons(false);
+               typeCO->setModel(type_model);
+               tocTV->setModel(new QStandardItemModel);
+               tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
+               depthSL->setEnabled(false);
+               return;
+       }
+
+       typeCO->setModel(type_model);
+       typeCO->setCurrentIndex(form_->getType());
+
+       bool buttons_enabled = false;
+       if (form_->tocModel()) {
+               buttons_enabled = form_->tocModel()->rowCount() > 0;
+               tocTV->setModel(form_->tocModel());
+               tocTV->setEditTriggers(QAbstractItemView::NoEditTriggers);
+       }
+
+       enableButtons(buttons_enabled);
+
+       reconnectSelectionModel();
+       depthSL->setEnabled(true);
+       depthSL->setMaximum(form_->getTocDepth());
+       depthSL->setValue(depth_);
+       select(form_->getCurrentIndex());
+
+       lyxerr[Debug::GUI]
+               << "form_->tocModel()->rowCount " << form_->tocModel()->rowCount()
+               << "\nform_->tocModel()->columnCount " << form_->tocModel()->columnCount()
+               << endl;
+}
+
+
+void TocWidget::reconnectSelectionModel()
+{
+       connect(tocTV->selectionModel(),
+               SIGNAL(currentChanged(const QModelIndex &,
+                       const QModelIndex &)),
+               this, SLOT(selectionChanged(const QModelIndex &,
+                       const QModelIndex &)));
+}
+
+} // namespace frontend
+} // namespace lyx
+
+#include "TocWidget_moc.cpp"
diff --git a/src/frontends/qt4/TocWidget.h b/src/frontends/qt4/TocWidget.h
new file mode 100644 (file)
index 0000000..3cc950b
--- /dev/null
@@ -0,0 +1,71 @@
+// -*- C++ -*-
+/**
+ * \file TocWidget.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author John Levon
+ * \author Abdelrazak Younes
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef TOC_WIDGET_H
+#define TOC_WIDGET_H
+
+#include "ui/QTocUi.h"
+
+#include <QWidget>
+
+namespace lyx {
+namespace frontend {
+
+class QToc;
+
+class TocWidget : public QWidget, public Ui::QTocUi {
+       Q_OBJECT
+public:
+       TocWidget(QToc * form, QMainWindow * parent = 0);
+
+       /// Update the display of the dialog whilst it is still visible.
+       void update();
+
+protected Q_SLOTS:
+       /// Update Gui of the display.
+       void updateGui();
+       ///
+       void select(QModelIndex const & index);
+       ///
+       void selectionChanged(const QModelIndex & current,
+               const QModelIndex & previous);
+
+       void on_updatePB_clicked();
+       void on_depthSL_valueChanged(int depth);
+       void on_typeCO_activated(int value);
+       void on_moveUpPB_clicked();
+       void on_moveDownPB_clicked();
+       void on_moveInPB_clicked();
+       void on_moveOutPB_clicked();
+
+protected:
+       ///
+       void enableButtons(bool enable = true);
+       ///
+       int getIndexDepth(QModelIndex const & index, int depth = -1);
+       ///
+       void setTreeDepth(int depth);
+
+private:
+       /// Reconnects the selection model change signal when TOC changed.
+       void reconnectSelectionModel();
+
+       QToc * form_;
+
+       /// depth of list shown
+       int depth_;
+};
+
+} // namespace frontend
+} // namespace lyx
+
+#endif // TOC_WIDGET_H
index bd89b67c3cfef9506d69ca130dbe9c34ae76c619..aa9f8c4a9ac39439bec4a4c2b75a2c4a25a2c90a 100644 (file)
@@ -1,23 +1,20 @@
 <ui version="4.0" >
- <author></author>
- <comment></comment>
- <exportmacro></exportmacro>
  <class>QTocUi</class>
- <widget class="QDialog" name="QTocUi" >
+ <widget class="QWidget" name="QTocUi" >
+  <property name="windowModality" >
+   <enum>Qt::NonModal</enum>
+  </property>
   <property name="geometry" >
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>386</width>
-    <height>351</height>
+    <width>257</width>
+    <height>404</height>
    </rect>
   </property>
   <property name="windowTitle" >
    <string/>
   </property>
-  <property name="sizeGripEnabled" >
-   <bool>true</bool>
-  </property>
   <layout class="QGridLayout" >
    <property name="margin" >
     <number>9</number>
@@ -25,7 +22,7 @@
    <property name="spacing" >
     <number>6</number>
    </property>
-   <item row="3" column="0" >
+   <item row="3" column="0" colspan="2" >
     <layout class="QGridLayout" >
      <property name="margin" >
       <number>0</number>
       <number>6</number>
      </property>
      <item row="0" column="0" >
-      <widget class="QPushButton" name="moveUpPB" >
+      <widget class="QPushButton" name="moveOutPB" >
        <property name="text" >
-        <string>&amp;Up</string>
+        <string>&lt;- P&amp;romote</string>
        </property>
       </widget>
      </item>
-     <item row="0" column="1" >
+     <item row="1" column="2" >
       <widget class="QPushButton" name="moveDownPB" >
        <property name="text" >
         <string>&amp;Down</string>
        </property>
       </widget>
      </item>
-     <item row="0" column="2" >
-      <widget class="QPushButton" name="moveOutPB" >
-       <property name="text" >
-        <string>&lt;- &amp;Promote</string>
-       </property>
-      </widget>
-     </item>
-     <item row="0" column="3" >
+     <item row="0" column="1" >
       <widget class="QPushButton" name="moveInPB" >
        <property name="text" >
         <string>&amp;Demote -></string>
        </property>
       </widget>
      </item>
-    </layout>
-   </item>
-   <item row="4" column="0" >
-    <layout class="QGridLayout" >
-     <property name="margin" >
-      <number>0</number>
-     </property>
-     <property name="spacing" >
-      <number>6</number>
-     </property>
-     <item row="0" column="2" >
-      <widget class="QPushButton" name="closePB" >
+     <item row="1" column="0" colspan="2" >
+      <widget class="QPushButton" name="updatePB" >
        <property name="text" >
-        <string>&amp;Close</string>
-       </property>
-       <property name="default" >
-        <bool>true</bool>
+        <string>&amp;Update</string>
        </property>
       </widget>
      </item>
-     <item row="0" column="1" >
-      <spacer>
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeHint" >
-        <size>
-         <width>40</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-     <item row="0" column="0" >
-      <widget class="QPushButton" name="updatePB" >
+     <item row="0" column="2" >
+      <widget class="QPushButton" name="moveUpPB" >
        <property name="text" >
-        <string>&amp;Update</string>
+        <string>&amp;Up</string>
        </property>
       </widget>
      </item>
     </layout>
    </item>
-   <item row="2" column="0" >
+   <item row="0" column="1" >
+    <widget class="QComboBox" name="typeCO" >
+     <property name="sizePolicy" >
+      <sizepolicy>
+       <hsizetype>7</hsizetype>
+       <vsizetype>0</vsizetype>
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="2" >
+    <widget class="QTreeView" name="tocTV" >
+     <property name="sizePolicy" >
+      <sizepolicy>
+       <hsizetype>7</hsizetype>
+       <vsizetype>7</vsizetype>
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="0" colspan="2" >
     <widget class="QSlider" name="depthSL" >
      <property name="maximum" >
       <number>5</number>
     </widget>
    </item>
    <item row="0" column="0" >
-    <layout class="QHBoxLayout" >
-     <property name="margin" >
-      <number>0</number>
+    <widget class="QLabel" name="typeLA" >
+     <property name="text" >
+      <string>&amp;Type:</string>
      </property>
-     <property name="spacing" >
-      <number>6</number>
+     <property name="buddy" >
+      <cstring>typeCO</cstring>
      </property>
-     <item>
-      <widget class="QLabel" name="typeLA" >
-       <property name="text" >
-        <string>&amp;Type:</string>
-       </property>
-       <property name="buddy" >
-        <cstring>typeCO</cstring>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <widget class="QComboBox" name="typeCO" >
-       <property name="sizePolicy" >
-        <sizepolicy>
-         <hsizetype>3</hsizetype>
-         <vsizetype>0</vsizetype>
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-      </widget>
-     </item>
-     <item>
-      <spacer>
-       <property name="orientation" >
-        <enum>Qt::Horizontal</enum>
-       </property>
-       <property name="sizeType" >
-        <enum>QSizePolicy::Expanding</enum>
-       </property>
-       <property name="sizeHint" >
-        <size>
-         <width>20</width>
-         <height>20</height>
-        </size>
-       </property>
-      </spacer>
-     </item>
-    </layout>
-   </item>
-   <item row="1" column="0" >
-    <widget class="QTreeView" name="tocTV" />
+    </widget>
    </item>
   </layout>
  </widget>
- <pixmapfunction></pixmapfunction>
  <tabstops>
   <tabstop>typeCO</tabstop>
   <tabstop>tocTV</tabstop>
   <tabstop>moveDownPB</tabstop>
   <tabstop>moveInPB</tabstop>
   <tabstop>moveOutPB</tabstop>
-  <tabstop>updatePB</tabstop>
-  <tabstop>closePB</tabstop>
  </tabstops>
  <includes>
   <include location="local" >qt_helpers.h</include>