annotate sat_frontends/quick_frontend/quick_widgets.py @ 3165:7699a08ba8fb

quick frontend(widget): added `with_duplicates` argument to getWidgets: when this argument is False, widgets with the same widget_hash are filtered to only return first one. It is True by default to keep former behaviour.
author Goffi <goffi@goffi.org>
date Wed, 12 Feb 2020 19:38:32 +0100
parents 30e08d904208
children 1cb232c9e845
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3137
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
1 #!/usr/bin/env python3
559a625a236b fixed shebangs
Goffi <goffi@goffi.org>
parents: 3136
diff changeset
2
0
goffi@necton2
parents:
diff changeset
3
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
4 # helper class for making a SAT frontend
3136
9d0df638c8b4 dates update
Goffi <goffi@goffi.org>
parents: 3116
diff changeset
5 # Copyright (C) 2009-2020 Jérôme Poisson (goffi@goffi.org)
0
goffi@necton2
parents:
diff changeset
6
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
7 # This program is free software: you can redistribute it and/or modify
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
8 # it under the terms of the GNU Affero General Public License as published by
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
9 # the Free Software Foundation, either version 3 of the License, or
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
10 # (at your option) any later version.
0
goffi@necton2
parents:
diff changeset
11
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
12 # This program is distributed in the hope that it will be useful,
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
15 # GNU Affero General Public License for more details.
0
goffi@necton2
parents:
diff changeset
16
609
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
17 # You should have received a copy of the GNU Affero General Public License
84a6e83157c2 fixed licences in docstrings (they are now in comments)
Goffi <goffi@goffi.org>
parents: 587
diff changeset
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
0
goffi@necton2
parents:
diff changeset
19
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
20 from sat.core.log import getLogger
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
21
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
22 log = getLogger(__name__)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
23 from sat.core import exceptions
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
24 from sat_frontends.quick_frontend.constants import Const as C
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
25
2039
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
26
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
27 classes_map = {}
0
goffi@necton2
parents:
diff changeset
28
goffi@necton2
parents:
diff changeset
29
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
30 try:
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
31 # FIXME: to be removed when an acceptable solution is here
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
32 str("") # XXX: unicode doesn't exist in pyjamas
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
33 except (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
34 TypeError,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
35 AttributeError,
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
36 ): # Error raised is not the same depending on pyjsbuild options
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
37 str = str
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
38
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
39
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
40 def register(base_cls, child_cls=None):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
41 """Register a child class to use by default when a base class is needed
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
42
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
43 @param base_cls: "Quick..." base class (like QuickChat or QuickContact), must inherit from QuickWidget
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
44 @param child_cls: inherited class to use when Quick... class is requested, must inherit from base_cls.
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
45 Can be None if it's the base_cls itself which register
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
46 """
1304
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
47 # FIXME: we use base_cls.__name__ instead of base_cls directly because pyjamas because
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
48 # in the second case
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
49 classes_map[base_cls.__name__] = child_cls
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
50
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
51
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
52 class WidgetAlreadyExistsError(Exception):
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
53 pass
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
54
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
55
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
56 class QuickWidgetsManager(object):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
57 """This class is used to manage all the widgets of a frontend
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
58 A widget can be a window, a graphical thing, or someting else depending of the frontend"""
587
952322b1d490 Remove trailing whitespaces.
Emmanuel Gil Peyrot <linkmauve@linkmauve.fr>
parents: 572
diff changeset
59
0
goffi@necton2
parents:
diff changeset
60 def __init__(self, host):
goffi@necton2
parents:
diff changeset
61 self.host = host
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
62 self._widgets = {}
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
63
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
64 def __iter__(self):
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
65 """Iterate throught all widgets"""
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
66 for widget_map in self._widgets.values():
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
67 for widget_instances in widget_map.values():
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
68 for widget in widget_instances:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
69 yield widget
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
70
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
71 def getRealClass(self, class_):
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
72 """Return class registered for given class_
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
73
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
74 @param class_: subclass of QuickWidget
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
75 @return: class actually used to create widget
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
76 """
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
77 try:
1304
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
78 # FIXME: we use base_cls.__name__ instead of base_cls directly because pyjamas bugs
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
79 # in the second case
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
80 cls = classes_map[class_.__name__]
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
81 except KeyError:
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
82 cls = class_
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
83 if cls is None:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
84 raise exceptions.InternalError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
85 "There is not class registered for {}".format(class_)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
86 )
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
87 return cls
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
88
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
89 def getWidgetInstances(self, widget):
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
90 """Get all instance of a widget
2039
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
91
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
92 This is a helper method which call getWidgets
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
93 @param widget(QuickWidget): retrieve instances of this widget
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
94 @return: iterator on widgets
2039
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
95 """
2855
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
96 return self.getWidgets(widget.__class__, widget.target, widget.profiles)
2039
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
97
3165
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
98 def getWidgets(self, class_, target=None, profiles=None, with_duplicates=True):
2007
19b9d3f8a6c7 plugin XEP-0085, quick_frontends, primitivus: chat states are working again
Goffi <goffi@goffi.org>
parents: 1995
diff changeset
99 """Get all subclassed widgets instances
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
100
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
101 @param class_: subclass of QuickWidget, same parameter as used in
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
102 [getOrCreateWidget]
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
103 @param target: if not None, construct a hash with this target and filter
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
104 corresponding widgets
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
105 recreated widgets are handled
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
106 @param profiles(iterable, None): if not None, filter on instances linked to these
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
107 profiles
3165
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
108 @param with_duplicates(bool): if False, only first widget with a given hash is
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
109 returned
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
110 @return: iterator on widgets
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
111 """
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
112 class_ = self.getRealClass(class_)
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
113 try:
1304
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
114 widgets_map = self._widgets[class_.__name__]
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
115 except KeyError:
2007
19b9d3f8a6c7 plugin XEP-0085, quick_frontends, primitivus: chat states are working again
Goffi <goffi@goffi.org>
parents: 1995
diff changeset
116 return
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
117 else:
2039
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
118 if target is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
119 filter_hash = str(class_.getWidgetHash(target, profiles))
2039
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
120 else:
6353deb1bd73 quick frontend (quick_widget): getWidgets can now filter on hash (using target), handling recreated widgets too
Goffi <goffi@goffi.org>
parents: 2027
diff changeset
121 filter_hash = None
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
122 if filter_hash is not None:
2888
e3803ae89fbc quick_frontend (widgets): fixed crash on getWidgets when target doesn't correspond to any widget
Goffi <goffi@goffi.org>
parents: 2855
diff changeset
123 for widget in widgets_map.get(filter_hash, []):
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
124 yield widget
3165
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
125 if not with_duplicates:
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
126 return
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
127 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
128 for widget_instances in widgets_map.values():
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
129 for widget in widget_instances:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
130 yield widget
3165
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
131 if not with_duplicates:
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
132 # widgets are set by hashes, so if don't want duplicates
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
133 # we only return the first widget of the list
7699a08ba8fb quick frontend(widget): added `with_duplicates` argument to getWidgets:
Goffi <goffi@goffi.org>
parents: 3159
diff changeset
134 break
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
135
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
136 def getWidget(self, class_, target=None, profiles=None):
1349
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
137 """Get a widget without creating it if it doesn't exist.
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
138
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
139 if several instances of widgets with this hash exist, the first one is returned
2845
42380a4f6433 quick frontend (app): new synchronisation mechanism:
Goffi <goffi@goffi.org>
parents: 2792
diff changeset
140 @param class_: subclass of QuickWidget, same parameter as used in [getOrCreateWidget]
1349
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
141 @param target: target depending of the widget, usually a JID instance
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
142 @param profiles (unicode, iterable[unicode], None): profile(s) to use (may or may not be
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
143 used, depending of the widget class)
1349
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
144 @return: a class_ instance or None if the widget doesn't exist
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
145 """
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
146 assert (target is not None) or (profiles is not None)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
147 if profiles is not None and isinstance(profiles, str):
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
148 profiles = [profiles]
1349
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
149 class_ = self.getRealClass(class_)
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
150 hash_ = class_.getWidgetHash(target, profiles)
1349
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
151 try:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
152 return self._widgets[class_.__name__][hash_][0]
1349
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
153 except KeyError:
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
154 return None
273b044fde6d quick_frontend: add a method getWidget to return a widget without creating it if it doesn't exist
souliane <souliane@mailoo.org>
parents: 1322
diff changeset
155
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
156 def getOrCreateWidget(self, class_, target, *args, **kwargs):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
157 """Get an existing widget or create a new one when necessary
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
158
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
159 If the widget is new, self.host.newWidget will be called with it.
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
160 @param class_(class): class of the widget to create
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
161 @param target: target depending of the widget, usually a JID instance
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
162 @param args(list): optional args to create a new instance of class_
1312
9e904f8a094e quick_frontend: getOrCreateWidget callbacks can return another widget
souliane <souliane@mailoo.org>
parents: 1310
diff changeset
163 @param kwargs(dict): optional kwargs to create a new instance of class_
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
164 if 'profile' key is present, it will be popped and put in 'profiles'
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
165 if there is neither 'profile' nor 'profiles', None will be used for 'profiles'
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
166 if 'on_new_widget' is present it can have the following values:
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
167 C.WIDGET_NEW [default]: self.host.newWidget will be called on widget creation
1322
1f13a837e4b2 quick_frontend (quick_widgets): revert commit 1319
souliane <souliane@mailoo.org>
parents: 1321
diff changeset
168 [callable]: this method will be called instead of self.host.newWidget
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
169 None: do nothing
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
170 if 'on_existing_widget' is present it can have the following values:
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
171 C.WIDGET_KEEP [default]: return the existing widget
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
172 C.WIDGET_RAISE: raise WidgetAlreadyExistsError
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
173 C.WIDGET_RECREATE: create a new widget
2062
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
174 if the existing widget has a "recreateArgs" method, it will be called with args list and kwargs dict
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
175 so the values can be completed to create correctly the new instance
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
176 [callable]: this method will be called with existing widget as argument, the widget to use must be returned
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
177 if 'force_hash' is present, the hash given in value will be used instead of the one returned by class_.getWidgetHash
1307
9512590dc3d7 quick_ frontend (quick widgets): added explanation in docstring for non special keywords in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 1304
diff changeset
178 other keys will be used to instanciate class_ if the case happen (e.g. if type_ is present and class_ is a QuickChat subclass,
9512590dc3d7 quick_ frontend (quick widgets): added explanation in docstring for non special keywords in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 1304
diff changeset
179 it will be used to create a new QuickChat instance).
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
180 @return: a class_ instance, either new or already existing
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
181 """
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
182 cls = self.getRealClass(class_)
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
183
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
184 ## arguments management ##
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
185 _args = [self.host, target] + list(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
186 args
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
187 ) or [] # FIXME: check if it's really necessary to use optional args
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
188 _kwargs = kwargs or {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
189 if "profiles" in _kwargs and "profile" in _kwargs:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
190 raise ValueError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
191 "You can't have 'profile' and 'profiles' keys at the same time"
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
192 )
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
193 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
194 _kwargs["profiles"] = [_kwargs.pop("profile")]
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
195 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
196 if not "profiles" in _kwargs:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
197 _kwargs["profiles"] = None
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
198
2792
441b536e28ed quick frontend (chat): use right type in getOrCreateWidget on new message
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
199 # on_new_widget tells what to do for the new widget creation
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
200 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
201 on_new_widget = _kwargs.pop("on_new_widget")
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
202 except KeyError:
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
203 on_new_widget = C.WIDGET_NEW
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
204
2792
441b536e28ed quick frontend (chat): use right type in getOrCreateWidget on new message
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
205 # on_existing_widget tells what to do when the widget already exists
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
206 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
207 on_existing_widget = _kwargs.pop("on_existing_widget")
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
208 except KeyError:
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
209 on_existing_widget = C.WIDGET_KEEP
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
210
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
211 ## we get the hash ##
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
212 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
213 hash_ = _kwargs.pop("force_hash")
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
214 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
215 hash_ = cls.getWidgetHash(target, _kwargs["profiles"])
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
216
1304
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
217 ## widget creation or retrieval ##
1a61b18703c4 quick frontend (quick widgets): class' __name__ method is used for classes_map hash because the use of class directly was causing bugs with pyjamas (difficult to find, several MicroblogPanel instances were added only once in Libervia's TabPanel, hash method seemed buggy)
Goffi <goffi@goffi.org>
parents: 1303
diff changeset
218
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
219 widgets_map = self._widgets.setdefault(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
220 cls.__name__, {}
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
221 ) # we sorts widgets by classes
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
222 if not cls.SINGLE:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
223 widget = None # if the class is not SINGLE, we always create a new widget
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
224 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
225 try:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
226 widget = widgets_map[hash_][0]
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
227 except KeyError:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
228 widget = None
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
229 else:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
230 widget.addTarget(target)
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
231
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
232 if widget is None:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
233 # we need to create a new widget
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
234 log.debug("Creating new widget for target {} {}".format(target, cls))
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
235 widget = cls(*_args, **_kwargs)
3114
060ac43627fc quick frontend (widgets): fixed widget creation in getOrCreateWidget:
Goffi <goffi@goffi.org>
parents: 3112
diff changeset
236 widgets_map.setdefault(hash_, []).append(widget)
0
goffi@necton2
parents:
diff changeset
237
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
238 if on_new_widget == C.WIDGET_NEW:
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
239 self.host.newWidget(widget)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
240 elif callable(on_new_widget):
1322
1f13a837e4b2 quick_frontend (quick_widgets): revert commit 1319
souliane <souliane@mailoo.org>
parents: 1321
diff changeset
241 on_new_widget(widget)
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
242 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
243 assert on_new_widget is None
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
244 else:
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
245 # the widget already exists
1308
f079e6ed1e69 quick frontend(quick widgets): added the ability to use a callable with getOrCreateWidget's on_existing_widget
Goffi <goffi@goffi.org>
parents: 1307
diff changeset
246 if on_existing_widget == C.WIDGET_KEEP:
f079e6ed1e69 quick frontend(quick widgets): added the ability to use a callable with getOrCreateWidget's on_existing_widget
Goffi <goffi@goffi.org>
parents: 1307
diff changeset
247 pass
1309
d0d5ba3b4d64 quick frontend(quick widgets): fixed bad condition test in previous commit
Goffi <goffi@goffi.org>
parents: 1308
diff changeset
248 elif on_existing_widget == C.WIDGET_RAISE:
1301
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
249 raise WidgetAlreadyExistsError(hash_)
afc57b34c0a3 Quick Frontend (quick_widgets): added on_existing_widget in getOrCreateWidget (see docstring for more infos) + use of constants
Goffi <goffi@goffi.org>
parents: 1290
diff changeset
250 elif on_existing_widget == C.WIDGET_RECREATE:
2062
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
251 try:
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
252 recreateArgs = widget.recreateArgs
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
253 except AttributeError:
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
254 pass
e22ab34c68f6 quick fronten (widgets): if a widget is recreated, "recreateArgs" method can be implemented to specify arguments to clone it correctly
Goffi <goffi@goffi.org>
parents: 2047
diff changeset
255 else:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
256 recreateArgs(_args, _kwargs)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
257 widget = cls(*_args, **_kwargs)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
258 widgets_map[hash_].append(widget)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
259 log.debug("widget <{wid}> already exists, a new one has been recreated"
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
260 .format(wid=widget))
1308
f079e6ed1e69 quick frontend(quick widgets): added the ability to use a callable with getOrCreateWidget's on_existing_widget
Goffi <goffi@goffi.org>
parents: 1307
diff changeset
261 elif callable(on_existing_widget):
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
262 widget = on_existing_widget(widget)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
263 if widget is None:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
264 raise exceptions.InternalError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
265 "on_existing_widget method must return the widget to use")
3115
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
266 if widget not in widgets_map[hash_]:
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
267 log.debug(
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
268 "the widget returned by on_existing_widget is new, adding it")
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
269 widgets_map[hash_].append(widget)
1308
f079e6ed1e69 quick frontend(quick widgets): added the ability to use a callable with getOrCreateWidget's on_existing_widget
Goffi <goffi@goffi.org>
parents: 1307
diff changeset
270 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
271 raise exceptions.InternalError(
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
272 "Unexpected on_existing_widget value ({})".format(on_existing_widget))
1308
f079e6ed1e69 quick frontend(quick widgets): added the ability to use a callable with getOrCreateWidget's on_existing_widget
Goffi <goffi@goffi.org>
parents: 1307
diff changeset
273
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
274 return widget
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
275
2047
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
276 def deleteWidget(self, widget_to_delete, *args, **kwargs):
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
277 """Delete a widget instance
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
278
2043
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
279 this method must be called by frontends when a widget is deleted
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
280 widget's onDelete method will be called before deletion, and deletion will be
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
281 stopped if it returns False.
2047
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
282 @param widget_to_delete(QuickWidget): widget which need to deleted
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
283 @param *args: extra arguments to pass to onDelete
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
284 @param *kwargs: extra keywords arguments to pass to onDelete
3158
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
285 the extra arguments are not used by QuickFrontend, it's is up to
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
286 the frontend to use them or not.
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
287 following extra arguments are well known:
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
288 - "all_instances" can be used as kwarg, if it evaluate to True,
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
289 all instances of the widget will be deleted (if onDelete is
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
290 not returning False for any of the instance). This arguments
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
291 is not sent to onDelete methods.
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
292 - "explicit_close" is used when the deletion is requested by
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
293 the user or a leave signal, "all_instances" is usually set at
6032245c927e quick frontend (app): added "explicit_close" to deleteWidget, and use it on mucRoomLeftHandler:
Goffi <goffi@goffi.org>
parents: 3137
diff changeset
294 the same time.
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
295 """
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
296 # TODO: all_instances must be independante kwargs, this is not possible with Python 2
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
297 # but will be with Python 3
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
298 all_instances = kwargs.get('all_instances', False)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
299
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
300 if all_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
301 for w in self.getWidgetInstances(widget_to_delete):
3116
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
302 if w.onDelete(**kwargs) == False:
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
303 log.debug(
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
304 f"Deletion of {widget_to_delete} cancelled by widget itself")
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
305 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
306 else:
3116
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
307 if widget_to_delete.onDelete(**kwargs) == False:
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
308 log.debug(f"Deletion of {widget_to_delete} cancelled by widget itself")
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
309 return
2043
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
310
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
311 if self.host.selected_widget == widget_to_delete:
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
312 self.host.selected_widget = None
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
313
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
314 class_ = self.getRealClass(widget_to_delete.__class__)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
315 try:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
316 widgets_map = self._widgets[class_.__name__]
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
317 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
318 log.error("no widgets_map found for class {cls}".format(cls=class_))
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
319 return
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
320 widget_hash = str(class_.getWidgetHash(widget_to_delete.target,
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
321 widget_to_delete.profiles))
3115
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
322 try:
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
323 widget_instances = widgets_map[widget_hash]
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
324 except KeyError:
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
325 log.error(f"no instance of {class_.__name__} found with hash {widget_hash!r}")
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
326 return
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
327 if all_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
328 widget_instances.clear()
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
329 else:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
330 try:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
331 widget_instances.remove(widget_to_delete)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
332 except ValueError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
333 log.error("widget_to_delete not found in widget instances")
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
334 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
335
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
336 log.debug("widget {} deleted".format(widget_to_delete))
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
337
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
338 if not widget_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
339 # all instances with this hash have been deleted
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
340 # we remove the hash itself
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
341 del widgets_map[widget_hash]
3115
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
342 log.debug("All instances of {cls} with hash {widget_hash!r} have been deleted"
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
343 .format(cls=class_, widget_hash=widget_hash))
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
344
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
345
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
346 class QuickWidget(object):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
347 """generic widget base"""
2855
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
348 # FIXME: sometime a single target is used, sometimes several ones
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
349 # This should be sorted out in the same way as for profiles: a single
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
350 # target should be possible when appropriate attribute is set.
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
351 # methods using target(s) and hash should be fixed accordingly
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
352
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
353 SINGLE = True # if True, there can be only one widget per target(s)
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
354 PROFILES_MULTIPLE = False # If True, this widget can handle several profiles at once
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
355 PROFILES_ALLOW_NONE = False # If True, this widget can be used without profile
0
goffi@necton2
parents:
diff changeset
356
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
357 def __init__(self, host, target, profiles=None):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
358 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
359 @param host: %(doc_host)s
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
360 @param target: target specific for this widget class
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
361 @param profiles: can be either:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
362 - (unicode): used when widget class manage a unique profile
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
363 - (iterable): some widget class can manage several profiles, several at once can be specified here
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
364 - None: no profile is managed by this widget class (rare)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
365 @raise: ValueError when (iterable) or None is given to profiles for a widget class which manage one unique profile.
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
366 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
367 self.host = host
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
368 self.targets = set()
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
369 self.addTarget(target)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
370 self.profiles = set()
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
371 self._sync = True
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
372 if isinstance(profiles, str):
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
373 self.addProfile(profiles)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
374 elif profiles is None:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
375 if not self.PROFILES_ALLOW_NONE:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
376 raise ValueError("profiles can't have a value of None")
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
377 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
378 for profile in profiles:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
379 self.addProfile(profile)
2027
666b42c957b5 quick frontend (widget): minor profiles check on widget creation
Goffi <goffi@goffi.org>
parents: 2007
diff changeset
380 if not self.profiles:
666b42c957b5 quick frontend (widget): minor profiles check on widget creation
Goffi <goffi@goffi.org>
parents: 2007
diff changeset
381 raise ValueError("no profile found, use None for no profile classes")
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
382
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
383 @property
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
384 def profile(self):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
385 assert (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
386 len(self.profiles) == 1
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
387 and not self.PROFILES_MULTIPLE
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
388 and not self.PROFILES_ALLOW_NONE
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
389 )
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
390 return list(self.profiles)[0]
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
391
2855
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
392 @property
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
393 def target(self):
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
394 """Return main target
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
395
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
396 A random target is returned when several targets are available
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
397 """
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
398 return next(iter(self.targets))
ef65dbce313b quick frontend(widgets): added QuickWidget.target property as a helper method to get a single target:
Goffi <goffi@goffi.org>
parents: 2853
diff changeset
399
3112
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
400 @property
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
401 def widget_hash(self):
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
402 """Return quick widget hash"""
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
403 return self.getWidgetHash(self.target, self.profiles)
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
404
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
405 # synchronisation state
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
406
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
407 @property
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
408 def sync(self):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
409 return self._sync
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
410
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
411 @sync.setter
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
412 def sync(self, state):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
413 """state of synchronisation with backend
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
414
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
415 @param state(bool): True when backend is synchronised
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
416 False is set by core
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
417 True must be set by the widget when resynchronisation is finished
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
418 """
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
419 self._sync = state
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
420
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
421 def resync(self):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
422 """Method called when backend can be resynchronized
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
423
3108
07aac71ea31f quick_frontend (widget): typo
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
424 The widget has to set self.sync itself when the synchronisation is finished
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
425 """
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
426 pass
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
427
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
428 # target/profile
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
429
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
430 def addTarget(self, target):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
431 """Add a target if it doesn't already exists
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
432
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
433 @param target: target to add
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
434 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
435 self.targets.add(target)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
436
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
437 def addProfile(self, profile):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
438 """Add a profile is if doesn't already exists
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
439
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
440 @param profile: profile to add
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
441 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
442 if self.profiles and not self.PROFILES_MULTIPLE:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
443 raise ValueError("multiple profiles are not allowed")
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
444 self.profiles.add(profile)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
445
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
446 # widget identitication
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
447
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
448 @staticmethod
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
449 def getWidgetHash(target, profiles):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
450 """Return the hash associated with this target for this widget class
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
451
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
452 some widget classes can manage several target on the same instance
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
453 (e.g.: a chat widget with multiple resources on the same bare jid),
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
454 this method allow to return a hash associated to one or several targets
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
455 to retrieve the good instance. For example, a widget managing JID targets,
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
456 and all resource of the same bare jid would return the bare jid as hash.
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
457
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
458 @param target: target to check
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
459 @param profiles: profile(s) associated to target, see __init__ docstring
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
460 @return: a hash (can correspond to one or many targets or profiles, depending of widget class)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
461 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
462 return str(target) # by defaut, there is one hash for one target
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
463
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
464 # widget life events
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
465
2047
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
466 def onDelete(self, *args, **kwargs):
2043
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
467 """Called when a widget is being deleted
1410
e2e75c3c7c7b quick_frontend, primitivus: fixes a couple of issues:
souliane <souliane@mailoo.org>
parents: 1396
diff changeset
468
2043
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
469 @return (boot, None): False to cancel deletion
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
470 all other value continue deletion
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
471 """
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
472 return True
3159
30e08d904208 quick_frontend (app, widget): CagouWidget.onSelected is called when the widget is selected:
Goffi <goffi@goffi.org>
parents: 3158
diff changeset
473
30e08d904208 quick_frontend (app, widget): CagouWidget.onSelected is called when the widget is selected:
Goffi <goffi@goffi.org>
parents: 3158
diff changeset
474 def onSelected(self):
30e08d904208 quick_frontend (app, widget): CagouWidget.onSelected is called when the widget is selected:
Goffi <goffi@goffi.org>
parents: 3158
diff changeset
475 """Called when host.selected_widget is this instance"""
30e08d904208 quick_frontend (app, widget): CagouWidget.onSelected is called when the widget is selected:
Goffi <goffi@goffi.org>
parents: 3158
diff changeset
476 pass