App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/Gtk2/WatchlistDialog.pm view on Meta::CPAN
use App::Chart::Gtk2::Ex::ToplevelBits;
use App::Chart::Gtk2::Symlist;
# uncomment this to run the ### lines
#use Devel::Comments;
BEGIN {
Gtk2->CHECK_VERSION(2,12,0)
or die "Need Gtk 2.12 or higher"; # for ->error_bell
}
use constant DEFAULT_SYMLIST_KEY => 'favourites';
# use App::Chart::Gtk2::Ex::ToplevelSingleton hide_on_delete => 1;
# use base 'App::Chart::Gtk2::Ex::ToplevelSingleton';
# sub popup {
# my ($class, $parent) = @_;
# my $self = $class->instance_for_screen ($parent);
# $self->present;
# return $self;
# }
use Glib::Object::Subclass
'Gtk2::Dialog',
properties => [ Glib::ParamSpec->object
('symlist',
'symlist',
'The symlist to display.',
# App::Chart::Gtk2::Symlist::Join isn't a glib derivative
'Glib::Object', # 'App::Chart::Gtk2::Symlist',
Glib::G_PARAM_READWRITE),
];
use constant { NOTEBOOK_PAGENUM_SYMBOLS => 0,
NOTEBOOK_PAGENUM_SYMLISTS => 1 };
use constant { RESPONSE_REFRESH => 0,
RESPONSE_DELETE => 1,
RESPONSE_INTRADAY => 2,
RESPONSE_EDIT_NAME => 3,
};
sub INIT_INSTANCE {
my ($self) = @_;
$self->set_title (__('Chart: Watchlist'));
$self->signal_connect (response => \&_do_response);
my $vbox = $self->vbox;
my $action_area = $self->action_area;
my $em = Gtk2::Ex::Units::em($self);
my $symlist = $self->{'symlist'}
= App::Chart::Gtk2::Symlist->new_from_key (DEFAULT_SYMLIST_KEY);
my $notebook = $self->{'notebook'} = Gtk2::Notebook->new;
$notebook->set (tab_hborder => 0.5 * $em);
$vbox->pack_start ($notebook, 1,1,0);
# require App::Chart::Gtk2::SymlistComboBox;
# my $combobox = App::Chart::Gtk2::SymlistComboBox->new;
# Glib::Ex::ConnectProperties->new ([$self, 'symlist'],
# [$combobox,'symlist']);
# $combobox->signal_connect (changed => \&_do_combobox_changed);
# $action_area->add ($combobox);
$self->add_buttons ('gtk-refresh' => RESPONSE_REFRESH,
'gtk-delete' => RESPONSE_DELETE);
{
my $intraday_button = $self->{'intraday_button'}
= Gtk2::Button->new_with_mnemonic (__('_Intraday'));
$self->add_action_widget ($intraday_button, RESPONSE_INTRADAY);
}
{
my $edit_button = $self->{'edit_button'}
= Gtk2::Button->new_with_mnemonic (__('_Edit Name'));
$self->add_action_widget ($edit_button, RESPONSE_EDIT_NAME);
}
$self->add_buttons ('gtk-close' => 'close',
'gtk-help' => 'help');
require App::Chart::Gtk2::WatchlistModel;
my $model = App::Chart::Gtk2::WatchlistModel->new ($symlist);
my $symbols_vbox = Gtk2::VBox->new;
my $symbols_tab_eventbox = $self->{'symbols_tab_eventbox'}
= Gtk2::EventBox->new;
$symbols_tab_eventbox->signal_connect
(button_press_event => \&_do_symbols_tab_button_press);
my $symbols_tab_label = $self->{'symbols_tab_label'} = Gtk2::Label->new;
$symbols_tab_label->show;
$symbols_tab_eventbox->add ($symbols_tab_label);
$notebook->append_page ($symbols_vbox, $symbols_tab_eventbox);
my $symlists_vbox = $self->{'symlists_vbox'} = Gtk2::VBox->new;
$notebook->append_page ($symlists_vbox, __('Symlists'));
App::Chart::Gtk2::Ex::NotebookLazyPages::set_init
($notebook, $symlists_vbox, \&_init_symlists_page);
$notebook->signal_connect ('notify::page' => \&_do_notebook_notify_page);
my $scrolled = $self->{'symbols_scrolled'} = Gtk2::ScrolledWindow->new;
$scrolled->set(hscrollbar_policy => 'never');
$symbols_vbox->pack_start ($scrolled, 1,1,0);
my $treeview = $self->{'symbols_treeview'}
= Gtk2::TreeView->new_with_model ($model);
$treeview->set (fixed_height_mode => 1,
reorderable => $symlist && $symlist->can_edit);
$scrolled->add ($treeview);
$treeview->signal_connect (query_tooltip => \&_do_query_tooltip);
$treeview->set (has_tooltip => 1);
my $selection = $treeview->get_selection;
$selection->signal_connect (changed => \&_do_symbol_selection_changed);
$selection->set_mode ('single');
my $renderer_left = Gtk2::CellRendererText->new;
$renderer_left->set (xalign => 0,
ypad => 0);
$renderer_left->set_fixed_height_from_font (1);
my $renderer_right = Gtk2::CellRendererText->new;
lib/App/Chart/Gtk2/WatchlistDialog.pm view on Meta::CPAN
fixed_width => 6*$em,
resizable => 1);
$treeview->append_column ($column);
}
{
my $column = Gtk2::TreeViewColumn->new_with_attributes
(__('When'), $renderer_right,
text => $model->COL_WHEN,
foreground => $model->COL_COLOUR);
$column->set (sizing => 'fixed',
fixed_width => 6*$em,
resizable => 1);
$treeview->append_column ($column);
}
{
my $column = Gtk2::TreeViewColumn->new_with_attributes
(__('Notes'), $renderer_left,
text => $model->COL_NOTE,
foreground => $model->COL_COLOUR);
$column->set (sizing => 'fixed',
fixed_width => 8*$em,
resizable => 1);
$treeview->append_column ($column);
}
$treeview->add_events ('button-press-mask');
$treeview->signal_connect (button_press_event => \&_do_symbol_menu_popup);
$treeview->signal_connect (row_activated => \&_do_symbol_treeview_activate);
my $hbox = Gtk2::HBox->new;
$symbols_vbox->pack_start ($hbox, 0,0,0);
my $entry_label = Gtk2::Label->new (__('New Symbol'));
$hbox->pack_start ($entry_label, 0,0,0);
my $entry = $self->{'symbol_entry'} = Gtk2::Entry->new;
$hbox->pack_start ($entry, 1,1,0);
$entry->signal_connect (activate => \&_do_symbol_entry_activate);
{ my $button = Gtk2::Button->new_with_label (__('Insert'));
$hbox->pack_start ($button, 0,0,0);
$button->signal_connect (clicked => \&_do_symbol_entry_activate);
}
_update_delete_sensitive ($self);
_update_intraday_sensitive ($self);
_update_edit_sensitive ($self);
$vbox->show_all;
_do_notebook_notify_page ($notebook); # initial hides
# with a sensible rows size for the TreeView
Gtk2::Ex::Units::set_default_size_with_subsizes
($self, [$scrolled, -1, '20 lines']);
$self->{'symlist'} = undef; # fake to force update
$self->set_symlist ($symlist);
}
# # 'notify:symlist' on the App::Chart::Gtk2::SymlistComboBox
# # switch page to the symbol list display when a symlist is selected
# sub _do_combobox_changed {
# my ($combobox) = @_;
# if (DEBUG) {
# print "Watchlist symlist combobox changed, switch notebook to symbols\n";
# }
# my $self = $combobox->get_toplevel;
# my $notebook = $self->{'notebook'};
# $notebook->set_current_page(NOTEBOOK_PAGENUM_SYMBOLS);
# }
# 'edited' signal on the Gtk2::CellRendererText in the symbol column,
# initiate a download of the new symbol
sub _do_symbol_renderer_edited {
my ($renderer, $pathstr, $newstr) = @_;
require App::Chart::Gtk2::Job::Latest;
App::Chart::Gtk2::Job::Latest->start ([$newstr]);
}
sub _do_notebook_notify_page {
my ($notebook) = @_;
my $self = $notebook->get_toplevel;
### Watchlist notebook switch to: $notebook->get_current_page
my $pagenum = $notebook->get_current_page;
$self->{'intraday_button'}->set
(visible => ($pagenum == NOTEBOOK_PAGENUM_SYMBOLS));
$self->{'edit_button'}->set
(visible => ($pagenum == NOTEBOOK_PAGENUM_SYMLISTS));
_update_delete_sensitive ($self);
}
sub _init_symlists_page {
my ($notebook, $vbox, $pagenum) = @_;
my $self = $notebook->get_toplevel;
### Watchlist _init_symlists_page()
my $scrolled = $self->{'symlists_scrolled'} = Gtk2::ScrolledWindow->new;
$scrolled->set (hscrollbar_policy => 'automatic');
$vbox->pack_start ($scrolled, 1,1,0);
require App::Chart::Gtk2::SymlistListModel;
my $model = App::Chart::Gtk2::SymlistListModel->instance;
my $treeview = $self->{'symlists_treeview'}
= Gtk2::TreeView->new_with_model ($model);
$treeview->set (fixed_height_mode => 0,
reorderable => 1);
$scrolled->add ($treeview);
$treeview->signal_connect (row_activated =>\&_do_symlists_treeview_activate);
$treeview->add_events ('button-press-mask');
$treeview->signal_connect (button_press_event => \&_do_symlist_menu_popup);
# $treeview->signal_connect (query_tooltip => \&_do_query_tooltip);
# $treeview->set (has_tooltip => 1);
my $selection = $treeview->get_selection;
$selection->signal_connect (changed => \&_do_symlist_selection_changed);
$selection->set_mode ('single');
{
my $renderer = $self->{'symlists_name_renderer'}
= Gtk2::CellRendererText->new;
$renderer->set (xalign => 0,
ypad => 0);
my $column = $self->{'symlists_name_treecolumn'}
= Gtk2::TreeViewColumn->new_with_attributes
(__('Name'), $renderer, text => $model->COL_NAME);
( run in 0.531 second using v1.01-cache-2.11-cpan-2398b32b56e )