From: Thomas F. <tho...@ru...> - 2015-01-05 19:50:08
|
Git commit e816e415e77d6548f6bbbc5e5ae9b0669f5de352 by Thomas Friedrichsmeier. Committed on 05/01/2015 at 19:49. Pushed by tfry into branch 'master'. Finish implementing rk.set.plugin.status(). M +1 -0 ChangeLog M +28 -0 rkward/plugin/rkcomponentmap.cpp M +2 -1 rkward/plugin/rkcomponentmap.h M +11 -3 rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R A +58 -0 rkward/rbackend/rpackages/rkward/man/rk.list.plugins.Rd M +1 -0 rkward/rkward.h http://commits.kde.org/rkward/e816e415e77d6548f6bbbc5e5ae9b0669f5de352 diff --git a/ChangeLog b/ChangeLog index 136df96..250d3c0 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,4 @@ +- Add R function rk.set.plugin.status() to allow further customization of loaded plugins (hiding of individual menu entries) - TODO: With the improved interface to plugins from R, make sure plugins can actually be modified at runtime without crashing (close and re-open them) - Pluginmap-management was reworked, partially, and moved to Settings->Manage R packages and plugins - Provide more detailed information on loaded plugins in rk.list.plugins() diff --git a/rkward/plugin/rkcomponentmap.cpp b/rkward/plugin/rkcomponentmap.cpp index 5594cd5..982e24e 100644 --- a/rkward/plugin/rkcomponentmap.cpp +++ b/rkward/plugin/rkcomponentmap.cpp @@ -279,6 +279,21 @@ int RKComponentGUIXML::addEntries (RKComponentGUIXML::Menu *menu, XMLHelper &xml continue; } + // check if there is an override hiding this plugin (TODO: what if there is more than one override?) + bool hidden = false; + OverrideMap::const_iterator ov = overrides.constFind (id); + while (ov != overrides.constEnd () && ov.key () == id) { + const ComponentOverride &over = ov.value (); + if (over.context.isEmpty () || over.context == context) { + if (over.hidden) { + hidden = true; + break; + } + } + ++ov; + } + if (hidden) continue; + Entry *plug = new Entry (); plug->id = id; insertEntry (menu, plug, add_to); @@ -295,6 +310,17 @@ int RKComponentGUIXML::addEntries (RKComponentGUIXML::Menu *menu, XMLHelper &xml // static QMultiMap<QString, RKComponentGUIXML::ComponentOverride> RKComponentGUIXML::overrides; void RKComponentGUIXML::addOverride (const QString& id, const QString& context, bool visible) { + + OverrideMap::iterator ov = overrides.find (id); + while (ov != overrides.end () && ov.key () == id) { + const ComponentOverride &over = ov.value (); + if (over.context == context) { + overrides.erase (ov); + break; + } + ++ov; + } + ComponentOverride over; over.context = context; over.hidden = !visible; @@ -742,6 +768,8 @@ void RKComponentMap::setPluginStatus (const QStringList& ids, const QStringList& for (int i = 0; i < ids.size (); ++i) { addOverride (ids[i], _contexts[i], (_visible[i] == "1")); } + + RKWardMainWindow::getMain ()->initPlugins (); } diff --git a/rkward/plugin/rkcomponentmap.h b/rkward/plugin/rkcomponentmap.h index 6ade57b..8bb9bf1 100644 --- a/rkward/plugin/rkcomponentmap.h +++ b/rkward/plugin/rkcomponentmap.h @@ -183,7 +183,8 @@ private: QString context; bool hidden; }; - static QMultiMap<QString, ComponentOverride> overrides; + typedef QMultiMap<QString, ComponentOverride> OverrideMap; + static OverrideMap overrides; QString context; void appendPluginToList (const QString &id, QStringList *list); diff --git a/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R b/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R index 6a0387a..eaef8d4 100644 --- a/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R +++ b/rkward/rbackend/rpackages/rkward/R/rk.plugin-functions.R @@ -133,13 +133,21 @@ #' meaning the plugin will be affected in all contexts it occurs in, or a character vector #' of the same length as id. #' @param visible logical, controlling whether the plugin should be shown (\code{TRUE}) or -#' hidden (\code{FALSE}). +#' hidden (\code{FALSE}). Hidden plugins are essentially removed from the menu. They may still +#' be accessible embedded into other plugins. #' #' @return \code{rk.list.plugins} returns a data.frame listing plugin ids, context, menu path #' (tab-separated), and label of the plugin. If a plugin is available in more #' than one context, it will be listed several times. The exact layout (number and order of columns) #' of this data.frame might be subject to change. However, the \bold{names} of the columns in the -#' returned data.frame are expected to remain stable. \code {rk.set.plugin.status} returns \code{NULL}, invisibly +#' returned data.frame are expected to remain stable. +#' \code{rk.set.plugin.status} returns \code{NULL}, invisibly +#' +#' \bold{Note}: Each call to \code{rk.set.plugin.status} will result in a complete rebuild of the +#' menu (in the current implementation). While this should be hardly noticeable in interactive +#' use, it could be an issue when changing the status of many plugins, programatically. +#' In this case, make sure to do all changes in \bold{one} call to \code{rk.set.plugin.status}, +#' rather than many separate calls. #' #' @author Thomas Friedrichsmeier \email{rkward-devel@@lists.sourceforge.net} #' @keywords utilities @@ -152,7 +160,7 @@ #' #' ## NOT RUN #' ## hide t.test plugin -#' rk.set.plugin.status ("t_test", visible=FALSE) +#' rk.set.plugin.status ("rkward::t_test", visible=FALSE) #' ## END NOT RUN #' #' @export diff --git a/rkward/rbackend/rpackages/rkward/man/rk.list.plugins.Rd b/rkward/rbackend/rpackages/rkward/man/rk.list.plugins.Rd new file mode 100644 index 0000000..363bd0b --- /dev/null +++ b/rkward/rbackend/rpackages/rkward/man/rk.list.plugins.Rd @@ -0,0 +1,58 @@ +% Generated by roxygen2 (4.0.2): do not edit by hand +\name{rk.list.plugins} +\alias{rk.list.plugins} +\alias{rk.set.plugin.status} +\title{List of modify loaded plugins} +\usage{ +rk.list.plugins() + +rk.set.plugin.status(id, context = "", visible = TRUE) +} +\arguments{ +\item{id}{vector of ids (character) of the plugins to modify} + +\item{context}{in which the plugin should be shown / hidden. This can either be "", +meaning the plugin will be affected in all contexts it occurs in, or a character vector +of the same length as id.} + +\item{visible}{logical, controlling whether the plugin should be shown (\code{TRUE}) or + hidden (\code{FALSE}). Hidden plugins are essentially removed from the menu. They may still + be accessible embedded into other plugins.} +} +\value{ +\code{rk.list.plugins} returns a data.frame listing plugin ids, context, menu path + (tab-separated), and label of the plugin. If a plugin is available in more + than one context, it will be listed several times. The exact layout (number and order of columns) + of this data.frame might be subject to change. However, the \bold{names} of the columns in the + returned data.frame are expected to remain stable. + \code{rk.set.plugin.status} returns \code{NULL}, invisibly + +\bold{Note}: Each call to \code{rk.set.plugin.status} will result in a complete rebuild of the + menu (in the current implementation). While this should be hardly noticeable in interactive + use, it could be an issue when changing the status of many plugins, programatically. + In this case, make sure to do all changes in \bold{one} call to \code{rk.set.plugin.status}, + rather than many separate calls. +} +\description{ +\code{rk.list.plugins} returns the a list of all currently +registered plugins (in loaded pluginmaps). +\code{rk.set.plugin.status} allows to control the status of the given plugin(s). Currently, + only visibility can be controlled. +} +\examples{ +## list all current plugins +rk.list.plugins () + +## NOT RUN +## hide t.test plugin +rk.set.plugin.status ("rkward::t_test", visible=FALSE) +## END NOT RUN +} +\author{ +Thomas Friedrichsmeier \email{rkw...@li...} +} +\seealso{ +\code{\link{rk.call.plugin}} for invoking a plugin, programatically +} +\keyword{utilities} + diff --git a/rkward/rkward.h b/rkward/rkward.h index 2edb558..5ba9701 100644 --- a/rkward/rkward.h +++ b/rkward/rkward.h @@ -176,6 +176,7 @@ private: friend class RKSettingsModule; friend class RKSettingsModulePlugins; friend class RKSettings; + friend class RKComponentMap; /** Finds plugins and inserts them into the menu-structure */ void initPlugins (const QStringList &automatically_added = QStringList ()); |