view release on metacpan or search on metacpan
lib/App/financeta/gui.pm view on Meta::CPAN
$dlg->btn_cancel->enabled(1);
$dlg->btn_ok->enabled(0);
},
);
$w->owner($win) if defined $win;
my %tabs = $self->get_tab_names($win);
$log->debug("Current tabs: ", dumper(\%tabs));
my $result = {};
$w->insert(Label => name => 'label_tabs',
text => 'Select Security',
font => { style => fs::Bold, height => 16 },
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [20, 240],
hint => 'This is a list of already open tabs',
hintVisible => 1,
);
$w->insert(ComboBox =>
name => 'cbox_tabs',
style => cs::DropDownList,
height => 30,
width => 360,
hScroll => 0,
multiSelect => 0,
multiColumn => 0,
dragable => 0,
focusedItem => -1,
font => { height => 14 },
items => ['', keys %tabs],
origin => [180, 240],
onChange => sub {
my $cbox = shift;
my $owner = $cbox->owner;
my $lbox = $cbox->List;
my $index = $lbox->focusedItem;
my $txt = $lbox->get_item_text($index);
if (defined $txt and length $txt) {
my $indicators = $self->get_tab_indicators($owner->owner, $txt);
lib/App/financeta/gui.pm view on Meta::CPAN
$owner->cbox_inds->focusedItem(-1);
$owner->cbox_inds->text('');
$owner->btn_ok->enabled(0);
delete $result->{tab};
}
},
);
$w->cbox_tabs->text('');
$w->insert(Label => name => 'label_inds',
text => 'Select Indicator',
font => { style => fs::Bold, height => 16 },
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [20, 200],
hint => 'These indicators are already present in the selected tab',
hintVisible => 1,
);
$w->insert(ComboBox =>
name => 'cbox_inds',
style => cs::DropDownList,
height => 30,
width => 360,
hScroll => 0,
font => { height => 14 },
multiSelect => 0,
multiColumn => 0,
dragable => 0,
focusedItem => -1,
text => '',
items => [],
origin => [180, 200],
onChange => sub {
my $cbox = shift;
my $owner = $cbox->owner;
lib/App/financeta/gui.pm view on Meta::CPAN
);
$w->insert(
Button => name => 'btn_cancel',
text => 'Cancel',
autoHeight => 1,
autoWidth => 1,
origin => [ 20, 20 ],
modalResult => mb::Cancel,
default => 0,
enabled => 1,
font => { height => 16, style => fs::Bold },
onClick => sub {
$result = {};
},
);
$w->insert(
Button => name => 'btn_ok',
text => 'OK',
autoHeight => 1,
autoWidth => 1,
origin => [ 150, 20 ],
modalResult => mb::Ok,
default => 1,
enabled => 0,
font => { height => 16, style => fs::Bold },
onClick => sub {
my $btn = shift;
my $owner = $btn->owner;
my $indicators = $self->get_tab_indicators($owner->owner, $result->{tab});
my @inds = ();
if ($indicators) {
my $iref = $indicators->[$result->{indicator_index}]->{indicator};
if ($iref->{func} eq $result->{indicator}) {
$result->{columns} = $indicators->[$result->{indicator_index}]->{columns};
} else {
lib/App/financeta/gui.pm view on Meta::CPAN
# if no params just write that
unless (scalar @$params) {
$gbox->insert('Label',
text => "There are no parameters to configure.",
name => "label_$grp\_noparams",
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [$origin[0] + 10,
$origin[1] + $count * $sz_y - 40],
font => {height => 16},
);
}
foreach my $p (reverse @$params) {
next unless ref $p eq 'ARRAY';
my $hkey = $p->[0];
my $label = $p->[1];
my $type = $p->[2];
my $typeclass = blessed($type) if $type;
my $value = $p->[3];
if (defined $type and $type eq 'ARRAY' and ref $value eq 'ARRAY') {
# use ComboBox
$self->current->{indicator}->{params}->{$hkey} = $value->[0];
$self->current->{indicator}->{params}->{$hkey . '_index'} = 0;
$gbox->insert(Label => text => $label,
name => "label_$grp\_$count",
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [$origin[0] + 10,
$origin[1] + $count * $sz_y - 40],
font => {height => 13},
);
$gbox->insert(ComboBox => style => cs::DropDownList,
name => "cbox_$grp\_$count",
height => 30,
width => $sz_x - 50,
autoHeight => 1,
font => { height => 16 },
hScroll => 0,
multiSelect => 0,
multiColumn => 0,
dragable => 0,
focusedItem => -1,
items => $value,
autoTab => 1,
origin => [$origin[0] + 10 + $sz_x,
$origin[1] + $count * $sz_y - 40],
onChange => sub {
lib/App/financeta/gui.pm view on Meta::CPAN
} elsif (defined $typeclass and $typeclass eq 'PDL::Type') {
# use InputLine for all numbers
$self->current->{indicator}->{params}->{$hkey} = $value;
$gbox->insert(Label => text => $label,
name => "label_$grp\_$count",
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [$origin[0] + 10,
$origin[1] + $count * $sz_y - 40],
font => {height => 13},
);
$gbox->insert(InputLine => name => "input_$grp\_$count",
alignment => ta::Left,
autoHeight => 1,
width => $sz_x - 50,
autoTab => 1,
maxLen => 20,
origin => [$origin[0] + 10 + $sz_x,
$origin[1] + $count * $sz_y - 40],
text => $value,
font => {height => 16},
onChange => sub {
my $il = shift;
my $val = undef;
my $txt = $il->text;
return unless length $txt;
if ($type->symbol eq 'PDL_B') {
# byte buffer
$val = $txt;
} elsif ($type->symbol eq 'PDL_F' or $type->symbol eq 'PDL_D') {
# is a real number
lib/App/financeta/gui.pm view on Meta::CPAN
# use InputLine for all numbers
$self->current->{indicator}->{params}->{$hkey} = $value;
$self->current->{indicator}->{params}->{$hkey . '_pdl'} = 1;
$gbox->insert(Label => text => $label,
name => "label_$grp\_$count",
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [$origin[0] + 10,
$origin[1] + $count * $sz_y - 40],
font => {height => 13},
hint => 'This should be a comma-separated list of integers',
);
$gbox->insert(InputLine => name => "input_$grp\_$count",
alignment => ta::Left,
autoHeight => 1,
width => $sz_x - 50,
autoTab => 1,
maxLen => 256,
origin => [$origin[0] + 10 + $sz_x,
$origin[1] + $count * $sz_y - 40],
text => $value,
font => {height => 16},
onChange => sub {
my $il = shift;
my $val = undef;
my $txt = $il->text;
return unless length $txt;
if ($txt !~ /\d[\d,\s]*/) {
message_box('Parameter Error',
"$label has to be a comma-separated list of integers",
mb::Ok | mb::Error);
return;
lib/App/financeta/gui.pm view on Meta::CPAN
);
} else {
# use checkbox
$self->current->{indicator}->{params}->{$hkey} = ($value) ? 1 : 0;
$gbox->insert(CheckBox => name => "chk_$grp\_$count",
alignment => ta::Left,
autoTab => 1,
origin => [$origin[0] + 10,
$origin[1] + $count * $sz_y - 40],
text => $label,
font => {height => 13},
onCheck => sub {
my $chk = shift;
$self->current->{indicator}->{params}->{$hkey} =
$chk->checked ? 1 : 0;
},
);
}
$count++;
}
} else {
lib/App/financeta/gui.pm view on Meta::CPAN
$dlg->cbox_funcs->List->focusedItem(-1);
$dlg->btn_cancel->enabled(1);
$dlg->btn_ok->enabled(0);
},
);
$w->owner($win) if defined $win;
$self->current->{indicator} = {}; # reset
my @groups = $self->indicator->get_groups;
$w->insert(Label => name => 'label_groups',
text => 'Select Group',
font => { style => fs::Bold, height => 16 },
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [20, 440],
hint => 'This is a list of indicator groups',
hintVisible => 1,
);
$w->insert(ComboBox =>
name => 'cbox_groups',
style => cs::DropDownList,
height => 30,
width => 360,
hScroll => 0,
multiSelect => 0,
multiColumn => 0,
dragable => 0,
focusedItem => -1,
font => { height => 14 },
items => [ '', @groups],
origin => [180, 440],
onChange => sub {
my $cbox = shift;
my $owner = $cbox->owner;
my $lbox = $cbox->List;
my $index = $lbox->focusedItem;
my $txt = $lbox->get_item_text($index);
if (defined $txt and length $txt) {
my @funcs = $self->indicator->get_funcs($txt);
lib/App/financeta/gui.pm view on Meta::CPAN
$self->indicator_parameter_wizard($owner->gbox_params);
$owner->cbox_funcs->text('');
$owner->btn_ok->enabled(0);
delete $self->current->{indicator}->{group};
}
},
);
$w->cbox_groups->text('');
$w->insert(Label => name => 'label_funcs',
text => 'Select Function',
font => { style => fs::Bold, height => 16 },
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [20, 400],
hint => 'Each indicator group has multiple indicators it supports',
hintVisible => 1,
);
$w->insert(ComboBox =>
name => 'cbox_funcs',
style => cs::DropDownList,
height => 30,
width => 360,
hScroll => 0,
font => { height => 14 },
multiSelect => 0,
multiColumn => 0,
dragable => 0,
focusedItem => -1,
text => '',
items => [],
origin => [180, 400],
onChange => sub {
my $cbox = shift;
my $owner = $cbox->owner;
lib/App/financeta/gui.pm view on Meta::CPAN
);
$w->insert(
Button => name => 'btn_cancel',
text => 'Cancel',
autoHeight => 1,
autoWidth => 1,
origin => [ 20, 20 ],
modalResult => mb::Cancel,
default => 0,
enabled => 1,
font => { height => 16, style => fs::Bold },
onClick => sub {
delete $self->current->{indicator};
},
);
$w->insert(
Button => name => 'btn_ok',
text => 'OK',
autoHeight => 1,
autoWidth => 1,
origin => [ 360, 20 ],
modalResult => mb::Ok,
default => 1,
enabled => 0,
font => { height => 16, style => fs::Bold },
onClick => sub {
$log->debug("Final parameters selected: ", dumper($self->current->{indicator}));
},
);
$w->insert(
Button => name => 'btn_help',
text => 'Indicator Help',
autoHeight => 1,
autoWidth => 1,
origin => [ 150, 20 ],
default => 0,
enabled => 1,
font => { height => 16, style => fs::Bold },
onClick => sub {
my $url = 'https://vikasnkumar.github.io/financeta/indicators.html';
my $ok = Browser::Open::open_browser($url, 1);
if (not defined $ok) {
message("Error finding a browser to open $url");
} elsif ($ok != 0) {
message("Error opening $url");
}
},
);
$w->insert(GroupBox => name => 'gbox_params',
text => 'Indicator Parameters',
size => [600, 300],
origin => [20, 60],
font => { height => 16, style => fs::Bold },
);
my $res = $w->execute();
$w->end_modal;
return $res == mb::Ok;
}
sub download_data {
my ($self, $pbar, $current) = @_;
$pbar->update(5) if $pbar;
$current = $self->current unless $current;
lib/App/financeta/gui/progress_bar.pm view on Meta::CPAN
pointerType => cr::Wait,
onPaint => sub {
my ($w, $canvas) = @_;
$canvas->color(cl::Blue);
$canvas->bar(0, 0, $w->{-progress}, $w->height);
$canvas->color(cl::Back);
$canvas->bar($w->{-progress}, 0, $w->size);
my $pct = floor(100 * $w->{-progress} / $w->width);
if ($pct > 0) {
$canvas->color(cl::Yellow);
$canvas->font(size => 10, style => fs::Bold);
$canvas->text_out(sprintf("%d%%", $pct), 0, 10) if $pct > 0;
}
},
syncPaint => 1,
onTop => 1,
);
$bar->{-progress} = 0;
$bar->repaint;
if (defined $bar->owner) {
$bar->owner->pointerType(cr::Wait);
lib/App/financeta/gui/security_wizard.pm view on Meta::CPAN
);
my $pwin = $self->owner;
$w->owner($pwin) if defined $pwin;
$w->insert(
Label => text => 'Select Source',
name => 'label_source',
alignment => ta::Left,
autoHeight => 1,
origin => [ 20, $sz_y - 40],
autoWidth => 1,
font => { height => 14, style => fs::Bold },
hint => 'Stock symbols are available at Yahoo! Finance',
);
$w->insert(
ComboBox => name => 'input_source',
style => cs::DropDownList,
multiSelect => 0,
alignment => ta::Left,
width => 200,
height => 30,
autoTab => 1,
origin => [ 200, $sz_y - 40],
font => { height => 16 },
items => $gui->list_sources_pretty,
selectedItems => [0],
onChange => sub {
my $inp = shift;
my $idx = $inp->focusedItem;
$gui->current->{source_index} = $idx;
$log->info("Selected input source index: $idx");
},
);
$w->insert(
Label => text => 'Enter Security Symbol',
name => 'label_symbol',
alignment => ta::Left,
autoHeight => 1,
origin => [ 20, $sz_y - 80],
autoWidth => 1,
font => { height => 14, style => fs::Bold },
hint => 'Stock symbols are available at Yahoo! Finance',
);
$w->insert(
InputLine => name => 'input_symbol',
alignment => ta::Left,
autoHeight => 1,
width => 160,
autoTab => 1,
maxLen => 10,
origin => [ 200, $sz_y - 80],
font => { height => 16 },
onChange => sub {
my $inp = shift;
my $owner = $inp->owner;
unless (length $inp->text) {
$owner->btn_ok->enabled(0);
} else {
$owner->btn_ok->enabled(1);
}
},
);
$w->insert(
Button => name => 'btn_help',
text => 'Symbol Search',
height => 20,
autoWidth => 1,
origin => [$sz_x - 100, $sz_y - 80],
default => 0,
enabled => 1,
font => { height => 12, style => fs::Bold },
onClick => sub {
my $owner = shift->owner;
my $arr = $gui->list_sources_urls;
my $idx = $owner->input_source->focusedItem;
my $url = $arr->[$idx // 0];
$log->info("Opening URL $url");
my $ok = Browser::Open::open_browser($url, 1);
if (not defined $ok) {
message("Error finding a browser to open $url");
} elsif ($ok != 0) {
lib/App/financeta/gui/security_wizard.pm view on Meta::CPAN
}
},
);
$w->insert(
Label => text => 'Select Start Date',
name => 'label_enddate',
alignment => ta::Center,
autoHeight => 1,
autoWidth => 1,
origin => [ 20, $sz_y - 220 ],
font => { height => 14, style => fs::Bold },
);
$w->insert(
Calendar => name => 'cal_start',
useLocale => 1,
size => [ 220, 200 ],
origin => [ 20, $sz_y - 440 ],
font => { height => 16 },
onChange => sub {
my $cal = shift;
$gui->current->{start_date} = DateTime->new(
year => 1900 + $cal->year(),
month => 1 + $cal->month(),
day => $cal->day(),
time_zone => $gui->timezone,
);
},
);
$w->insert(
Label => text => 'Select End Date',
name => 'label_enddate',
alignment => ta::Center,
autoHeight => 1,
autoWidth => 1,
origin => [ $sz_x / 2, $sz_y - 220 ],
font => { height => 14, style => fs::Bold },
);
$w->insert(
Calendar => name => 'cal_end',
useLocale => 1,
size => [ 220, 200 ],
origin => [ $sz_x / 2, $sz_y - 440 ],
font => { height => 16 },
onChange => sub {
my $cal = shift;
$gui->current->{end_date} = DateTime->new(
year => 1900 + $cal->year(),
month => 1 + $cal->month(),
day => $cal->day(),
time_zone => $gui->timezone,
);
},
);
$w->insert(
CheckBox => name => 'chk_force_download',
text => 'Force Download',
origin => [ 20, $sz_y - 500 ],
font => { height => 14, style => fs::Bold },
onCheck => sub {
my $chk = shift;
my $owner = $chk->owner;
if ($chk->checked) {
$gui->current->{force_download} = 1;
} else {
$gui->current->{force_download} = 0;
}
},
);
$w->insert(
Button => name => 'btn_csv',
text => 'Load from CSV',
autoHeight => 1,
autoWidth => 1,
origin => [ 200, $sz_y - 500 ],
default => 0,
enabled => 1,
font => { height => 16, style => fs::Bold },
onClick => sub {
my $btn = shift;
my $owner = $btn->owner;
$owner->hide;
my $dlg = Prima::Dialog::OpenDialog->new(
filter => [
['CSV files' => '*.csv'],
['All files' => '*'],
],
filterIndex => 0,
lib/App/financeta/gui/security_wizard.pm view on Meta::CPAN
$owner->show;
},
);
$w->insert(
Label => text => '',
name => 'label_csv',
alignment => ta::Left,
autoHeight => 1,
autoWidth => 1,
origin => [ 360, $sz_y - 500 ],
font => { height => 13, style => fs::Bold },
);
$w->insert(
Button => name => 'btn_cancel',
text => 'Cancel',
autoHeight => 1,
autoWidth => 1,
origin => [ 20, $sz_y - 550 ],
modalResult => mb::Cancel,
default => 0,
enabled => 1,
font => { height => 16, style => fs::Bold },
onClick => sub {
delete $gui->current->{symbol};
delete $gui->current->{start_date};
delete $gui->current->{end_date};
delete $gui->current->{force_download};
delete $gui->current->{csv};
},
);
$w->insert(
Button => name => 'btn_ok',
text => 'OK',
autoHeight => 1,
autoWidth => 1,
origin => [ 150, $sz_y - 550 ],
modalResult => mb::Ok,
default => 1,
enabled => 0,
font => { height => 16, style => fs::Bold },
onClick => sub {
my $btn = shift;
my $owner = $btn->owner;
$gui->current->{source_index} = $owner->input_source->focusedItem;
$log->info("Selected input source index: " . $gui->current->{source_index});
$gui->current->{symbol} = $owner->input_symbol->text;
$log->info("Selected input symbol: " . $gui->current->{symbol});
unless (defined $gui->current->{start_date}) {
my $cal = $owner->cal_start;
$gui->current->{start_date} = DateTime->new(
lib/App/financeta/gui/tradereport.pm view on Meta::CPAN
}
my @sz = $mw->size;
return $mw->insert('Label',
name => 'tradereport_label',
pack => { fill => 'both' },
text => $txt,
origin => [20, 20],
autoHeight => 1,
width => $sz[0],
alignment => ta::Left,
font => { height => 14, style => fs::Bold },
color => $color,
hint => 'This is the sum total P&L',
);
}
sub _create_sheet {
my ($self, $mw, $items) = @_;
my @sz = $mw->size;
$sz[0] *= 0.80;
$sz[1] *= 0.80;
share/spinner.svg view on Meta::CPAN
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 6.2.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2...