This question is related to (or part of) the question of how you can tell 
that your pane has been opened as  top-level window or as one of the panes 
of a nested splitter?

On Tuesday, September 29, 2020 at 11:23:41 PM UTC-4 [email protected] wrote:

> 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/48c58633-5ec8-4b28-9b00-8f15a1db88c3n%40googlegroups.com.

Reply via email to