Improving generic KPart support in KDevelop (by example of Okteta)

Andreas Pakulat apaku at gmx.de
Thu Aug 6 10:15:50 UTC 2009


On 06.08.09 00:05:22, Friedrich W. H. Kossebau wrote:
> Mercredi, le 5 août 2009, à 21:53, Andreas Pakulat a écrit:
> > On 05.08.09 17:55:56, Friedrich W. H. Kossebau wrote:
> > > And the next stone I lifted showed me what stops ReadWriteParts in
> > > KDevelop:
> > >
> > > While a PartDocument collects all KParts for the same url, there is no
> > > guarantee that these KParts share the same data object, so a change in
> > > one KPart would be synchronized with the others -> so on a save it is
> > > unclear from what KPart to take the data to save back to the url.
> >
> > I'm not sure what you mean here. We're creating a new part for each
> > widget (and hence each view) as far as I can see. So yes this poses the
> > problem of opening two views from the same URL and saving changes in one
> > and afterwards in the other. However thats something thats ok IMHO if we
> > really want read-write-parts in kdevelop. In worst case the user can go
> > to the first document again, do a small change, save, revert it and save
> > again. The KPart API doesn't allow anything else, unless you put a new
> > API on top of that (like the KTextEditor API).
> 
> Yes, that's what I meant.
> 
> I wonder if the average user will welcome a  behaviour where all non-text 
> documents have to be treated differently. I fear it just calls for accidents 
> if the same file can be loaded/edited several times in the same program, 
> especially if you have multiple tabs open and hardly an overview which tab is 
> which.
> 
> IMHO KParts are simply failing here. KDev* classes/plugins are needed.
> Or wait, there is the solution that was done for Konqueror with the 
> Browser/Extension service type. There could be a type Editor/Extension 
> (better name perhaps) derived from KPart/ReadWritePart, which would have 
> support for a shared data/document object system per URL.

hmm, that might work yes. But of course we'd need to add that to all parts
in trunk/KDE at least...
 
> Ideally a solution would be as reusable as possible, so other IDE frameworks 
> might be able to pick it up, too, even if Sublime/KDevelop is as great as it 
> is ;) But as there is no other IDE to test the API and all solutions need new 
> code the KDev* classes/plugins might be the best way for now. There is always 
> KDE5 ;)

Well, so far we're not guaranteeing any BC for our own code and creating a
new interface is BC too. Fortunately KPart's are dlopen'ed and as such
don't fall into the "have-to-keep-BC" category.

> > > Solutions:
> > > a) make all but the first one readonly if it is a ReadWritePart
> > > b) allow only one ReadWritePart loaded per URL
> > > c) just skip any support for ReadWrite modus of KParts
> > >
> > > I would go for option c), keeping the status-quo.
> >
> > I'd opt for that too for now. We can easily change this later on if
> > there's demand for a read-write part and then worry about wether/how we
> > handle the above mentioned problem.
> >
> > > It would just need a fix to
> > > set any ReadWrite part to readonly, which isn't done currently. This
> > > would be done by passing "KParts/ReadOnlyPart" to the factory as
> > > classname from PartDocument. Should I try to prepare a patch which adds
> > > the classname as optional argument to PartController::createPart( const
> > > KUrl& url ) ?
> >
> > Hmm, how about doing it inside PartDocument itself by simply checking if
> > we can cast the KPart* to a ReadWritePart and then call
> > setReadWrite(false) on it before adding the part to the partcontroller?
> > That would allow to change our minds later on without having to carry on
> > the then-useless extra parameter...
> 
> Because this is going to be a public API? Hm.
> Just, until then the users may wonder why they see all the modification 
> actions in the menu but can't use them. Because, as you might know,

No I don't know, I didn't have too much contact with KParts so far, in
particular I don't know about such differences in behaviour between
readwrite and readonly parts..

> the classname parameter that is passed to the factory is used to tell the
> KPart how it is going to be used. And by this information it at least
> sets up it's actions and properties (e.g. as KPart/ReadOnlyPart all
> modifying actions are dropped, some use even a different ui.rc file).

I'll have to dig into the source to know for sure, but IMHO this should be
exactly the same as if I do a setReadWrite(false) on the readwrite part. It
can still remove actions from its collection at that point or simply use a
different xmlgui rc file. We're only adding it to the factory after that
call.

> Users angry about actions visible but unaccessable might be more pain than a 
> perhaps useless parameter?

Yes, if setReadWrite doesn't work as we'd like it then thats better indeed.

> I am now rather going to do the Okteta extension for KDevelop by using the 
> KDev* classes, as proposed, in one of the next weeks. A disadvantage is the 
> dependencies both on kdeutils and kdevplatform, but that might be solved as 
> for the Kompare stuff.

Yeah, we've had a similar runtime-dep in kdev3 on khexedit for using its
memoryviewer. If we can avoid a compile time dep that would be great, but
its not a big deal if we cannot.

Andreas 

-- 
Living your life is a task so difficult, it has never been attempted before.




More information about the KDevelop-devel mailing list