2 Copyright 2008 Google Inc.
4 Licensed under the Apache License, Version 2.0 (the "License");
5 you may not use this file except in compliance with the License.
6 You may obtain a copy of the License at
8 http://www.apache.org/licenses/LICENSE-2.0
10 Unless required by applicable law or agreed to in writing, software
11 distributed under the License is distributed on an "AS IS" BASIS,
12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 See the License for the specific language governing permissions and
14 limitations under the License.
18 #include <QtGui/QGraphicsWidget>
19 #include <QtGui/QFontDatabase>
20 #include <ggadget/common.h>
21 #include <ggadget/logger.h>
22 #include <ggadget/qt/qt_view_host.h>
23 #include <ggadget/script_runtime_manager.h>
24 #include <ggadget/gadget_consts.h>
25 #include <ggadget/decorated_view_host.h>
26 #include <ggadget/docked_main_view_decorator.h>
27 #include <ggadget/popout_main_view_decorator.h>
28 #include <ggadget/details_view_decorator.h>
29 #include <ggadget/permissions.h>
30 #include <ggadget/qt/utilities.h>
31 #include <ggadget/qt/qt_view_host.h>
32 #include <ggadget/gadget.h>
34 #include <Plasma/Applet>
35 #include "plasma_view_host.h"
36 #include "plasma_host.h"
37 #include "panel_decorator.h"
38 #include "floating_decorator.h"
42 class PlasmaHost::Private
{
44 Private(GadgetInfo
*i
)
48 global_permissions_
.SetGranted(Permissions::ALL_ACCESS
, true);
51 void onCloseMainViewHandler() {
52 if (info
->expanded_main_view_host
)
54 info
->gadget
->RemoveMe(true);
57 void onCloseDetailsViewHandler() {
58 info
->gadget
->CloseDetailsView();
61 void onClosePopOutViewHandler() {
65 void onPopOutHandler() {
66 if (info
->expanded_main_view_host
!= NULL
) {
70 ViewInterface
*child
= info
->main_view_host
->GetView();
73 PlasmaViewHost
*vh
= new PlasmaViewHost(
74 info
, ViewHostInterface::VIEW_HOST_MAIN
, true);
75 PopOutMainViewDecorator
*view_decorator
=
76 new PopOutMainViewDecorator(vh
);
77 DecoratedViewHost
*dvh
= new DecoratedViewHost(view_decorator
);
78 view_decorator
->ConnectOnClose(
79 NewSlot(this, &Private::onClosePopOutViewHandler
));
81 // Send popout event to decorator first.
82 SimpleEvent
event(Event::EVENT_POPOUT
);
83 info
->main_view_host
->GetViewDecorator()->OnOtherEvent(event
);
85 child
->SwitchViewHost(dvh
);
86 dvh
->ShowView(false, 0, NULL
);
88 info
->expanded_main_view_host
= dvh
;
92 void onPopInHandler() {
93 if (!info
->expanded_main_view_host
) return;
94 ViewInterface
*child
= info
->expanded_main_view_host
->GetView();
98 child
->GetGadget()->CloseDetailsView();
100 child
->SwitchViewHost(info
->main_view_host
);
101 SimpleEvent
event(Event::EVENT_POPIN
);
102 info
->main_view_host
->GetViewDecorator()->OnOtherEvent(event
);
103 info
->expanded_main_view_host
->Destroy();
104 info
->expanded_main_view_host
= NULL
;
108 DecoratedViewHost
*newFloatingViewHost() {
109 PlasmaViewHost
* vh
= new PlasmaViewHost(
110 info
, ViewHostInterface::VIEW_HOST_MAIN
);
112 FloatingDecorator
*decorator
= new FloatingDecorator(vh
);
113 decorator
->ConnectOnClose(NewSlot(this, &Private::onCloseMainViewHandler
));
114 decorator
->ConnectOnPopOut(NewSlot(this, &Private::onPopOutHandler
));
115 decorator
->ConnectOnPopIn(NewSlot(this, &Private::onPopInHandler
));
116 DecoratedViewHost
*dvh
= new DecoratedViewHost(decorator
);
118 DLOG("NewViewHost: dvh(%p), pvh(%p), vd(%p)",
123 DecoratedViewHost
*newPanelViewHost() {
124 PlasmaViewHost
* vh
= new PlasmaViewHost(
125 info
, ViewHostInterface::VIEW_HOST_MAIN
);
127 PanelDecorator
*decorator
= new PanelDecorator(vh
);
128 if (isHorizontal(info
->applet
->location()))
129 decorator
->setHorizontal();
131 decorator
->setVertical();
132 decorator
->ConnectOnPopOut(NewSlot(this, &Private::onPopOutHandler
));
133 decorator
->ConnectOnPopIn(NewSlot(this, &Private::onPopInHandler
));
134 DecoratedViewHost
*dvh
= new DecoratedViewHost(decorator
);
135 DLOG("NewViewHost: dvh(%p), pvh(%p), vd(%p)",
141 Permissions global_permissions_
;
142 double gadget_w_
, gadget_h_
;
145 PlasmaHost::PlasmaHost(GadgetInfo
*info
)
146 : d(new Private(info
)) {
149 PlasmaHost::~PlasmaHost() {
153 ViewHostInterface
*PlasmaHost::NewViewHost(Gadget
*,
154 ViewHostInterface::Type type
) {
155 if (type
== ViewHostInterface::VIEW_HOST_MAIN
) {
156 if (d
->info
->applet
->location() == Plasma::Floating
) {
157 d
->info
->main_view_host
= d
->newFloatingViewHost();
159 d
->info
->main_view_host
= d
->newPanelViewHost();
161 return d
->info
->main_view_host
;
162 } else if (type
== ViewHostInterface::VIEW_HOST_OPTIONS
) {
163 ViewHostInterface
* vh
= new QtViewHost(type
, 1.0, 0, 0, NULL
);
164 d
->info
->options_view_host
= vh
;
167 ViewHostInterface
* vh
= new PlasmaViewHost(d
->info
, type
);
168 DetailsViewDecorator
*view_decorator
= new DetailsViewDecorator(vh
);
169 DecoratedViewHost
*dvh
= new DecoratedViewHost(view_decorator
);
170 view_decorator
->ConnectOnClose(
171 NewSlot(d
, &Private::onCloseDetailsViewHandler
));
172 d
->info
->details_view_host
= dvh
;
177 void PlasmaHost::RemoveGadget(Gadget
*gadget
, bool save_data
) {
178 // Please close me through plasma's button
181 bool PlasmaHost::LoadFont(const char *filename
) {
182 if (QFontDatabase::addApplicationFont(filename
) != -1)
188 int PlasmaHost::GetDefaultFontSize() {
189 return kDefaultFontSize
;
192 bool PlasmaHost::OpenURL(const ggadget::Gadget
*gadget
, const char *url
) {
193 return ggadget::qt::OpenURL(gadget
, url
);
196 Gadget
* PlasmaHost::LoadGadget(const char *path
, const char *options_name
,
197 int instance_id
, bool show_debug_console
) {
198 Q_UNUSED(instance_id
);
199 Q_UNUSED(show_debug_console
);
201 Gadget
*gadget
= new Gadget(this, path
, options_name
, 0,
202 d
->global_permissions_
,
203 Gadget::DEBUG_CONSOLE_DISABLED
);
205 if (!gadget
->IsValid()) {
206 LOG("Failed to load gadget %s", path
);
211 if (!gadget
->ShowMainView()) {
212 LOG("Failed to show main view of gadget %s", path
);
214 d
->info
->main_view_host
= NULL
;
218 if (gadget
->HasOptionsDialog()) {
219 d
->info
->script
->setHasConfigurationInterface(true);
225 void PlasmaHost::onConstraintsEvent(Plasma::Constraints constraints
) {
226 if (!d
->info
->main_view_host
) return;
228 if (constraints
& Plasma::FormFactorConstraint
) {
229 // TODO: Do something to handle it right
230 kDebug() << "FormFactorConstraint changed:" << d
->info
->applet
->formFactor();
233 if ((constraints
& Plasma::LocationConstraint
) &&
234 d
->info
->applet
->location() != d
->info
->location
) {
236 d
->onCloseDetailsViewHandler();
237 Plasma::Location loc
= d
->info
->applet
->location();
239 kDebug() << "LocationConstraint changed from " << d
->info
->location
242 if ((d
->info
->location
== Plasma::Floating
&& loc
!= Plasma::Floating
) ||
243 (d
->info
->location
!= Plasma::Floating
&& loc
== Plasma::Floating
)) {
244 DecoratedViewHost
*vh
;
245 if (loc
== Plasma::Floating
)
246 vh
= d
->newFloatingViewHost();
248 vh
= d
->newPanelViewHost();
250 // Send popout event here so elements like browser_element will know
251 // about it and they will hide themselves.
252 SimpleEvent
event(Event::EVENT_POPOUT
);
253 d
->info
->main_view_host
->GetViewDecorator()->OnOtherEvent(event
);
255 ViewInterface
*child
= d
->info
->main_view_host
->GetView();
256 ViewHostInterface
*old
= child
->SwitchViewHost(vh
);
259 d
->info
->main_view_host
= vh
;
260 SimpleEvent
event1(Event::EVENT_POPIN
);
261 vh
->GetViewDecorator()->OnOtherEvent(event1
);
263 // Must call it to get the aspectRatioMode of applet right.
264 // Maybe we can do it nicely in GGL.
265 vh
->GetViewDecorator()->GetViewHost()->SetResizable(
266 vh
->GetViewDecorator()->GetResizable());
268 vh
->ShowView(false, 0, NULL
);
269 } else if (isVertical(d
->info
->location
) != isVertical(loc
)) {
270 PanelDecorator
*decorator
= static_cast<PanelDecorator
*>(
271 d
->info
->main_view_host
->GetViewDecorator());
273 decorator
->setVertical();
275 decorator
->setHorizontal();
277 d
->info
->location
= loc
;
281 if (constraints
& Plasma::SizeConstraint
) {
282 ViewInterface
*view
= d
->info
->main_view_host
->GetViewDecorator();
284 QSizeF s
= d
->info
->applet
->size();
285 kDebug() << "size requested:" << s
;
286 double w
= s
.width();
287 double h
= s
.height();
289 if (view
->OnSizing(&w
, &h
)) {
290 kDebug() << "Original view size:" << view
->GetWidth()
291 << " " << view
->GetHeight();
293 kDebug() << "view size change to:" << w
<< " " << h
;
298 } // namespace ggadget