rbhex-core 1.1.0.alpha3 → 1.1.0.alpha4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +1 -1
- data/examples/atree.rb +1 -1
- data/examples/common/file.rb +2 -2
- data/examples/dbdemo.rb +1 -1
- data/examples/newtabbedwindow.rb +1 -1
- data/examples/newtesttabp.rb +4 -4
- data/examples/testbuttons.rb +3 -3
- data/examples/testcombo.rb +2 -2
- data/examples/testfields.rb +3 -3
- data/examples/testkeypress.rb +4 -4
- data/examples/testlistbox.rb +5 -5
- data/examples/testmessagebox.rb +4 -4
- data/examples/testprogress.rb +1 -1
- data/examples/testree.rb +3 -3
- data/examples/testwsshortcuts.rb +2 -2
- data/examples/testwsshortcuts2.rb +3 -3
- data/lib/rbhex/core/include/action.rb +2 -2
- data/lib/rbhex/core/include/actionmanager.rb +1 -1
- data/lib/rbhex/core/include/appmethods.rb +4 -4
- data/lib/rbhex/core/include/bordertitle.rb +6 -6
- data/lib/rbhex/core/include/chunk.rb +1 -1
- data/lib/rbhex/core/include/io.rb +2 -2
- data/lib/rbhex/core/include/listbindings.rb +2 -2
- data/lib/rbhex/core/include/listcellrenderer.rb +3 -3
- data/lib/rbhex/core/include/listscrollable.rb +1 -1
- data/lib/rbhex/core/include/listselectable.rb +13 -13
- data/lib/rbhex/core/include/multibuffer.rb +5 -5
- data/lib/rbhex/core/include/ractionevent.rb +4 -4
- data/lib/rbhex/core/include/rchangeevent.rb +3 -3
- data/lib/rbhex/core/include/rhistory.rb +1 -1
- data/lib/rbhex/core/include/rinputdataevent.rb +6 -6
- data/lib/rbhex/core/include/vieditable.rb +1 -1
- data/lib/rbhex/core/include/widgetmenu.rb +1 -1
- data/lib/rbhex/core/system/colormap.rb +1 -1
- data/lib/rbhex/core/system/ncurses.rb +1 -1
- data/lib/rbhex/core/system/window.rb +1 -1
- data/lib/rbhex/core/util/ansiparser.rb +1 -1
- data/lib/rbhex/core/util/app.rb +7 -7
- data/lib/rbhex/core/util/basestack.rb +20 -20
- data/lib/rbhex/core/util/bottomline.rb +2 -2
- data/lib/rbhex/core/util/colorparser.rb +1 -1
- data/lib/rbhex/core/util/focusmanager.rb +1 -1
- data/lib/rbhex/core/util/padreader.rb +2 -2
- data/lib/rbhex/core/util/rcommandwindow.rb +2 -2
- data/lib/rbhex/core/util/rdialogs.rb +7 -7
- data/lib/rbhex/core/util/viewer.rb +5 -5
- data/lib/rbhex/core/util/widgetshortcuts.rb +3 -3
- data/lib/rbhex/core/version.rb +1 -1
- data/lib/rbhex/core/widgets/applicationheader.rb +2 -2
- data/lib/rbhex/core/widgets/box.rb +3 -3
- data/lib/rbhex/core/widgets/divider.rb +2 -2
- data/lib/rbhex/core/widgets/keylabelprinter.rb +2 -2
- data/lib/rbhex/core/widgets/rcombo.rb +5 -5
- data/lib/rbhex/core/widgets/rcontainer.rb +2 -2
- data/lib/rbhex/core/widgets/rlink.rb +1 -1
- data/lib/rbhex/core/widgets/rlist.rb +1 -1
- data/lib/rbhex/core/widgets/rmenu.rb +15 -15
- data/lib/rbhex/core/widgets/rmenulink.rb +1 -1
- data/lib/rbhex/core/widgets/rmessagebox.rb +6 -6
- data/lib/rbhex/core/widgets/rprogress.rb +2 -2
- data/lib/rbhex/core/widgets/rtabbedpane.rb +3 -3
- data/lib/rbhex/core/widgets/rtabbedwindow.rb +2 -2
- data/lib/rbhex/core/widgets/rtextarea.rb +2 -2
- data/lib/rbhex/core/widgets/rtextview.rb +3 -3
- data/lib/rbhex/core/widgets/rtree.rb +6 -6
- data/lib/rbhex/core/widgets/rwidget.rb +12 -12
- data/lib/rbhex/core/widgets/scrollbar.rb +2 -2
- data/lib/rbhex/core/widgets/statusline.rb +1 -1
- data/lib/rbhex/core/widgets/tabular.rb +32 -32
- data/lib/rbhex/core/widgets/tabularwidget.rb +3 -3
- data/lib/rbhex/core/widgets/textpad.rb +3 -3
- data/lib/rbhex/core/widgets/tree/treecellrenderer.rb +3 -3
- data/lib/rbhex/core/widgets/tree/treemodel.rb +3 -3
- metadata +11 -11
@@ -21,7 +21,7 @@ require 'pathname'
|
|
21
21
|
1.4.0 or so.
|
22
22
|
|
23
23
|
=end
|
24
|
-
module
|
24
|
+
module Rbhex
|
25
25
|
|
26
26
|
# just so the program does not bomb due to a tiny feature
|
27
27
|
# I do not raise error on nil array, i create a dummy array
|
@@ -1778,7 +1778,7 @@ module RubyCurses
|
|
1778
1778
|
end # module
|
1779
1779
|
end # module
|
1780
1780
|
#require 'rbhex/core/util/bottomline'
|
1781
|
-
$tt ||=
|
1781
|
+
$tt ||= Rbhex::Bottomline.new
|
1782
1782
|
$tt.name = "$tt"
|
1783
1783
|
require 'forwardable'
|
1784
1784
|
module Kernel
|
@@ -8,7 +8,7 @@
|
|
8
8
|
# make_focusable is called, or toggle_focusable. Now user can press TAB and access
|
9
9
|
# these bars. When he is done he can toggle again.
|
10
10
|
# TODO: we might add a Circular class here so user can traverse only these objects
|
11
|
-
module
|
11
|
+
module Rbhex
|
12
12
|
module FocusManager
|
13
13
|
extend self
|
14
14
|
attr_reader :focusables
|
@@ -27,7 +27,7 @@ require 'rbhex/core/widgets/rmessagebox'
|
|
27
27
|
#
|
28
28
|
def alert text, config={}
|
29
29
|
|
30
|
-
if text.is_a?
|
30
|
+
if text.is_a? Rbhex::Variable
|
31
31
|
text = text.get_value
|
32
32
|
end
|
33
33
|
_title = config[:title] || "Alert"
|
@@ -125,7 +125,7 @@ def confirm text, config={}, &block
|
|
125
125
|
title = config['title'] || "Confirm"
|
126
126
|
config[:default_button] ||= 0
|
127
127
|
|
128
|
-
mb =
|
128
|
+
mb = Rbhex::MessageBox.new config do
|
129
129
|
title title
|
130
130
|
message text, &block
|
131
131
|
button_type :yes_no
|
@@ -180,7 +180,7 @@ end
|
|
180
180
|
#private
|
181
181
|
def _print_message type, text, aconfig={}, &block #:nodoc:
|
182
182
|
case text
|
183
|
-
when
|
183
|
+
when Rbhex::Variable # added 2011-09-20 incase variable passed
|
184
184
|
text = text.get_value
|
185
185
|
when Exception
|
186
186
|
text = text.to_s
|
@@ -236,7 +236,7 @@ def rb_confirm text, aconfig={}, &block
|
|
236
236
|
default = aconfig[:default]
|
237
237
|
end
|
238
238
|
case text
|
239
|
-
when
|
239
|
+
when Rbhex::Variable # added 2011-09-20 incase variable passed
|
240
240
|
text = text.get_value
|
241
241
|
when Exception
|
242
242
|
text = text.to_s
|
@@ -398,7 +398,7 @@ def popuplist list, config={}, &block
|
|
398
398
|
#layout(1+height, width+4, row, col)
|
399
399
|
layout = { :height => 0+height, :width => 0+width, :top => row, :left => col }
|
400
400
|
window = VER::Window.new(layout)
|
401
|
-
form =
|
401
|
+
form = Rbhex::Form.new window
|
402
402
|
|
403
403
|
listconfig = config[:listconfig] || {}
|
404
404
|
listconfig[:list] = list
|
@@ -409,7 +409,7 @@ def popuplist list, config={}, &block
|
|
409
409
|
listconfig.delete(:row);
|
410
410
|
listconfig.delete(:col);
|
411
411
|
# trying to pass populists block to listbox
|
412
|
-
lb =
|
412
|
+
lb = Rbhex::List.new form, listconfig, &block
|
413
413
|
#
|
414
414
|
# added next line so caller can configure listbox with
|
415
415
|
# events such as ENTER_ROW, LEAVE_ROW or LIST_SELECTION_EVENT or PRESS
|
@@ -528,7 +528,7 @@ def ORIGdisplay_app_help
|
|
528
528
|
w = FFI::NCurses.COLS - 10
|
529
529
|
|
530
530
|
require 'rbhex/core/util/viewer'
|
531
|
-
|
531
|
+
Rbhex::Viewer.view(arr, :layout => [2, 4, h, w],:close_key => KEY_F10, :title => "[ Help ]", :print_footer => true) do |t|
|
532
532
|
# you may configure textview further here.
|
533
533
|
#t.suppress_borders true
|
534
534
|
#t.color = :black
|
@@ -7,7 +7,7 @@ require 'fileutils'
|
|
7
7
|
# TODO: add vi_keys here
|
8
8
|
# SUGGESTIONS WELCOME.
|
9
9
|
# @since 1.2.0
|
10
|
-
module
|
10
|
+
module Rbhex
|
11
11
|
# a data viewer for viewing some text or filecontents
|
12
12
|
# view filename, :close_key => KEY_ENTER
|
13
13
|
# send data in an array
|
@@ -42,12 +42,12 @@ module RubyCurses
|
|
42
42
|
|
43
43
|
layout = { :height => wh, :width => ww, :top => wt, :left => wl }
|
44
44
|
v_window = VER::Window.new(layout)
|
45
|
-
v_form =
|
45
|
+
v_form = Rbhex::Form.new v_window
|
46
46
|
colors = Ncurses.COLORS
|
47
47
|
back = :blue
|
48
48
|
back = 235 if colors >= 256
|
49
49
|
blue_white = get_color($datacolor, :white, back)
|
50
|
-
#blue_white =
|
50
|
+
#blue_white = Rbhex::Utils.get_color($datacolor, :white, 235)
|
51
51
|
textview = TextView.new v_form do
|
52
52
|
name "Viewer"
|
53
53
|
row 0
|
@@ -62,7 +62,7 @@ module RubyCurses
|
|
62
62
|
border_color blue_white
|
63
63
|
end
|
64
64
|
require 'rbhex/core/include/multibuffer'
|
65
|
-
textview.extend(
|
65
|
+
textview.extend(Rbhex::MultiBuffers)
|
66
66
|
|
67
67
|
t = textview
|
68
68
|
t.bind_key('<', 'move window left'){ f = t.form.window; c = f.left - 1; f.hide; f.mvwin(f.top, c); f.show;
|
@@ -136,7 +136,7 @@ App.new do
|
|
136
136
|
header = app_header "rbhex 1.2.0", :text_center => "Viewer Demo", :text_right =>"New Improved!", :color => :black, :bgcolor => :white, :attr => :bold
|
137
137
|
message "Press F1 to exit from here"
|
138
138
|
|
139
|
-
|
139
|
+
Rbhex::Viewer.view(ARGV[0] || $0, :close_key => KEY_ENTER, :title => "Enter to close") do |t|
|
140
140
|
# you may configure textview further here.
|
141
141
|
#t.suppress_borders true
|
142
142
|
#t.color = :black
|
@@ -29,7 +29,7 @@
|
|
29
29
|
# Or is it positioning, such as in a stack. or just a method ?
|
30
30
|
require 'rbhex/core/widgets/rlist'
|
31
31
|
require 'rbhex/core/widgets/rtextview'
|
32
|
-
module
|
32
|
+
module Rbhex
|
33
33
|
module WidgetShortcuts
|
34
34
|
class Ws
|
35
35
|
attr_reader :config
|
@@ -118,7 +118,7 @@ module RubyCurses
|
|
118
118
|
def_widget nil, :ToggleButton, 'toggle'
|
119
119
|
def menubar &block
|
120
120
|
require 'rbhex/core/widgets/rmenu'
|
121
|
-
|
121
|
+
Rbhex::MenuBar.new &block
|
122
122
|
end
|
123
123
|
def app_header title, config={}, &block
|
124
124
|
require 'rbhex/core/widgets/applicationheader'
|
@@ -188,7 +188,7 @@ module RubyCurses
|
|
188
188
|
# prints pine-like key labels
|
189
189
|
def dock labels, config={}, &block
|
190
190
|
require 'rbhex/core/widgets/keylabelprinter'
|
191
|
-
klp =
|
191
|
+
klp = Rbhex::KeyLabelPrinter.new @form, labels, config, &block
|
192
192
|
end
|
193
193
|
|
194
194
|
def link config={}, &block
|
data/lib/rbhex/core/version.rb
CHANGED
@@ -17,8 +17,8 @@
|
|
17
17
|
# ----------------------------------------------------------------------------- #
|
18
18
|
#
|
19
19
|
require 'rbhex/core/widgets/rwidget'
|
20
|
-
include
|
21
|
-
module
|
20
|
+
include Rbhex
|
21
|
+
module Rbhex
|
22
22
|
class ApplicationHeader < Widget
|
23
23
|
dsl_property :text1
|
24
24
|
dsl_property :text2
|
@@ -8,15 +8,15 @@
|
|
8
8
|
#
|
9
9
|
require 'rbhex/core'
|
10
10
|
require 'rbhex/core/include/bordertitle'
|
11
|
-
include
|
12
|
-
#include
|
11
|
+
include Rbhex
|
12
|
+
#include Rbhex::BorderTitle
|
13
13
|
|
14
14
|
# @example
|
15
15
|
#
|
16
16
|
# At a later stage, we will integrate this with lists and tables, so it will happen automatically.
|
17
17
|
#
|
18
18
|
# @since 1.4.1 UNTESTED
|
19
|
-
module
|
19
|
+
module Rbhex
|
20
20
|
class Box < Widget
|
21
21
|
|
22
22
|
include BorderTitle
|
@@ -1,6 +1,6 @@
|
|
1
1
|
require 'rbhex/core/util/app'
|
2
2
|
#include Ncurses # FFI 2011-09-8
|
3
|
-
include
|
3
|
+
include Rbhex
|
4
4
|
|
5
5
|
# TODO : We can consider making it independent of objects, or allow for a margin so it does not write
|
6
6
|
# over the object. Then it will be always visible.
|
@@ -14,7 +14,7 @@ include RubyCurses
|
|
14
14
|
# At a later stage, we will integrate this with lists and tables, so it will happen automatically.
|
15
15
|
#
|
16
16
|
# @since 1.2.0
|
17
|
-
module
|
17
|
+
module Rbhex
|
18
18
|
class DragEvent < Struct.new(:source, :type); end
|
19
19
|
|
20
20
|
# This is a horizontal or vertical bar (like a scrollbar), at present attached to a
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'rbhex/core/widgets/rwidget'
|
2
2
|
#include Ncurses # FFI 2011-09-8
|
3
|
-
include
|
4
|
-
module
|
3
|
+
include Rbhex
|
4
|
+
module Rbhex
|
5
5
|
#
|
6
6
|
# This paints labels for various keys at the bottom of the screen, in 2 rows.
|
7
7
|
# This is based on alpines last 2 rows. Modes are supported so that the
|
@@ -13,8 +13,8 @@
|
|
13
13
|
#
|
14
14
|
require 'rbhex/core'
|
15
15
|
|
16
|
-
include
|
17
|
-
module
|
16
|
+
include Rbhex
|
17
|
+
module Rbhex
|
18
18
|
extend self
|
19
19
|
|
20
20
|
# the quick approach would be to use field, and just add a popup.
|
@@ -25,7 +25,7 @@ module RubyCurses
|
|
25
25
|
# based on the label. 2014-03-24 - 16:42
|
26
26
|
|
27
27
|
class ComboBox < Field
|
28
|
-
include
|
28
|
+
include Rbhex::EventHandler
|
29
29
|
dsl_accessor :list_config
|
30
30
|
|
31
31
|
attr_accessor :current_index
|
@@ -75,7 +75,7 @@ module RubyCurses
|
|
75
75
|
# convert given list to datamodel
|
76
76
|
def list alist=nil
|
77
77
|
return @list if alist.nil?
|
78
|
-
#@list =
|
78
|
+
#@list = Rbhex::ListDataModel.new(alist)
|
79
79
|
@list = alist
|
80
80
|
end
|
81
81
|
##
|
@@ -163,7 +163,7 @@ module RubyCurses
|
|
163
163
|
popcol = @col
|
164
164
|
dlength = @display_length
|
165
165
|
f = self
|
166
|
-
@popup =
|
166
|
+
@popup = Rbhex::PopupList.new do
|
167
167
|
row poprow
|
168
168
|
col popcol
|
169
169
|
width dlength
|
@@ -28,8 +28,8 @@ a user friendly string to identifiy the action, as well as a disabled option.
|
|
28
28
|
#require 'logger'
|
29
29
|
require 'rbhex/core'
|
30
30
|
|
31
|
-
include
|
32
|
-
module
|
31
|
+
include Rbhex
|
32
|
+
module Rbhex
|
33
33
|
extend self
|
34
34
|
|
35
35
|
|
@@ -300,7 +300,7 @@ module RubyCurses
|
|
300
300
|
item(:NO_MENUITEMS)
|
301
301
|
end
|
302
302
|
create_window
|
303
|
-
if !@parent.is_a?
|
303
|
+
if !@parent.is_a? Rbhex::MenuBar
|
304
304
|
@parent.current_menu << self
|
305
305
|
@@menus << self # NEW
|
306
306
|
end
|
@@ -321,7 +321,7 @@ module RubyCurses
|
|
321
321
|
#return if @items.nil? or @items.empty? # commented 2011-09-24 NEWMENU
|
322
322
|
#$log.debug "menu repaint: #{text} row #{@row} col #{@col} "
|
323
323
|
@color_pair = get_color($reversecolor, @color, @bgcolor)
|
324
|
-
if !@parent.is_a?
|
324
|
+
if !@parent.is_a? Rbhex::MenuBar
|
325
325
|
@parent.window.printstring( @row, 0, "|%-*s>|" % [@width-1, text], @color_pair)
|
326
326
|
@parent.window.refresh
|
327
327
|
end
|
@@ -417,7 +417,7 @@ module RubyCurses
|
|
417
417
|
def on_enter # menu.on_enter
|
418
418
|
#$log.debug "menu onenter: #{text} #{@row} #{@col} "
|
419
419
|
# call parent method. XXX
|
420
|
-
#if @parent.is_a?
|
420
|
+
#if @parent.is_a? Rbhex::MenuBar
|
421
421
|
#acolor = get_color($datacolor, @bgcolor, @color)
|
422
422
|
#@parent.window.printstring( @row, @col, " %s " % text, acolor)
|
423
423
|
#else
|
@@ -427,7 +427,7 @@ module RubyCurses
|
|
427
427
|
#$log.debug "menu onenter: #{text} calling window,show"
|
428
428
|
@window.show
|
429
429
|
select_item 0
|
430
|
-
elsif @parent.is_a?
|
430
|
+
elsif @parent.is_a? Rbhex::MenuBar and @parent.selected
|
431
431
|
# only on the top level do we open a window if a previous one was opened
|
432
432
|
#$log.debug "menu onenter: #{text} calling repaint CLASS: #{@parent.class}"
|
433
433
|
# repaint
|
@@ -438,7 +438,7 @@ module RubyCurses
|
|
438
438
|
#$log.debug "menu onleave: #{text} #{@row} #{@col} "
|
439
439
|
# call parent method. XXX
|
440
440
|
@color_pair ||= get_color($reversecolor, @color, @bgcolor)
|
441
|
-
if @parent.is_a?
|
441
|
+
if @parent.is_a? Rbhex::MenuBar
|
442
442
|
# @parent.window.printstring( @row, @col, " %s " % text, $reversecolor) # changed 2011 2011-09-24
|
443
443
|
@parent.window.printstring( @row, @col, " %s " % text, @color_pair)
|
444
444
|
@window.hide if !@window.nil?
|
@@ -452,7 +452,7 @@ module RubyCurses
|
|
452
452
|
end
|
453
453
|
end
|
454
454
|
def highlight tf=true # menu
|
455
|
-
if @parent.is_a?
|
455
|
+
if @parent.is_a? Rbhex::MenuBar # top level menu
|
456
456
|
#acolor = get_color($datacolor, @bgcolor, @color)
|
457
457
|
#@parent.window.printstring( @row, @col, " %s " % text, acolor)
|
458
458
|
@color_pair ||= get_color($reversecolor, @color, @bgcolor)
|
@@ -573,7 +573,7 @@ module RubyCurses
|
|
573
573
|
when KEY_DOWN
|
574
574
|
cmenu.select_next_item
|
575
575
|
#return cmenu.fire # XXX 2010-10-16 21:39 trying out
|
576
|
-
if cmenu.is_a?
|
576
|
+
if cmenu.is_a? Rbhex::Menu
|
577
577
|
#alert "is a menu" # this gets triggered even when we are on items
|
578
578
|
end
|
579
579
|
when KEY_UP
|
@@ -581,13 +581,13 @@ module RubyCurses
|
|
581
581
|
when KEY_ENTER, 10, 13, 32 # added 32 2008-11-27 23:50
|
582
582
|
return cmenu.fire
|
583
583
|
when KEY_LEFT
|
584
|
-
if cmenu.parent.is_a?
|
584
|
+
if cmenu.parent.is_a? Rbhex::Menu
|
585
585
|
#$log.debug "LEFT IN MENU : #{cmenu.parent.class} len: #{cmenu.parent.current_menu.length}"
|
586
586
|
#$log.debug "left IN MENU : #{cmenu.parent.class} len: #{cmenu.current_menu.length}"
|
587
587
|
end
|
588
588
|
ret = cmenu.select_left_item # 2011-09-24 V1.3.1 attempt to goto left item if columns
|
589
589
|
if ret == :UNHANDLED
|
590
|
-
if cmenu.parent.is_a?
|
590
|
+
if cmenu.parent.is_a? Rbhex::MenuBar #and !cmenu.parent.current_menu.empty?
|
591
591
|
#$log.debug " ABOU TO DESTROY DUE TO LEFT"
|
592
592
|
cmenu.current_menu.pop
|
593
593
|
@@menus.pop ## NEW
|
@@ -595,7 +595,7 @@ module RubyCurses
|
|
595
595
|
return :UNHANDLED
|
596
596
|
end
|
597
597
|
# LEFT on a menu list allows me to close and return to higher level
|
598
|
-
if cmenu.parent.is_a?
|
598
|
+
if cmenu.parent.is_a? Rbhex::Menu #and !cmenu.parent.current_menu.empty?
|
599
599
|
#$log.debug " ABOU TO DESTROY DUE TO LEFT"
|
600
600
|
cmenu.current_menu.pop
|
601
601
|
@@menus.pop ## NEW
|
@@ -606,7 +606,7 @@ module RubyCurses
|
|
606
606
|
when KEY_RIGHT
|
607
607
|
$log.debug "RIGHTIN MENU : #{text} "
|
608
608
|
if cmenu.active_index
|
609
|
-
if cmenu.items[cmenu.active_index].is_a?
|
609
|
+
if cmenu.items[cmenu.active_index].is_a? Rbhex::Menu
|
610
610
|
#alert "could fire here cmenu: #{cmenu.text}, par: #{cmenu.parent.text} "
|
611
611
|
cmenu.fire
|
612
612
|
return
|
@@ -618,8 +618,8 @@ module RubyCurses
|
|
618
618
|
ret = cmenu.select_right_item # 2011-09-24 V1.3.1 attempt to goto right item if columns
|
619
619
|
#alert "attempting to select right #{ret} "
|
620
620
|
if ret == :UNHANDLED
|
621
|
-
#if cmenu.parent.is_a?
|
622
|
-
if cmenu.parent.is_a?
|
621
|
+
#if cmenu.parent.is_a? Rbhex::Menu and !cmenu.parent.current_menu.empty?
|
622
|
+
if cmenu.parent.is_a? Rbhex::MenuBar #and !cmenu.current_menu.empty?
|
623
623
|
$log.debug " ABOU TO DESTROY DUE TO RIGHT"
|
624
624
|
cmenu.current_menu.pop
|
625
625
|
@@menus.pop
|