How to add a context menu to a `gframe`?

时光毁灭记忆、已成空白 提交于 2019-12-11 10:03:27

问题


How can I add a context menu to a gframe in gWidgets2? I tried the following construct, but it seems that I cannot attach a addPopupMenu to a gframe:

 require(gWidgets2)
 w <- gwindow("gformlayout", visible=T)
 f <- gframe("frame", horizontal=FALSE, container=w)
 l <- glabel("Lorem ipsum dolor sit amet, \nconsectetur adipiscing elit.", container=f)
 b <- gbutton("change name", container=f, handler=function(h,...) {
     names(f) <- "new name"
 })
 lst <- list(gaction('world', handler=function(h,...) svalue(world) <- "world"), 
             gaction('continent', handler=function(h,...) svalue(world) <- "continent"), 
             gaction('country', handler=function(h,...) svalue(world) <- "country"), 
             gaction('state', handler=function(h,...) svalue(world) <- "state"))
 add3rdmousePopupMenu(f, lst)
 #addPopupMenu(f, lst)
 add3rdmousePopupMenu(b, lst)

The context-menu is attached fine to the button, but NOT to the gframe. So how can I add a context menu that would pop-up when right-clicking the gframe label?


UPDATE
As per the answers, I tried the code below:

require(gWidgets2)
f <- gframe("", cont=gwindow())
l <- glabel("label")                    # no cont argument
add3rdmousePopupMenu(l, list(a=gaction("Hi"))) 
f$block$setLabelWidget(l$block)         # the voodoo

But when I right-click on the label, I only get the standard Gtk context menu for selecting text:

Using Ubuntu 14.04 with Gtk+ 2.24.23. My sessionInfo():

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] splines   grid      stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
 [1] reshape2_1.4         gWidgets2RGtk2_1.0-3 memoise_0.2.1        Hmisc_3.14-4         Formula_1.1-1       
 [6] survival_2.37-7      lattice_0.20-29      RGtk2_2.20.29        gWidgets2_1.0-6      digest_0.6.4        

loaded via a namespace (and not attached):
[1] cluster_1.14.4      latticeExtra_0.6-26 plyr_1.8.1          RColorBrewer_1.0-5  Rcpp_0.11.2        
[6] stringr_0.6.2       tools_3.0.2 

回答1:


@landroni I didn't check, but would be surprised if popup menus could be added to gframe labels directly. But with Gtk things can be worked around. Here is how you can put a popup menu in the label position:

f <- gframe("", cont=gwindow())
l <- glabel("label")                    # no cont argument
add3rdmousePopupMenu(l, list(a=gaction("Hi"))) 
f$block$setLabelWidget(l$block)         # the voodoo
l$widget$setSelectable(FALSE)           # may not be needed

As for whether this is intuitive to the users, I'll let you decide....




回答2:


A popup menu “pops” up a menu after a mouse click, typically a right mouse click. Implemented in gWidgets are the functions 1add3rdmousepopupmenu(the one you want) andaddpopupmenu` for a popup on any click. The menu is specified using the syntax for gmenu.

A simple example would be something like:

> w <- gwindow("Click on button to change")
> g <- ggroup(cont = w) # abbreviate container
> glabel("Hello ", cont=g)
guiWidget of type: gLabelRGtk for toolkit: guiWidgetsToolkitRGtk2
> world <- gbutton("world", cont=g)
> lst <- list()
> lst$world$handler <- function(h,...) svalue(world) <- "world"
> lst$continent$handler <- function(h,...) svalue(world) <- "continent"
> lst$country$handler <- function(h,...) svalue(world) <- "country"
> lst$state$handler <- function(h,...) svalue(world) <- "state"
> add3rdmousepopupmenu(world, lst)

I had a chance to test this and it works for me with gWidgets, gWidgets2, and gWidgetsRGtk2 using 64-bit R 3.1.1 on Windows. You can find documentation for the add3rdmousepopupmenu handler

  1. in the gWidgets2 manual here or
  2. by typing ??add3rdmousepopupmenu with gWidgets2 loaded,
  3. in the recently updated document by the author John Verzani giving examples for the gWidgets API, which applies not only to gWdigets2, but also his gWidgets, gWidgetsQt, gWidgetsRGtk2, and gWidgetsrJava packages which call the gWdigets API
  4. and in the gWidgets2 vignette on CRAN


来源:https://stackoverflow.com/questions/25513254/how-to-add-a-context-menu-to-a-gframe

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!