summaryrefslogtreecommitdiffstats
path: root/lib/kofficecore/THOUGHTS
blob: f0121aa9162732e41c99503fe7905f9f3f3957ae (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
------------------------------------------------------------------------------
-  Bugs and missing features in the KOffice Library                          -
-  some initial brainstroming... comments? flames?                           -
------------------------------------------------------------------------------

1) Accurate Coordinates:
IMHO it's a must for KOffice applications to store reasonably accurate
coordinates. If zooming is supported I think we should try to make it work
up to zoom factors of ten (1000%) or so. This means you need some kind
of "spare precision". Another related issue is getting KOffice applications
support 1:1 sizes on the screen (i.e. that an A4 paper is A4 also on the
screen). Here the problem is that in X we can have a wide range of
resolutions (from 75 or so up to 120 dpi). We also can have different
resolutions in X and Y direction, but as Qt only honors one of them (the
Y resolution) I think it's safe to ignore the X resolution (see
QPaintDevice::x11AppDpiY()).
In lib/kofficeui we have some classes replacing QPoint/QRect (they use double
precision floating point numbers to store coordinates).

2) Embedding:
2.1) "Plain" KOffice embedding (paintContent):
We finally added two double values for the X and Y zoom factor. This means
using these values and the QRect argument we can "ask" the part to draw
certain areas of itself. One problem I still see with this method is, that we
only have a QRect there. It's not that problematic there because we can
agree on some hacks if it's not accurate enough (e.g. values * 100.0), or we
just agree that this QRect represents screen pixels at the given zoom value(s)
and the app can calculate the requested area to be painted itself. This should
solve zooming and "scrolling" problems.
One ugly problem also is what we will do about performance problems on
repainting a part. Some time ago we got a mail on KOffice where some guy
asked what to do about making that embedded painting faster. The reason is
that we *always* repaint the whole area, no matter what. This can easily be
optimized to a WNorthWestGravity like behavior, because you can't edit those
embedded parts anyway, so even kchart and other non-WNG apps support that.
( we have to translate the painter, of course).

### Zooming Special (copy from DESIGN_zooming in kofficecore):
There are two kinds of zooming:
 
1) View Zooming:
This kind of zooming is only done by full KoViews, regardless
whether they are the root views (not embedded), or they are
*active* embedded views. There only has to be a KoView object.
 
There is *one* zoom factor for both axes (x/y) and the whole
content (text, objects, children,...) is zoomed accordingly.
 
This kind of zooming is like the zoom support you know from
other applications.
 
 
2) Child Zooming:
Imagine you'd like to show a certain part of an embedded
document, but you have to fill a specified area. At the
moment this is "impossible" (we know that it's kind of
possible, but it's not straightforward) because when you
resize the child's frame, the contents resize, too. Due
to that you see more of the child's content :)
 
The solution will be: If you simply resize a frame, the
child document will resize, too, and show more contents.
If you press Alt/Meta during resizing, the child's
content will stay the same, but it will be zoomed to
fit the rectangle you specify.
Pressing Shift gives you a constant width/height ratio
during resizing.
Pressing Alt+Shift is allowed, too, if you can do that :p
 
As you already know we'll support a zoom factor for
each axe here. (i.e. x/y zoom factors)

Related to that is child-panning. Indepenent of the zoom factor
the child shouldn't just show the left/top corner, but it should
"remember" the position inside the document when it's repainted
as inactive child.
###

If a part doesn't support zooming natively we have to fall back to WMartix
hacks (don't know how we can "ask" a part about that, but I'm sure we find
some BC way).

2.2) Widget embedding:
That's a tough topic... but let's see... There are a few different possibilities
we have to treat differently:
a) plain KParts:
We can only embed the widgets obviously. Printing will look horribly, but
I think we should support that nonetheless. Imagine a KPresenter (screen)
presentation with an embedded video player part on some page :))
I'd say when printing those files the parts aren't printed at all by default...
makes more sense to me than redirecting an ugly 96dpi printout to some
QPrinter... well. It should at least be possible to print that stuff and get
some crappy output (but at least some output, e.g. an empty frame with some
text information about the part in it). Of course the user should be warned
before embedding such parts :)
b) embedding special KOffice parts as widgets:
Here we can simply add one entry "X-KDE-EmbedAsWidget" or so to our
.desktop files for KOffice parts. This will guarantee then that this special
part wants to be embedded as a widget. This surely makes sense, but still
we have some problems on printing... no idea how to solve that one. Maybe
we should use the widget for viewing on the screen and fall back to a plain
paintContents when printing.

General embedding stuff:
Do we support the "transparent" flag in paintContent with all parts we have?
IMHO it's a nice feature and we sould keep it, but if no part supports it...
well :]
Maybe we'll have to add a X-KDE-DoNotEmbed flag to the .desktop files
at some point. These parts should be excluded in the part select dia, then.

3) Handling of embedded parts:
This is one of the most annoying things in KOffice. Every application
handles embedded parts different. Of course this makes sense for most
of the cases, but maybe we can make that a bit more consistent at least
among "object-based" applications like KPresenter, Kivio, and KIllustrator.

4) Printing:
Here the problem is that even Qt has enough problems with printing :(
We definitely need some magic here, because right now we don't take
any advantage of the better resolution of the printer. This will be a hard
job (and an ugly hack) even if we have accurate coordinates and so
on. Lars told me that QPainter will have some setResolution call for
printing in 3.0... let's see. As a temporary solution he suggested to scale
the painter by 0.1 and print 10 times as big... don't know if that works.

5) Shell menus:
The Help -> About entry should be the one for the active part.

6) Image handling:
We need one class (IMVHO a part is too much overhead) which properly
handles all kinds of images. Internal ones, external ones, maybe thumbnails,
proper rescaling w/o any quality loss on rescaling again and again (read:
keep the original around),... Fortunately Simon already implemented most of it.
He also suggested that we need a very tiny KOffice part which just can
display images. That way we can finally support images in KSpread and other
non-object based apps.

7) Colors:
What about RGB-CMYK-HSV-LAB-... should this be solved in the KOffice libs?
I see some code for this in krayon, and maybe Matthias Elter or gis can help
us with that one.

8) General configuration options:
Do we need a KOffice kcm? What to configure there?
e.g.:
- start default template (which one :) (start without any template dialog)
- default page size
- default unit
- ...

9) Make it possible for components to provide their own about dialog.
   What's currently needed to acomplish this is an awful addShell()
   hack, like in kivio_doc.cpp .
    
   Possible solution:
   Make a slot in KoMainWindow call a virtual method in KoDocument which
   calls back the real show-about method. That would give components the
   ability to re-implement that very method and be done.

   Disadvantage: breaks binary compatibility.
   Possible workaround for the BC breakage: Don't call a virtual method
   but call/connect-to a slot in the document only if it exists and
   call the default show-about method otherwise.