annotate sat_frontends/quick_frontend/quick_widgets.py @ 3159:30e08d904208

quick_frontend (app, widget): CagouWidget.onSelected is called when the widget is selected: A property is now used to manage `selected_widget` in QuickApp, and widget's onSelected method is called when suitable.
author Goffi <goffi@goffi.org>
date Sun, 09 Feb 2020 23:50:21 +0100
parents 6032245c927e
children 7699a08ba8fb
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
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
98 def getWidgets(self, class_, target=None, profiles=None):
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
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
108 @return: iterator on widgets
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
109 """
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
110 class_ = self.getRealClass(class_)
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
111 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
112 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
113 except KeyError:
2007
19b9d3f8a6c7 plugin XEP-0085, quick_frontends, primitivus: chat states are working again
Goffi <goffi@goffi.org>
parents: 1995
diff changeset
114 return
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
115 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
116 if target is not None:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
117 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
118 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
119 filter_hash = None
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
120 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
121 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
122 yield widget
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
123 else:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
124 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
125 for widget in widget_instances:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
126 yield widget
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
127
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
128 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
129 """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
130
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
131 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
132 @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
133 @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
134 @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
135 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
136 @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
137 """
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
138 assert (target is not None) or (profiles is not None)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
139 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
140 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
141 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
142 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
143 try:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
144 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
145 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
146 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
147
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
148 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
149 """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
150
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
151 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
152 @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
153 @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
154 @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
155 @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
156 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
157 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
158 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
159 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
160 [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
161 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
162 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
163 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
164 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
165 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
166 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
167 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
168 [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
169 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
170 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
171 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
172 @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
173 """
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
174 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
175
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
176 ## arguments management ##
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
177 _args = [self.host, target] + list(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
178 args
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
179 ) 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
180 _kwargs = kwargs or {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
181 if "profiles" in _kwargs and "profile" in _kwargs:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
182 raise ValueError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
183 "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
184 )
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
185 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
186 _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
187 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
188 if not "profiles" in _kwargs:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
189 _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
190
2792
441b536e28ed quick frontend (chat): use right type in getOrCreateWidget on new message
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
191 # 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
192 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
193 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
194 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
195 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
196
2792
441b536e28ed quick frontend (chat): use right type in getOrCreateWidget on new message
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
197 # 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
198 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
199 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
200 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
201 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
202
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 ## 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
204 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
205 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
206 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
207 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
208
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
209 ## 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
210
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
211 widgets_map = self._widgets.setdefault(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
212 cls.__name__, {}
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
213 ) # 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
214 if not cls.SINGLE:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
215 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
216 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
217 try:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
218 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
219 except KeyError:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
220 widget = None
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
221 else:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
222 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
223
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
224 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
225 # we need to create a new widget
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
226 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
227 widget = cls(*_args, **_kwargs)
3114
060ac43627fc quick frontend (widgets): fixed widget creation in getOrCreateWidget:
Goffi <goffi@goffi.org>
parents: 3112
diff changeset
228 widgets_map.setdefault(hash_, []).append(widget)
0
goffi@necton2
parents:
diff changeset
229
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
230 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
231 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
232 elif callable(on_new_widget):
1322
1f13a837e4b2 quick_frontend (quick_widgets): revert commit 1319
souliane <souliane@mailoo.org>
parents: 1321
diff changeset
233 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
234 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
235 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
236 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
237 # 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
238 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
239 pass
1309
d0d5ba3b4d64 quick frontend(quick widgets): fixed bad condition test in previous commit
Goffi <goffi@goffi.org>
parents: 1308
diff changeset
240 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
241 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
242 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
243 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
244 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
245 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
246 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
247 else:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
248 recreateArgs(_args, _kwargs)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
249 widget = cls(*_args, **_kwargs)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
250 widgets_map[hash_].append(widget)
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
251 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
252 .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
253 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
254 widget = on_existing_widget(widget)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
255 if widget is None:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
256 raise exceptions.InternalError(
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
257 "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
258 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
259 log.debug(
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
260 "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
261 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
262 else:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
263 raise exceptions.InternalError(
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
264 "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
265
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
266 return widget
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
267
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
268 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
269 """Delete a widget instance
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
270
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
271 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
272 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
273 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
274 @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
275 @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
276 @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
277 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
278 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
279 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
280 - "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
281 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
282 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
283 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
284 - "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
285 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
286 the same time.
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
287 """
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
288 # 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
289 # but will be with Python 3
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
290 all_instances = kwargs.get('all_instances', False)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
291
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
292 if all_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
293 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
294 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
295 log.debug(
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
296 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
297 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
298 else:
3116
328a6cea3802 quick frontend (widgets): don't use *args for onDelete + more debug logs
Goffi <goffi@goffi.org>
parents: 3115
diff changeset
299 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
300 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
301 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
302
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
303 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
304 self.host.selected_widget = None
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
305
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
306 class_ = self.getRealClass(widget_to_delete.__class__)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
307 try:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
308 widgets_map = self._widgets[class_.__name__]
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
309 except KeyError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
310 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
311 return
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
312 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
313 widget_to_delete.profiles))
3115
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
314 try:
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
315 widget_instances = widgets_map[widget_hash]
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
316 except KeyError:
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
317 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
318 return
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
319 if all_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
320 widget_instances.clear()
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
321 else:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
322 try:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
323 widget_instances.remove(widget_to_delete)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
324 except ValueError:
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
325 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
326 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
327
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
328 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
329
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
330 if not widget_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
331 # all instances with this hash have been deleted
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
332 # we remove the hash itself
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
333 del widgets_map[widget_hash]
3115
3018d153a615 quick frontend (widgets): some more errors handling in getOrCreateWidget
Goffi <goffi@goffi.org>
parents: 3114
diff changeset
334 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
335 .format(cls=class_, widget_hash=widget_hash))
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
336
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
337
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
338 class QuickWidget(object):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
339 """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
340 # 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
341 # 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
342 # 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
343 # 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
344
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
345 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
346 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
347 PROFILES_ALLOW_NONE = False # If True, this widget can be used without profile
0
goffi@necton2
parents:
diff changeset
348
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
349 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
350 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
351 @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
352 @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
353 @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
354 - (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
355 - (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
356 - 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
357 @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
358 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
359 self.host = host
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
360 self.targets = set()
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
361 self.addTarget(target)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
362 self.profiles = set()
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
363 self._sync = True
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
364 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
365 self.addProfile(profiles)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
366 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
367 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
368 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
369 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
370 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
371 self.addProfile(profile)
2027
666b42c957b5 quick frontend (widget): minor profiles check on widget creation
Goffi <goffi@goffi.org>
parents: 2007
diff changeset
372 if not self.profiles:
666b42c957b5 quick frontend (widget): minor profiles check on widget creation
Goffi <goffi@goffi.org>
parents: 2007
diff changeset
373 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
374
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
375 @property
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
376 def profile(self):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
377 assert (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
378 len(self.profiles) == 1
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
379 and not self.PROFILES_MULTIPLE
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
380 and not self.PROFILES_ALLOW_NONE
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
381 )
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
382 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
383
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
384 @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
385 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
386 """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
387
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
388 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
389 """
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
390 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
391
3112
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
392 @property
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
393 def widget_hash(self):
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
394 """Return quick widget hash"""
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
395 return self.getWidgetHash(self.target, self.profiles)
91891a108d6f quick frontend (widgets): added "widget_hash" helper property
Goffi <goffi@goffi.org>
parents: 3108
diff changeset
396
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
397 # synchronisation state
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
398
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
399 @property
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
400 def sync(self):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
401 return self._sync
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
402
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
403 @sync.setter
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
404 def sync(self, state):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
405 """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
406
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
407 @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
408 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
409 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
410 """
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
411 self._sync = state
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
412
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
413 def resync(self):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
414 """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
415
3108
07aac71ea31f quick_frontend (widget): typo
Goffi <goffi@goffi.org>
parents: 3028
diff changeset
416 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
417 """
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
418 pass
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
419
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
420 # target/profile
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
421
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
422 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
423 """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
424
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
425 @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
426 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
427 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
428
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
429 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
430 """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
431
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
432 @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
433 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
434 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
435 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
436 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
437
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
438 # widget identitication
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
439
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
440 @staticmethod
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
441 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
442 """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
443
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
444 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
445 (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
446 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
447 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
448 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
449
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
450 @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
451 @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
452 @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
453 """
3028
ab2696e34d29 Python 3 port:
Goffi <goffi@goffi.org>
parents: 2888
diff changeset
454 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
455
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
456 # widget life events
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
457
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
458 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
459 """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
460
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
461 @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
462 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
463 """
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
464 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
465
30e08d904208 quick_frontend (app, widget): CagouWidget.onSelected is called when the widget is selected:
Goffi <goffi@goffi.org>
parents: 3158
diff changeset
466 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
467 """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
468 pass