Adding nickname editing.
This commit is contained in:
parent
4e15773d3d
commit
34a41d74c2
|
@ -0,0 +1,233 @@
|
|||
package GEmeTool::View::PokemonEditorWindow;
|
||||
|
||||
use v5.16.3;
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
use utf8;
|
||||
|
||||
use Moo;
|
||||
|
||||
use Glib::Object::Introspection;
|
||||
use Glib::IO;
|
||||
use Path::Tiny;
|
||||
|
||||
use Rsaves;
|
||||
use Rsaves::Constants::Emerald::Species;
|
||||
|
||||
Glib::Object::Introspection->setup(
|
||||
basename => 'Gtk',
|
||||
version => '4.0',
|
||||
package => 'Gtk4',
|
||||
);
|
||||
|
||||
Glib::Object::Introspection->setup(
|
||||
basename => 'Gdk',
|
||||
version => '4.0',
|
||||
package => 'Gdk',
|
||||
);
|
||||
|
||||
has pokemon => (
|
||||
is => 'ro',
|
||||
required => 1,
|
||||
);
|
||||
|
||||
has _win => ( is => 'rw', );
|
||||
|
||||
has _selected_species => ( is => 'rw', );
|
||||
|
||||
has _save_callbacks => ( is => 'rw', default => sub { [] } );
|
||||
|
||||
my $root = path(__FILE__)->parent->parent->parent->parent;
|
||||
my $width = 600;
|
||||
my $height = 400;
|
||||
|
||||
sub start {
|
||||
my $self = shift;
|
||||
my $window = Gtk4::Window->new;
|
||||
$self->_win($window);
|
||||
$self->draw;
|
||||
$window->present;
|
||||
}
|
||||
|
||||
sub onSave {
|
||||
my $self = shift;
|
||||
my $func = shift;
|
||||
my $save_callbacks = $self->_save_callbacks;
|
||||
push @$save_callbacks, $func;
|
||||
}
|
||||
|
||||
sub draw {
|
||||
my $self = shift;
|
||||
my $window = $self->_win;
|
||||
$window->set_resizable(0);
|
||||
my $pokemon = $self->pokemon;
|
||||
$window->set_title( 'Editing Pokémon '
|
||||
. Rsaves::translate_3rd_encoding( $pokemon->nickname ) );
|
||||
my $grid = Gtk4::Grid->new;
|
||||
$grid->set_column_homogeneous(1);
|
||||
my $canvas = Gtk4::DrawingArea->new;
|
||||
$canvas->set_content_width(267);
|
||||
$canvas->set_content_height(267);
|
||||
$canvas->set_valign('start');
|
||||
$canvas->set_halign('start');
|
||||
$canvas->set_draw_func(
|
||||
sub {
|
||||
my $canvas = shift;
|
||||
my $cairo = shift;
|
||||
my $width = shift;
|
||||
my $height = shift;
|
||||
$cairo->scale( $width / 64, $height / 64 );
|
||||
my $surface = Cairo::ImageSurface->create_from_png(
|
||||
$root->child( $pokemon->get_front ) );
|
||||
$cairo->set_source_surface( $surface, 0, 0 );
|
||||
$cairo->get_source()->set_filter('nearest');
|
||||
$cairo->paint;
|
||||
}
|
||||
);
|
||||
$grid->attach( $canvas, 0, 0, 2, 2 );
|
||||
my @species = (@Rsaves::Constants::Emerald::Species::SPECIES);
|
||||
my $string_list = Gtk4::StringList->new( [@species] );
|
||||
my $save_button = Gtk4::Button->new_with_label('Save changes');
|
||||
$self->_selected_species( $pokemon->species );
|
||||
$self->create_change_nickname_entry($grid);
|
||||
$save_button->signal_connect(
|
||||
clicked => sub {
|
||||
$pokemon->species( $self->_selected_species );
|
||||
for my $func (@{$self->_save_callbacks}) {
|
||||
$func->();
|
||||
}
|
||||
$self->draw;
|
||||
}
|
||||
);
|
||||
$self->draw_dropdown_pokemon_list($grid);
|
||||
$grid->attach( $save_button, 6, 6, 1, 1 );
|
||||
$window->set_child($grid);
|
||||
}
|
||||
|
||||
sub create_change_nickname_entry {
|
||||
my $self = shift;
|
||||
my $grid = shift;
|
||||
my $pokemon = $self->pokemon;
|
||||
my $label = Gtk4::Label->new('Change the nickname:');
|
||||
my $entry = Gtk4::Entry->new;
|
||||
my $nickname = Rsaves::translate_3rd_encoding( $pokemon->nickname );
|
||||
$entry->get_buffer->set_text( $nickname, length $nickname );
|
||||
$entry->set_halign('start');
|
||||
$entry->set_valign('start');
|
||||
$label->set_halign('start');
|
||||
$label->set_valign('start');
|
||||
$grid->attach( $label, 4, 1, 1, 1 );
|
||||
$grid->attach( $entry, 5, 1, 1, 1 );
|
||||
$self->onSave(
|
||||
sub {
|
||||
my $translated_nickname = Rsaves::to_3rd_encoding($entry->get_buffer->get_text);
|
||||
if ( length $translated_nickname < 10 ) {
|
||||
$translated_nickname .= chr(0xff);
|
||||
}
|
||||
if ( length $translated_nickname > 10 ) {
|
||||
$translated_nickname = substr $translated_nickname, 0, 10;
|
||||
}
|
||||
$pokemon->nickname($translated_nickname);
|
||||
}
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
sub draw_dropdown_pokemon_list {
|
||||
my $self = shift;
|
||||
my $grid = shift;
|
||||
my $pokemon = $self->pokemon;
|
||||
my $button_box = Gtk4::Box->new( 'horizontal', 1 );
|
||||
my $box_popover = Gtk4::Box->new( 'vertical', 1 );
|
||||
my $search_bar = Gtk4::SearchBar->new;
|
||||
my $entry_search = Gtk4::SearchEntry->new;
|
||||
my $button = Gtk4::ToggleButton->new;
|
||||
my $popover_dropdown = Gtk4::Popover->new;
|
||||
my $label_pokemon =
|
||||
$self->label_pokemon( $pokemon->pokemon_name, $button_box );
|
||||
my $scroll = Gtk4::ScrolledWindow->new;
|
||||
my $box_pokemons = Gtk4::Box->new( 'vertical', 1 );
|
||||
my @species = (@Rsaves::Constants::Emerald::Species::SPECIES);
|
||||
|
||||
my $func_on_select_dropdown = sub {
|
||||
my $number = shift;
|
||||
$label_pokemon->set_text( $species[$number] );
|
||||
$self->_selected_species($number);
|
||||
$popover_dropdown->popdown;
|
||||
};
|
||||
$entry_search->signal_connect(
|
||||
'search-changed' => sub {
|
||||
my $box_pokemons = Gtk4::Box->new( 'vertical', 1 );
|
||||
$box_pokemons->set_vexpand(1);
|
||||
$self->fill_dropdown( $box_pokemons, $func_on_select_dropdown,
|
||||
$entry_search->get_text );
|
||||
$scroll->set_child($box_pokemons);
|
||||
}
|
||||
);
|
||||
|
||||
$button_box->append($label_pokemon);
|
||||
$button_box->append( Gtk4::Image->new_from_icon_name('pan-down-symbolic') );
|
||||
$button->set_child($button_box);
|
||||
$search_bar->set_child($entry_search);
|
||||
$search_bar->set_search_mode(1);
|
||||
$box_popover->append($search_bar);
|
||||
$box_pokemons->set_vexpand(1);
|
||||
$self->fill_dropdown( $box_pokemons, $func_on_select_dropdown );
|
||||
$scroll->set_child($box_pokemons);
|
||||
$box_popover->append($scroll);
|
||||
$box_popover->set_vexpand(1);
|
||||
$popover_dropdown->set_child($box_popover);
|
||||
$button->signal_connect(
|
||||
clicked => sub {
|
||||
$popover_dropdown->popup;
|
||||
}
|
||||
);
|
||||
$popover_dropdown->set_size_request( 100, 400 );
|
||||
$button_box->append($popover_dropdown);
|
||||
my $label_button = Gtk4::Label->new('Change species:');
|
||||
$grid->attach( $label_button, 2, 1, 1, 1 );
|
||||
$grid->attach( $button, 3, 1, 1, 1 );
|
||||
$label_button->set_valign('start');
|
||||
$label_button->set_halign('start');
|
||||
$button->set_valign('start');
|
||||
$button->set_halign('start');
|
||||
$grid->set_vexpand(1);
|
||||
}
|
||||
|
||||
sub fill_dropdown {
|
||||
my $self = shift;
|
||||
my $box = shift;
|
||||
my $func = shift;
|
||||
my $filter = shift;
|
||||
my @species = (@Rsaves::Constants::Emerald::Species::SPECIES);
|
||||
for ( my $i = 0 ; $i < scalar @species ; $i++ ) {
|
||||
my $number = $i;
|
||||
if ( defined $filter
|
||||
&& !( index( lc( $species[$i] ), lc($filter) ) >= 0 ) )
|
||||
{
|
||||
next;
|
||||
}
|
||||
my $label = Gtk4::Button->new_with_label( $species[$i] );
|
||||
my $controller_gesture = Gtk4::GestureClick->new;
|
||||
$controller_gesture->set_button(1);
|
||||
$controller_gesture->signal_connect(
|
||||
pressed => sub {
|
||||
$func->($number);
|
||||
}
|
||||
);
|
||||
$label->add_controller($controller_gesture);
|
||||
$box->append($label);
|
||||
}
|
||||
}
|
||||
|
||||
sub label_pokemon {
|
||||
my $self = shift;
|
||||
my $name = shift;
|
||||
my $button_box = shift;
|
||||
my $label = Gtk4::Label->new($name);
|
||||
$label->set_hexpand(1);
|
||||
$label->set_halign('start');
|
||||
return $label;
|
||||
}
|
||||
1;
|
Loading…
Reference in New Issue