App-Chart

 view release on metacpan or  search on metacpan

lib/App/Chart/Gtk2/WatchlistDialog.pm  view on Meta::CPAN

  $vbox->pack_start ($hbox, 0,0,0);

  my $entry_label = Gtk2::Label->new (__('New List'));
  $hbox->pack_start ($entry_label, 0,0,0);

  my $entry = $self->{'symlist_entry'} = Gtk2::Entry->new;
  $hbox->pack_start ($entry, 1,1,0);
  $entry->signal_connect (activate => \&_do_symlist_entry_activate);

  { my $button = Gtk2::Button->new_with_label (__('Insert'));
    $hbox->pack_start ($button, 0,0,0);
    $button->signal_connect (clicked => \&_do_symlist_entry_activate);
  }

  $self->{'symlists_setup'} = 1;
  $vbox->show_all;
}

sub SET_PROPERTY {
  my ($self, $pspec, $newval) = @_;
  my $pname = $pspec->get_name;
  if ($pspec->get_name eq 'symlist') {
    $self->set_symlist ($newval);
  } else {
    $self->{$pname} = $newval;  # per default GET_PROPERTY
  }
}

sub get_selected_symbol {
  my ($self) = @_;
  my $treeview = $self->{'symbols_treeview'};
  my $selection = $treeview->get_selection;
  my ($model, $iter) = $selection->get_selected;
  if (! defined $iter) { return undef; }
  my ($symbol) = $model->get ($iter, 0);
  return $symbol;
}

sub set_symlist {
  my ($self, $symlist) = @_;
  ### Watchlist set_symlist()

  if (my $conn = delete $self->{'symlist_name_conn'}) {
    $conn->disconnect;
  }
  my $label = $self->{'symbols_tab_label'};
  if ($symlist) {
    $self->{'symlist_name_conn'}
      = Glib::Ex::ConnectProperties->new ([$symlist,'name'],
                                          [$label,  'label']);
  } else {
    $label->set_text (__('(No list)'));
  }

  if (($symlist||0) eq ($self->{'symlist'}||0)) {
    ### symlist unchanged
    return;
  }

  ### new symlist: "$symlist"
  Gtk2::Ex::WidgetCursor->busy;
  my $model = $symlist && App::Chart::Gtk2::WatchlistModel->new ($symlist);

  {
    my $reorderable = $symlist && $symlist->can_edit;
    my $symbols_treeview = $self->{'symbols_treeview'};
    ### $reorderable
    $symbols_treeview->set (model       => $model,
                            reorderable => $reorderable);

    # FIXME: what was this? dragging text to add a symbol? doing it turns
    # off reorderable circa gtk 2.24 -- another incompatible change probably ...
    #
    # if ($reorderable) {
    #   $symbols_treeview->enable_model_drag_dest
    #     (['move'], { target => 'text/plain',
    #                  flags => []});  # 'other-app'
    # }
  }

  $self->{'symlist'} = $symlist;

  if ($symlist) {
    if (my $treeview = $self->{'symlists_treeview'}) {
      my $model = $treeview->get_model;
      my $key = $symlist->key;
      $model->foreach
        (sub {
           my ($model, $path, $iter) = @_;
           my $this_key = $model->get_value ($iter, $model->COL_KEY);
           if ($this_key ne $key) { return 0; } # keep iterating
           my $selection = $treeview->get_selection;
           $selection->select_path ($path);
           return 1; # stop iterating
         });
    }
  }

  my $editable = $symlist && $symlist->can_edit;
  ### symbol column editable: $editable
  $self->{'symbol_renderer'}->set (editable => $editable);

  $self->notify ('symlist');
}

sub get_symlists_selected_key {
  my ($self) = @_;
  my $treeview = $self->{'symlists_treeview'} || return; # if created yet
  my $selection = $treeview->get_selection;
  my ($model, $iter) = $selection->get_selected;
  if (! defined $iter) { return; }
  my ($symbol) = $model->get ($iter, $model->COL_KEY);
  return $symbol;
}

sub _update_delete_sensitive {
  my ($self) = @_;
  ### Watchlist _update_delete_sensitive()
  $self->set_response_sensitive (RESPONSE_DELETE,
                                 _want_delete_sensitive($self));
}

lib/App/Chart/Gtk2/WatchlistDialog.pm  view on Meta::CPAN

      $treeview = $self->{'symlists_treeview'};
      # supposed to be insensitive when no selection, but check anyway
      my $key = $self->get_symlists_selected_key || return;

      # ignore somehow unknown key
      my $symlist = App::Chart::Gtk2::Symlist->new_from_key ($key) || return;

      if (! $symlist->is_empty) {
        # dialog if symlist not empty
        require App::Chart::Gtk2::DeleteSymlistDialog;
        App::Chart::Gtk2::DeleteSymlistDialog->popup ($symlist, $self);
        return;
      }
    } else {
      $treeview = $self->{'symbols_treeview'};
    }
    require Gtk2::Ex::TreeViewBits;
    Gtk2::Ex::TreeViewBits::remove_selected_rows ($treeview);

  } elsif ($response eq RESPONSE_INTRADAY) {
    # supposed to be insensitive when no selected symbol, but check anyway
    my $symbol = $self->get_selected_symbol // return;
    App::Chart::Gtk2::Ex::ToplevelBits::popup
        ('App::Chart::Gtk2::IntradayDialog',
         properties => { symbol => $symbol },
         screen => $self);

  } elsif ($response eq RESPONSE_EDIT_NAME) {
    my $notebook = $self->{'notebook'};
    my $pagenum = $notebook->get_current_page;
    # supposed to be visible only when symlists showing, but check anyway
    ($pagenum == NOTEBOOK_PAGENUM_SYMLISTS) or return;

    my $treeview = $self->{'symlists_treeview'};
    my $selection = $treeview->get_selection;
    my ($symlists_model, $iter) = $selection->get_selected;
    # supposed to be insensitive if no selection, but check anyway
    if (! defined $iter) { return; }

    my $path = $symlists_model->get_path($iter);
    ### set_cursor to path: $path->to_string
    $treeview->grab_focus;
    my $renderer = $self->{'symlists_name_renderer'};
    $renderer->set (editable => 1);
    $treeview->set_cursor ($path, $self->{'symlists_name_treecolumn'}, 1);
    $renderer->set (editable => 0);

  } elsif ($response eq 'close') {
    # as per a keyboard close, defaults to raising 'delete-event', which in
    # turn defaults to a destroy
    $self->signal_emit ('close');

  } elsif ($response eq 'help') {
    require App::Chart::Manual;
    App::Chart::Manual->open(__p('manual-node','Watchlist'), $self);
  }
}

sub refresh {
  my ($self) = @_;
  Gtk2::Ex::WidgetCursor->busy;
  if (my $symlist = $self->{'symlist'}) {
    require App::Chart::Gtk2::Job::Latest;
    App::Chart::Gtk2::Job::Latest->start_symlist ($symlist);
  }
}

sub _do_symbol_menu_popup {
  my ($treeview, $event) = @_;
  if ($event->button == 3) {
    require App::Chart::Gtk2::WatchlistSymbolMenu;
    App::Chart::Gtk2::WatchlistSymbolMenu->popup_from_treeview ($event, $treeview);
  }
  return Gtk2::EVENT_PROPAGATE;
}

sub _do_symlist_menu_popup {
  # nothing yet ...
  #   my ($treeview, $event) = @_;
  #   my $self = $treeview->get_toplevel;
  return Gtk2::EVENT_PROPAGATE;
}

# 'query-tooltip' signal on symbols_treeview
sub _do_query_tooltip {
  my ($treeview, $x, $y, $keyboard_tip, $tooltip) = @_;
  # ### Watchlist _do_query_tooltip() "$x,$y"

  my ($bin_x, $bin_y, $model, $path, $iter)
    = $treeview->get_tooltip_context ($x, $y, $keyboard_tip);
  if (! defined $path) { return 0; }

  my $symbol = $model->get_value($iter, $model->COL_SYMBOL);
  if (! defined $symbol) { return 0; }
  require App::Chart::Latest;
  my $latest = App::Chart::Latest->get ($symbol);

  require App::Chart::Database;
  my $tip = $symbol;
  if (my $name = ($latest->{'name'}
                  || App::Chart::Database->symbol_name ($symbol))) {
    $tip .= ' - ' . $name;
  }
  $tip .= "\n";

  if (my $quote_date = $latest->{'quote_date'}) {
    my $quote_time = $latest->{'quote_time'} || '';
    $tip .= __x("Quote: {quote_date} {quote_time}",
                quote_date => $quote_date,
                quote_time => $quote_time);
    $tip .= "\n";
  }

  if (my $last_date = $latest->{'last_date'}) {
    my $last_time = $latest->{'last_time'} || '';
    $tip .= __x("Last:  {last_date} {last_time}",
                last_date => $last_date,
                last_time => $last_time);
    $tip .= "\n";
  }



( run in 1.633 second using v1.01-cache-2.11-cpan-483215c6ad5 )