annotate sat_frontends/quick_frontend/quick_widgets.py @ 2854:eb9fa72eb62b

core: added a "_debug" signal: this signal is a generic debugging signal which can be implemented in frontends to do specific actions, like printing data dumps.
author Goffi <goffi@goffi.org>
date Sun, 10 Mar 2019 18:04:01 +0100
parents 6901a425d882
children ef65dbce313b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1934
2daf7b4c6756 use of /usr/bin/env instead of /usr/bin/python in shebang
Goffi <goffi@goffi.org>
parents: 1766
diff changeset
1 #!/usr/bin/env python2
0
goffi@necton2
parents:
diff changeset
2 # -*- coding: utf-8 -*-
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
2771
003b8b4b56a7 date update
Goffi <goffi@goffi.org>
parents: 2624
diff changeset
5 # Copyright (C) 2009-2019 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
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
32 unicode("") # XXX: unicode doesn't exist in pyjamas
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
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
37 unicode = str
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"""
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
66 for widget_map in self._widgets.itervalues():
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
67 for widget_instances in widget_map.itervalues():
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 """
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
96 try:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
97 target = widget.target
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
98 except AttributeError:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
99 target = next(iter(widget.targets))
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
100 return self.getWidgets(widget.__class__, 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
101
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
102 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
103 """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
104
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
105 @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
106 [getOrCreateWidget]
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
107 @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
108 corresponding widgets
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
109 recreated widgets are handled
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
110 @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
111 profiles
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
112 @return: iterator on widgets
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
113 """
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
114 class_ = self.getRealClass(class_)
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
115 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
116 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
117 except KeyError:
2007
19b9d3f8a6c7 plugin XEP-0085, quick_frontends, primitivus: chat states are working again
Goffi <goffi@goffi.org>
parents: 1995
diff changeset
118 return
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
119 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
120 if target is not None:
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 = unicode(class_.getWidgetHash(target, profiles))
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
122 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
123 filter_hash = None
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
124 if filter_hash is not None:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
125 for widget in widgets_map[filter_hash]:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
126 yield widget
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
127 else:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
128 for widget_instances in widgets_map.itervalues():
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
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
131
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
132 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
133 """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
134
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
135 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
136 @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
137 @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
138 @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
139 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
140 @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
141 """
1938
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
142 assert (target is not None) or (profiles is not None)
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
143 if profiles is not None and isinstance(profiles, unicode):
011eff37e21d quick frontend, primitivus: quickContactList refactored to handle several profiles at once
Goffi <goffi@goffi.org>
parents: 1934
diff changeset
144 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
145 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
146 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
147 try:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
148 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
149 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
150 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
151
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
152 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
153 """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
154
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
155 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
156 @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
157 @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
158 @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
159 @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
160 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
161 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
162 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
163 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
164 [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
165 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
166 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
167 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
168 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
169 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
170 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
171 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
172 [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
173 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
174 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
175 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
176 @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
177 """
1290
faa1129559b8 core, frontends: refactoring to base Libervia on QuickFrontend (big mixed commit):
Goffi <goffi@goffi.org>
parents: 1265
diff changeset
178 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
179
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
180 ## arguments management ##
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
181 _args = [self.host, target] + list(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
182 args
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
183 ) 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
184 _kwargs = kwargs or {}
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
185 if "profiles" in _kwargs and "profile" in _kwargs:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
186 raise ValueError(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
187 "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
188 )
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
189 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
190 _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
191 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
192 if not "profiles" in _kwargs:
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
193 _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
194
2792
441b536e28ed quick frontend (chat): use right type in getOrCreateWidget on new message
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
195 # 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
196 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
197 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
198 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
199 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
200
2792
441b536e28ed quick frontend (chat): use right type in getOrCreateWidget on new message
Goffi <goffi@goffi.org>
parents: 2771
diff changeset
201 # 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
202 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
203 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
204 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
205 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
206
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
207 ## 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
208 try:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
209 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
210 except KeyError:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
211 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
212
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
213 ## 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
214
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
215 widgets_map = self._widgets.setdefault(
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
216 cls.__name__, {}
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
217 ) # 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
218 if not cls.SINGLE:
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
219 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
220 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
221 try:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
222 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
223 except KeyError:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
224 widget = None
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
225 else:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
226 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
227
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
228 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
229 # we need to create a new widget
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
230 log.debug(u"Creating new widget for target {} {}".format(target, cls))
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
231 widget = cls(*_args, **_kwargs)
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
232 widgets_map[hash_] = [widget]
0
goffi@necton2
parents:
diff changeset
233
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
234 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
235 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
236 elif callable(on_new_widget):
1322
1f13a837e4b2 quick_frontend (quick_widgets): revert commit 1319
souliane <souliane@mailoo.org>
parents: 1321
diff changeset
237 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
238 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
239 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
240 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
241 # 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
242 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
243 pass
1309
d0d5ba3b4d64 quick frontend(quick widgets): fixed bad condition test in previous commit
Goffi <goffi@goffi.org>
parents: 1308
diff changeset
244 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
245 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
246 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
247 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
248 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
249 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
250 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
251 else:
2852
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
252 recreateArgs(_args, _kwargs)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
253 widget = cls(*_args, **_kwargs)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
254 widgets_map[hash_].append(widget)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
255 log.debug(u"widget <{wid}> already exists, a new one has been recreated"
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
256 .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
257 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
258 widget = on_existing_widget(widget)
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
259 if widget is None:
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
260 raise exceptions.InternalError(
e2595c81eb6d quick frontend(widgets): improved handling of multiple instances of widgets:
Goffi <goffi@goffi.org>
parents: 2851
diff changeset
261 u"on_existing_widget method must return the widget to use")
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
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
277 the extra arguments are not use by QuickFrontend, it's is up to
7f5e344938c1 quick_frontend(quick_widgets): deleteWidget can use additional arguments which will be passed to onDelete
Goffi <goffi@goffi.org>
parents: 2043
diff changeset
278 the frontend to use them or not
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
279 "all_instances" can be used as kwarg, if it evaluate to True, all
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
280 instances of the widget will be deleted (if onDelete is not returning False
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
281 for any of the instance). This arguments is not sent to onDelete methods.
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
282 """
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
283 # 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
284 # but will be with Python 3
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
285 all_instances = kwargs.get('all_instances', False)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
286
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
287 if all_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
288 for w in self.getWidgetInstances(widget_to_delete):
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
289 if w.onDelete(*args, **kwargs) == False:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
290 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
291 else:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
292 if widget_to_delete.onDelete(*args, **kwargs) == False:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
293 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
294
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
295 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
296 self.host.selected_widget = None
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
297
2853
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
298 class_ = self.getRealClass(widget_to_delete.__class__)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
299 try:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
300 widgets_map = self._widgets[class_.__name__]
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
301 except KeyError:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
302 log.error(u"no widgets_map found for class {cls}".format(cls=class_))
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
303 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
304 widget_hash = unicode(class_.getWidgetHash(widget_to_delete.target,
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
305 widget_to_delete.profiles))
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
306 widget_instances = widgets_map[widget_hash]
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
307 if all_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
308 widget_instances.clear()
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
309 else:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
310 try:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
311 widget_instances.remove(widget_to_delete)
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
312 except ValueError:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
313 log.error(u"widget_to_delete not found in widget instances")
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
314 return
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
315
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
316 log.debug(u"widget {} deleted".format(widget_to_delete))
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
317
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
318 if not widget_instances:
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
319 # all instances with this hash have been deleted
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
320 # we remove the hash itself
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
321 del widgets_map[widget_hash]
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
322 log.debug(u"All instances of {cls} with hash {widget_hash} have been deleted"
6901a425d882 quick frontend (widgets): improved deletion of widget:
Goffi <goffi@goffi.org>
parents: 2852
diff changeset
323 .format(cls=class_, widget_hash=widget_hash))
1303
d3ef3894254d quick frontend (quick_widgets): add deleteWidget method
Goffi <goffi@goffi.org>
parents: 1301
diff changeset
324
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
325
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
326 class QuickWidget(object):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
327 """generic widget base"""
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
328
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
329 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
330 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
331 PROFILES_ALLOW_NONE = False # If True, this widget can be used without profile
0
goffi@necton2
parents:
diff changeset
332
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
333 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
334 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
335 @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
336 @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
337 @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
338 - (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
339 - (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
340 - 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
341 @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
342 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
343 self.host = host
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
344 self.targets = set()
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
345 self.addTarget(target)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
346 self.profiles = set()
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
347 self._sync = True
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
348 if isinstance(profiles, basestring):
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
349 self.addProfile(profiles)
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
350 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
351 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
352 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
353 else:
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
354 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
355 self.addProfile(profile)
2027
666b42c957b5 quick frontend (widget): minor profiles check on widget creation
Goffi <goffi@goffi.org>
parents: 2007
diff changeset
356 if not self.profiles:
666b42c957b5 quick frontend (widget): minor profiles check on widget creation
Goffi <goffi@goffi.org>
parents: 2007
diff changeset
357 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
358
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
359 @property
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
360 def profile(self):
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
361 assert (
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
362 len(self.profiles) == 1
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
363 and not self.PROFILES_MULTIPLE
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
364 and not self.PROFILES_ALLOW_NONE
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
365 )
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
366 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
367
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
368 # synchronisation state
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
369
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
370 @property
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
371 def sync(self):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
372 return self._sync
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
373
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
374 @sync.setter
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
375 def sync(self, state):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
376 """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
377
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
378 @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
379 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
380 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
381 """
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
382 self._sync = state
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
383
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
384 def resync(self):
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
385 """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
386
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
387 The widget has to set self.sync itself when the synchronisation if finished
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
388 """
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
389 pass
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
390
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
391 # target/profile
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
392
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
393 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
394 """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
395
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
396 @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
397 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
398 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
399
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
400 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
401 """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
402
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
403 @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
404 """
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
405 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
406 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
407 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
408
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
409 # widget identitication
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
410
1265
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
411 @staticmethod
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
412 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
413 """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
414
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
415 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
416 (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
417 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
418 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
419 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
420
e3a9ea76de35 quick_frontend, primitivus: multi-profiles refactoring part 1 (big commit, sorry :p):
Goffi <goffi@goffi.org>
parents: 1139
diff changeset
421 @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
422 @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
423 @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
424 """
2624
56f94936df1e code style reformatting using black
Goffi <goffi@goffi.org>
parents: 2562
diff changeset
425 return unicode(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
426
2851
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
427 # widget life events
7764383a968c quick_frontend (widget, chat): implementation of new sync mechanism, first draft:
Goffi <goffi@goffi.org>
parents: 2845
diff changeset
428
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
429 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
430 """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
431
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
432 @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
433 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
434 """
f3940f6a3222 quick frontend (widgets): a deletion with onDelete can now be cancelled if onDelete return False
Goffi <goffi@goffi.org>
parents: 2039
diff changeset
435 return True