# IUP app example use strict; use warnings; use IUP ':all'; my $img_bits1 = [ [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,0,2,0,2,0,2,2,0,2,2,2,0,0,0,2,2,2,0,0,2,0,2,2,0,0,0,2,2,2], [2,2,2,0,2,0,0,2,0,0,2,0,2,0,2,2,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2], [2,2,2,0,2,0,2,2,0,2,2,0,2,2,2,2,2,0,2,0,2,2,2,0,2,0,2,2,2,0,2,2], [2,2,2,0,2,0,2,2,0,2,2,0,2,2,0,0,0,0,2,0,2,2,2,0,2,0,0,0,0,0,2,2], [2,2,2,0,2,0,2,2,0,2,2,0,2,0,2,2,2,0,2,0,2,2,2,0,2,0,2,2,2,2,2,2], [2,2,2,0,2,0,2,2,0,2,2,0,2,0,2,2,2,0,2,0,2,2,0,0,2,0,2,2,2,0,2,2], [2,2,2,0,2,0,2,2,0,2,2,0,2,2,0,0,0,0,2,2,0,0,2,0,2,2,0,0,0,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,2,2,2,0,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], ]; my $img_bits2= [ [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,2,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,2,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2], [2,2,2,2,2,2,2,2,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [3,3,3,0,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [3,3,3,0,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [3,3,3,0,3,0,3,0,3,3,0,3,3,3,1,1,0,3,3,3,0,0,3,0,3,3,0,0,0,3,3,3], [3,3,3,0,3,0,0,3,0,0,3,0,3,0,1,1,3,0,3,0,3,3,0,0,3,0,3,3,3,0,3,3], [3,3,3,0,3,0,3,3,0,3,3,0,3,3,1,1,3,0,3,0,3,3,3,0,3,0,3,3,3,0,3,3], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1], [3,3,3,0,3,0,3,3,0,3,3,0,3,0,1,1,3,0,3,0,3,3,0,0,3,0,3,3,3,0,3,3], [3,3,3,0,3,0,3,3,0,3,3,0,3,3,1,1,0,0,3,3,0,0,3,0,3,3,0,0,0,3,3,3], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,0,3,3,3,3,3,3,3,3], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,0,3,3,3,0,3,3,3,3,3,3,3,3], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,0,0,0,3,3,3,3,3,3,3,3,3], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3], [2,2,2,2,2,2,2,3,3,3,3,3,3,3,1,1,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,2,3,3,3,3,3,3,3,3,1,1,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], [3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2], ]; # global elements my $img1 = IUP::Image->new( pixels=>$img_bits1, 0=>"0 0 0", 1=>"BGCOLOR", 2=>"255 0 0" ); my $img2 = IUP::Image->new( pixels=>$img_bits2, 0=>"0 0 0", 1=>"0 255 0", 2=>"BGCOLOR", 3=>"255 0 0" ); my $mdiFrame; #global window my @elements; # global counters my $line = 0; my $id = 1; sub getfocus_cb { my $self = shift; printf STDERR "$line-getfocus(%s#%s)\n", $self->GetClassName(), ($self->GetAttribute("CINDEX") || 'n.a.'); $line++; return IUP_DEFAULT; } sub killfocus_cb { my $self = shift; printf STDERR "$line-killfocus(%s#%s)\n", $self->GetClassName(), ($self->GetAttribute("CINDEX") || 'n.a.'); $line++; return IUP_DEFAULT; } sub action { my $self = shift; printf STDERR "$line-action(%s#%s) Value=%s\n", $self->GetClassName(), ($self->GetAttribute("CINDEX") || 'n.a.'), ($self->GetAttribute("VALUE") || 'n.a.'); $line++; return IUP_DEFAULT; } sub set_callbacks { my $ctrl = shift; $ctrl->SetCallback("GETFOCUS_CB", \&getfocus_cb); $ctrl->SetCallback("KILLFOCUS_CB", \&killfocus_cb); $ctrl->SetCallback("ACTION", \&action) if $ctrl->IsValidCallbackName('ACTION'); my $child; #passing undef to GetNextChild gives the first child while($child = $ctrl->GetNextChild($child)) { set_callbacks($child); } } sub createDialog { my $frm_1 = IUP::Frame->new( child=> IUP::Vbox->new( child=>[ IUP::Button->new( TITLE=>"Button Text", CINDEX=>1 ), IUP::Button->new( TITLE=>"", CINDEX=>2, BGCOLOR=>"255 128 0", RASTERSIZE=>"30x30" ), IUP::Button->new( TITLE=>"", IMAGE=>$img1, CINDEX=>3 ), IUP::Button->new( TITLE=>"", IMAGE=>$img1, CINDEX=>4, FLAT=>"YES" ), IUP::Button->new( TITLE=>"", IMAGE=>$img1, IMPRESS=>$img2, CINDEX=>5 ), ]), TITLE=>"IupButton" ); my $frm_2 = IUP::Frame->new( child=> IUP::Vbox->new( child=>[ IUP::Label->new( TITLE=>"Label Text\nLine 2\nLine 3", CINDEX=>1 ), IUP::Label->new( TITLE=>"", SEPARATOR=>"HORIZONTAL", CINDEX=>2 ), IUP::Label->new( TITLE=>"", IMAGE=>$img1, CINDEX=>3 ), ]), TITLE=>"IupLabel" ); my $frm_3 = IUP::Frame->new( child=> IUP::Vbox->new( child=>[ IUP::Toggle->new( TITLE=>"Toggle Text", VALUE=>"ON", CINDEX=>1 ), IUP::Toggle->new( TITLE=>"3State Text", VALUE=>"NOTDEF", CINDEX=>2, '3STATE'=>"YES" ), IUP::Toggle->new( TITLE=>"", IMAGE=>$img1, IMPRESS=>$img2, CINDEX=>3 ), IUP::Frame->new( child=> IUP::Radio->new( TITLE=>"IupRadio", child=> IUP::Vbox->new( child=>[ IUP::Toggle->new( TITLE=>"Toggle Text", CINDEX=>4 ), IUP::Toggle->new( TITLE=>"Toggle Text", CINDEX=>5 ), ]), ), ) ]), TITLE=>"IupToggle" ); my $text_1 = IUP::Text->new( VALUE=>"IupText Text", #SIZE=>"80x", CINDEX=>1 ); my $ml_1 = IUP::Text->new( MULTILINE=>1, VALUE=>"IupMultiline Text\nSecond Line\nThird Line", #SIZE=>"50x30", #EXPAND=>"YES", #SIZE=>"80x60", CINDEX=>1 ); my $frm_4 = IUP::Frame->new( TITLE=>"IupText/IupMultiline", child=>IUP::Vbox->new( child=>[$text_1, $ml_1,]) ); my $list_1 = IUP::List->new( EXPAND=>"YES", #SIZE=>"50x40", VALUE=>1, MULTIPLE=>"YES", 1=>"Item 1 Text", 2=>"Item 2 Text", 3=>"Item 3 Text Big Item", 4=>"Item 4 Text", 5=>"Item 5 Text", 6=>"Item 6 Text", CINDEX=>1 ); my $list_2 = IUP::List->new( DROPDOWN=>"YES", EXPAND=>"YES", VISIBLE_ITEMS=>3, SIZE=>"50x", VALUE=>2, 1=>"Item 1 Text", 2=>"Item 2 Text Big Item", 3=>"Item 3 Text", 4=>"Item 4 Text", 5=>"Item 5 Text", 6=>"Item 6 Text", CINDEX=>2 ); my $list_3 = IUP::List->new( EDITBOX=>"YES", EXPAND=>"YES", SIZE=>"50x40", VALUE=>"Test Value", 1=>"Item 1 Text", 2=>"Item 2 Text Big Item", 3=>"Item 3 Text", 4=>"Item 4 Text", 5=>"Item 5 Text", 6=>"Item 6 Text", CINDEX=>3 ); my $list_4 = IUP::List->new( EDITBOX=>"YES", DROPDOWN=>"YES", EXPAND=>"YES", VISIBLE_ITEMS=>3, SIZE=>"50x10", VALUE=>"Test Value", 1=>"Item 1 Text", 2=>"Item 2 Text Big Item", 3=>"Item 3 Text", 4=>"Item 4 Text", 5=>"Item 5 Text", 6=>"Item 6 Text", CINDEX=>4 ); my $frm_5 = IUP::Frame->new( child=>IUP::Vbox->new( child=>[$list_1, $list_2, $list_3, $list_4] ), TITLE=>"IupList" ); my $hbox_1 = IUP::Hbox->new( child=>[$frm_1, $frm_2, $frm_3, $frm_4, $frm_5] ); my $cnv_1 = IUP::Canvas->new( BGCOLOR=>"128 255 0" ); my $vbox_1 = IUP::Vbox->new( child=>[$hbox_1, $cnv_1], MARGIN=>"5x5", ALIGNMENT=>"ARIGHT", GAP=>5 ); set_callbacks($vbox_1); my $dlg = IUP::Dialog->new( child=>$vbox_1, TITLE=>"MDI Child $id" ); $id++; # $dlg->SetAttribute( # SHRINK=>"YES", # SIZE=>"500x200", # BGCOLOR=>"255 0 255", # FONT=>"Times New Roman:ITALIC:10", # FONT=>IUP_TIMES_BOLD_14, # COMPOSITED=>"YES", # OPACITY=>192 ); return $dlg; } sub mdi_tilehoriz { my $self = shift; $self->GetDialog->MDIARRANGE("TILEHORIZONTAL"); return IUP_DEFAULT; } sub mdi_tilevert { my $self = shift; $self->GetDialog->MDIARRANGE("TILEVERTICAL"); return IUP_DEFAULT; } sub mdi_cascade { my $self = shift; $self->GetDialog->MDIARRANGE("CASCADE"); return IUP_DEFAULT; } sub mdi_icon { my $self = shift; $self->GetDialog->MDIARRANGE("ICON"); return IUP_DEFAULT; } sub mdi_next { my $self = shift; $self->GetDialog->MDIACTIVATE("NEXT"); return IUP_DEFAULT; } sub mdi_previous { my $self = shift; $self->GetDialog->MDIACTIVATE("PREVIOUS"); return IUP_DEFAULT; } sub mdi_closeall { my $self = shift; $self->GetDialog->MDICLOSEALL(undef); return IUP_DEFAULT; } sub mdi_activate { my $self = shift; printf STDERR "$line-mdi_activate(%s)\n", $self->GetName(); $line++; return IUP_DEFAULT; } sub mdi_new { my $self = shift; my $dlg = createDialog(); $dlg->SetAttribute( MDICHILD=>"YES", PARENTDIALOG=>$mdiFrame); $dlg->SetCallback( MDIACTIVATE_CB=>\&mdi_activate ); #$dlg->PLACEMENT("MAXIMIZED"); $dlg->Show(); return IUP_DEFAULT; } sub createMenu { my $mnu = IUP::Menu->new( name=>"mnu", child=>[ IUP::Submenu->new( TITLE=>"MDI", child=> IUP::Menu->new( child=> IUP::Item->new( TITLE=>"New", ACTION=>\&mdi_new ), ), ), IUP::Submenu->new( TITLE=>"Window", , child=> IUP::Menu->new( name=>"winmenu", child=>[ IUP::Item->new( TITLE=>"Tile Horizontal", ACTION=>\&mdi_tilehoriz ), IUP::Item->new( TITLE=>"Tile Vertical", ACTION=>\&mdi_tilevert ), IUP::Item->new( TITLE=>"Cascade", ACTION=>\&mdi_cascade ), IUP::Item->new( TITLE=>"Icon Arrange", ACTION=>\&mdi_icon ), IUP::Item->new( TITLE=>"Close All", ACTION=>\&mdi_closeall ), IUP::Separator->new(), IUP::Item->new( TITLE=>"Next", ACTION=>\&mdi_next ), IUP::Item->new( TITLE=>"Previous", ACTION=>\&mdi_previous ), ]), ), ]); return $mnu; } sub createFrame { my $menu = shift; my $mdiMenu = IUP->GetByName("winmenu"); my $cnv = IUP::Canvas->new( MDICLIENT=>"YES", MDIMENU=>$mdiMenu ); my $dlg = IUP::Dialog->new( name=>"mdiFrame", child=>$cnv, MENU=>$menu, TITLE=>"MDI Frame", MDIFRAME=>"YES", RASTERSIZE=>"800x600" ); return $dlg; } ### main ### if (IUP->GetGlobal('DRIVER') ne 'Win32') { IUP->Message('BEWARE: MDI demo app works just with MS Windows GUI driver!'); } else { $mdiFrame = createFrame( createMenu() ); #$mdiFrame->PLACEMENT("MAXIMIZED"); $mdiFrame->ShowXY(IUP_CENTER, IUP_CENTER); IUP->MainLoop(); }