When a pane is opened as a toplevel window by using the Open Window context 
menu, that pane is not a part of the ordinary nested splitter layout, so 
far as I can tell.  How can this pane be accessed?

On Tuesday, September 29, 2020 at 12:35:13 PM UTC-4 Edward K. Ream wrote:

> For the last several days I have been studying the FreeLayoutController 
> and NestedSplitter classes, with an eye to understanding how those classes 
> collaborate to save and restore layouts.  All the following work is 
> background to #1686 <https://github.com/leo-editor/leo-editor/issues/1686>. 
> It's not an easy project.
>
> Today I attempted to simplify ns.get_layout and ns.get_saveable_layout. 
> Here are the original versions, sans docstrings:
>
> def get_layout(self, _saveable=False):
>     ans = {
>         'orientation': self.orientation(),
>         'content': []
>     }
>     if not _saveable:
>         ans['splitter'] = self
>     ans['sizes'] = self.sizes()
>     for i in range(self.count()):
>         w = self.widget(i)
>         if isinstance(w, NestedSplitter):
>             ans['content'].append(w.get_layout(_saveable=_saveable))
>         else:
>             if _saveable:
>                 ans['content'].append(getattr(w, '_ns_id', 'UNKNOWN'))
>             else:
>                 ans['content'].append(w)
>     return ans
>
> def get_saveable_layout(self):
>     return self.get_layout(_saveable=True)
>
> Vitalije's trick of removing kwargs simplifies ns.get_layout as follows:
>
> def get_layout(self):
>     """
>     Return a dict describing the layout.
>
>     Usually you would call ns.top().get_layout()
>     """
>     def content(w):
>         return w.get_layout() if isinstance(w, NestedSplitter) else w
>         
>     def widgets():
>         """Yield an ordered list of the contained widgets."""
>         return (self.widget(i) for i in range(self.count()))
>     
>     return {
>         'content': [content(w) for w in widgets()],
>         'orientation': self.orientation(),
>         'sizes': self.sizes(),
>         'splitter': self,
>     }
>
> My first thought was to wonder why ns.get_saveable_layout isn't exactly 
> the same. The answer is that the dict returned by ns.get_saveable_layout 
> will eventually be picked. But Qt widgets can not be pickled.  Instead, 
> here is the new version of ns.get_saveable_layout:
>
> def get_saveable_layout(self):
>     """
>     Return a dict describing the layout.
>
>     Usually you would call ns.top().get_layout()
>     """
>     def content(w):
>         return w.get_saveable_layout() if isinstance(w, NestedSplitter) 
> else getattr(w, '_ns_id', 'UNKNOWN')
>         
>     def widgets():
>         """Yield an ordered list of the contained widgets."""
>         return (self.widget(i) for i in range(self.count()))
>     
>     return {
>         'content': [content(w) for w in widgets()],
>         'orientation': self.orientation(),
>         'sizes': self.sizes(),
>     }
>
> The two methods are similar, but ns.get_layout returns a dict containing 
> Qt widgets (and includes a 'splitter' key) while ns.get_saveable_layout 
> substitutes id *strings* for the actual widgets.
>
> *Summary*
>
> I believe the new code is equivalent to the old. However, it's not clear 
> that changing the two methods is worthwhile.
>
> Anyway, I now understand what is going on in much more detail.
>
> I will eventually make at least one change. ns.layout_to_text is buggy and 
> should be replaced by g.printObj.
>
> Edward
>

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/leo-editor/1bf8c71c-a54c-44d7-b788-508cefea3cf0n%40googlegroups.com.

Reply via email to