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.
