On 03/01/2010 11:22 AM, John McCabe-Dansted wrote:
On Mon, Mar 1, 2010 at 4:18 PM, Abdelrazak Younes<you...@lyx.org>  wrote:
No, the submenu would just have to call
'setModel(guiApp->languageModel(buffer))'. The conversion from std::set<...>
would be automatically done in GuiApplication::languageModel().
Thats what I meant :).

Yes :-)

And something similar for 'languageModel(Buffer *)' except that here we
would have to search the QMap instead.
I am not sure what you mean by search QMap. I'd do something like

QAbstractItemModel * GuiApplication::languageModel(Buffer * b)
{
         QSortFilterProxyModel language_model;
         updateLanguageModel(language_model, b->getLanguages());
         return language_model;
}

Problem is you are returning a pointer for a local variable... This is wrong as the model should be persistent of course. So you need to somewhat cache the buffer language model:

What I mean is this:

Index: src/frontends/qt4/GuiApplication.cpp
===================================================================
--- src/frontends/qt4/GuiApplication.cpp    (revision 33602)
+++ src/frontends/qt4/GuiApplication.cpp    (working copy)
@@ -687,8 +687,11 @@
         cancel_meta_seq = KeySequence(kb, kb);
     }

-    ///
+    /// This is the Application global language model.
     QSortFilterProxyModel * language_model_;
+
+    /// This caches the language model for each Buffer.
+    QMap<Buffer *, QSortFilterProxyModel *> buffer_language_models_;
     ///
     GuiClipboard clipboard_;
     ///
@@ -1983,6 +1986,20 @@
 }


+QAbstractItemModel * GuiApplication::languageModel(Buffer const * buffer)
+{
+    if (!buffer)
+        return 0;
+ QSortFilterProxyModel * model = d->buffer_language_models_.value(buffer, 0);
+    if (!model) {
+        model = new QSortFilterProxyModel(this);
+        d->buffer_language_models_[buffer] = model;
+    }
+    updateLanguageModel(model, buffer->getLanguages());
+    return model;
+}
+
+
 QAbstractItemModel * GuiApplication::languageModel()
 {
     if (d->language_model_)

Reply via email to