Implementing KTextEditor interfaces in KDevelop
Milian Wolff
mail at milianw.de
Mon Sep 15 16:54:29 UTC 2014
On Monday 15 September 2014 18:25:06 Dominik Haumann wrote:
> On Monday 15 September 2014 18:14:52 Milian Wolff wrote:
> > On Monday 15 September 2014 18:02:28 Sven Brauch wrote:
> > > Hi!
> > >
> > > I'm experimenting with implementing the KTextEditor interfaces in
> > > KDevelop so we can load all the plugins. I have a proof of concept
> > > which can load the snippets plugin and execute snippets in a view [1],
> > > [2].
> > >
> > > One thing which does not work very well is the toolview interface. The
> > > KTE interface is designed so that the plugin can say "make me a
> > > toolview and give me the widget so I can put my stuff in it". In
> > > KDevelop (or rather, sublime), you can only register a toolview
> > > factory (= factory for the widget) and sublime will instantiate the
> > > widget when required. It's not clear how to connect those two
> > > interfaces, since when creating a view, a KTE plugin immediately wants
> > > a widget to populate, but sublime doesn't give you that.
> > >
> > > In my proof of concept solution, I use a factory which has one fixed
> > > widget for each toolview, but that feels very bad.
> >
> > Some more input from my side. I think we are misunderstanding the API a
> > bit, or maybe there are some issues.
> >
> > a) I find it wrong that a plugin queries the mainwindow for a widget and
> > embeds itself into it. Rather, I'd think it should work the other way
> > around. The mainwindow asks the plugin for a widget and embeds that window
> > as appropriate. I assumed this is actually how Plugin::createView should
> > be
> > used, but Sven said that this in turn calls MainWindow::createToolView.
> > Indeed, e.g. KateSQLPlugin::createView looks harmless, but in the
> > KateSQLView ctor it creates toolviews at hardcoded positions. What if the
> > user moves the toolviews? See below...
> >
> > Apparently a single plugin has multiple views in KTextEditor? The "main"
> > view that is returned by Plugin::createView and "secondary" views created
> > by KTE::MW::createToolView?
>
> The KTextEditor plugins still support multiple MainWindows.
> Plugin::createView() should be called for each MainWindow exactly once.
> Since in KDevelop you only have one main window, you call it only once.
> No problem here.
>
> Think of createView() as "hey loaded plugin, if you want to hook into the
> mainwindow (xml gui client, tool views), do this now".
OK, the only thing that I find odd then is this:
QWidget* toolview = mw->createToolView(...);
// now I want to add custom widgets here, what should I do?
currently, you create new widgets and pass in the toolview as parent. I've
also seen the very ugly
toolView->layout()->addItem(layout);
(see kateprojectpluginview.cpp)
This will always mean that the host app must create a dummy widget with a
dummy layout and pass that to the plugin. Generally, I think "createToolView"
is misnamed. It should be addToolView and take a QWidget that a plugin wants
to show in a toolview as a paramter.
> > b) A plugin may have the notion of where to put itself by default, but it
> > should not do so itself. This is how I understood the current API to work
> > (very rough quick glance only). The user may move the toolview to a
> > different position, and when the host app is restarted, it will recreate
> > the gui and put the plugin into the right place. With the KTE interface,
> > every plugin will need to do that themselves, no? Otherwise they will
> > always create the toolview in the same place?
>
> No, KDevelop needs to put the toolviews at a location depending on the
> identifier. Note, that
> KTE::MainWindow::createToolView(KTextEditor::Plugin *plugin,
> const QString &identifier,
> KTextEditor::MainWindow::ToolViewPosition
> pos, const QIcon &icon,
> const QString &text)
>
> takes a unique identifier as 2nd parameter. So when the plugin asks for
> 'pos', you look in KDevelop whether you already have a location for
> 'identifier', and if so, you ignore 'pos'. This way, you get session
> save&restore without flickering. So no, a plugin does not maintain itself
> where it is located, it just tells the host application a preference
> location.
Ah, right. The apidox even say that. Sorry for the confusion here.
> > c) Too bad we notice this now, after Akademy...
>
> I don't see an issue so far ;)
Let's hope it stays this way :)
--
Milian Wolff
mail at milianw.de
http://milianw.de
More information about the KDevelop-devel
mailing list