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 )