------------------------------------------------------------------------------ - 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.