#!/usr/bin/perl use strict; use warnings; use Tk; use Tk::Zinc; use Tk::Zinc::Graphics; require "ButtonCollection.pm"; # These gradients are used by ButtonCollection, and are # magically named (ie have a corresponding active_ gradient # for event) my %gradients = ( 'button' => '=axial 200|#aaaaaa;50|#a8a8a8;10', 'active_button' => '=axial 250|#fafafa;20|#fefefe;50', 'button_red' => '=axial 200|#aa0000;20|#881010;10', 'active_button_red' => '=axial 250|#ff0000;50|#aa0000;50', ); # Initialize the mainwindow and pack a fullscreen zinc my $mw = new MainWindow; $mw->withdraw; my $zinc = $mw -> Zinc( -width => $mw -> screenwidth, -height => $mw -> screenheight, -render => 1, -borderwidth => 0, -backcolor => '#000000', ) -> pack; die "Need OpenGL support!" unless ($zinc->cget(-render) > 0); # Create a vertically packed buttoncollection on left side of screen my $mainmenu = new ButtonCollection($zinc, { bbox => [[0,0],[300,$mw->screenheight]], packer => 'vertical', spacing => 3, } ); &setGradients($zinc, \%gradients); # Add buttons to the collection, first parameter 'type' corresponds to # a 'magic gradient'. Parameters are type aka gradient, text, callback my $btn1 = $mainmenu->add_button('button', "Flip order", \&flip_order); my $btn2 = $mainmenu->add_button('button', "Toggle packer", \&toggle_packer); my $btn3 = $mainmenu->add_button('button', "Solo - resize", \&solo_resize); my $btn4 = $mainmenu->add_button('button', "Solo - stretch", \&solo_stretch); my $btn5 = $mainmenu->add_button('button', 'Solo - group', \&solo_group); my $btn6 = $mainmenu->add_button('button', 'Solo - Added', \&solo_added); my $btn7 = $mainmenu->add_button('button', "Add button", \&add_button); $mainmenu->pack; $mw -> bind('' => sub{exit;}); $mw -> FullScreen(1); $mw -> focusForce; $mw -> grabGlobal; $mw -> deiconify; MainLoop; exit 0; # Reverse the current order of buttons. sub flip_order { $mainmenu->order(reverse @{$mainmenu->order}); $mainmenu->pack; } # Toggle between horizontal and vertical packer, also set # the ButtonCollection's bbox accordingly. sub toggle_packer { if ($mainmenu -> packer eq 'horizontal') { $mainmenu -> packer('vertical'); $mainmenu -> bbox([[0,0],[300,$mw->screenheight]]); } else { $mainmenu -> packer('horizontal'); $mainmenu -> bbox([[0,0],[$mw->screenwidth,100]]); } $mainmenu->pack; } # Toggle resized solo mode for button 3 my ($btn3_old_order, $btn3_old_bbox, $btn3_is_solo); sub solo_resize { my ($shape, $text) = $mainmenu->get_button($btn3); if ($btn3_is_solo) { $mainmenu -> bbox($btn3_old_bbox); $mainmenu -> order($btn3_old_order); $zinc->itemconfigure($text, -text => 'Solo - resize'); $btn3_is_solo = 0; } else { $btn3_old_order = $mainmenu -> order; $btn3_old_bbox = $mainmenu -> bbox; my ($x1, $y1, $x2, $y2) = $zinc->bbox($btn3); $mainmenu -> order([$btn3]); $mainmenu -> bbox([[$x1, $y1], [$x2, $y2]]); $zinc->itemconfigure($text, -text => 'Expand!'); $btn3_is_solo = 1; } $mainmenu -> pack; } # Toggle stretched solo mode for button 4 my ($btn4_old_order, $btn4_is_solo); sub solo_stretch { if ($btn4_is_solo) { $mainmenu -> order($btn4_old_order); $btn4_is_solo = 0; } else { $btn4_old_order = $mainmenu -> order; $mainmenu -> order([$btn4]); $btn4_is_solo = 1; } $mainmenu -> pack; } # Toggle solo for a given group of buttons # (same as above, only more buttons in ->order call) my ($btn5_old_order, $btn5_is_solo); sub solo_group { if ($btn5_is_solo) { $mainmenu -> order($btn5_old_order); $btn5_is_solo = 0; } else { $btn5_old_order = $mainmenu -> order; $mainmenu -> order([$btn1, $btn2, $btn4, $btn5]); $btn5_is_solo = 1; } $mainmenu -> pack; } # Add a new button to the end of collection my @added_buttons; sub add_button { push @added_buttons, $mainmenu -> add_button( 'button_red', (1+scalar @added_buttons), sub{ } ); $mainmenu -> pack; } # Toggle solo mode for added buttons (and btn6) my ($btn6_old_order, $btn6_is_solo); sub solo_added { if ($btn6_is_solo) { $mainmenu -> order($btn6_old_order); $btn6_is_solo = 0; } else { $btn6_old_order = $mainmenu -> order; $mainmenu -> order([$btn6, @added_buttons]); $btn6_is_solo = 1; } $mainmenu -> pack; }