Как добавить контекстное меню в `gframe`?

Как я могу добавить контекстное меню в gframe в gWidgets2? Я попробовал следующую конструкцию, но кажется, что я не могу прикрепить addPopupMenu к 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)

Контекстное меню отлично прикреплено к кнопке, но НЕ к gframe, Итак, как я могу добавить контекстное меню, которое будет всплывать при щелчке правой кнопкой мыши gframe этикетка?


ОБНОВИТЬ
Согласно ответам, я попробовал код ниже:

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

Но когда я right-click на labelЯ получаю только стандартное контекстное меню Gtk для выбора текста:

Использование Ubuntu 14.04 с Gtk+ 2.24.23. мой 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 

2 ответа

Решение

@landroni Я не проверял, но был бы удивлен, если бы всплывающие меню могли быть добавлены непосредственно к ярлыкам gframe. Но с Gtk все можно обойти. Вот как вы можете поместить всплывающее меню в положение метки:

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

Что касается того, является ли это интуитивно понятным для пользователей, я позволю вам решить....

Всплывающее меню "всплывает" из меню после щелчка мышью, обычно щелчком правой кнопкой мыши. В gWidgets реализованы функции 1add3rdmousepopupmenu(the one you want) andaddpopupmenu` для всплывающего окна на любой клик. Меню указывается с использованием синтаксиса gmenu.

Простой пример будет что-то вроде:

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

У меня был шанс проверить это, и это работает для меня с gWidgets, gWidgets2, а также gWidgetsRGtk2 используя 64-битную R 3.1.1 в Windows. Вы можете найти документацию для add3rdmousepopupmenu обработчик

  1. в gWidgets2 руководство здесь или
  2. набрав ??add3rdmousepopupmenu с gWidgets2 загружен,
  3. В недавно обновленном документе автора Джона Верзани приводятся примеры API gWidgets, который применим не только к gWdigets2но и его gWidgets, gWidgetsQt, gWidgetsRGtk2, а также gWidgetsrJava пакеты, которые вызывают API gWdigets
  4. и в gWidgets2 виньетка на CRAN
Другие вопросы по тегам