From e15472d08682c3e09ebbd6fca9cf39de65e0121a Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Sat, 4 Dec 2021 00:35:21 +0300 Subject: [PATCH 1/7] * new bunch of functions for Shutter::Draw::Utils --- .../resources/modules/Shutter/Draw/Utils.pm | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/share/shutter/resources/modules/Shutter/Draw/Utils.pm b/share/shutter/resources/modules/Shutter/Draw/Utils.pm index aa34e8f0..bce59afe 100644 --- a/share/shutter/resources/modules/Shutter/Draw/Utils.pm +++ b/share/shutter/resources/modules/Shutter/Draw/Utils.pm @@ -23,11 +23,13 @@ package Shutter::Draw::Utils; use 5.010; +use utf8; use strict; use warnings; use Gtk3; use GooCanvas2; +use Glib qw/ TRUE FALSE /; sub points_to_canvas_points { my @points = @_; @@ -42,4 +44,65 @@ sub points_to_canvas_points { return $result; } +sub check_valid_mime_type { + my $mime_type = shift; + + for my $format ( Gtk3::Gdk::Pixbuf::get_formats() ) { + for my $mime ( @{ $format->get_mime_types } ) { + return TRUE if $mime_type eq $mime_type; + last; + } + } + + return FALSE; +} + +sub utf8_decode { + my $string = shift; + + #see https://bugs.launchpad.net/shutter/+bug/347821 + utf8::decode $string; + + return $string; +} + +sub modify_text_in_properties { + my $font_btn = shift; + my $textview = shift; + my $font_color = shift; + my $item = shift; + my $use_font = shift; + my $use_font_color = shift; + + my $font_descr = Pango::FontDescription->from_string( $font_btn->get_font_name ); + my $texttag = Gtk3::TextTag->new; + + if ( $use_font->get_active && $use_font_color->get_active ) { + $texttag->set( 'font-desc' => $font_descr, 'foreground-rgba' => $font_color->get_rgba ); + } elsif ( $use_font->get_active ) { + $texttag->set( 'font-desc' => $font_descr ); + } elsif ( $use_font_color->get_active ) { + $texttag->set( 'foreground-rgba' => $font_color->get_rgba ); + } + + my $texttagtable = Gtk3::TextTagTable->new; + $texttagtable->add($texttag); + + my $text = Gtk3::TextBuffer->new($texttagtable); + $text->signal_connect( + 'changed' => sub { + $text->apply_tag( $texttag, $text->get_start_iter, $text->get_end_iter ); + } ); + + $text->set_text( + $textview->get_buffer->get_text( + $textview->get_buffer->get_start_iter, + $textview->get_buffer->get_end_iter, FALSE + ) ); + $text->apply_tag( $texttag, $text->get_start_iter, $text->get_end_iter ); + $textview->set_buffer($text); + + return TRUE; +} + 1; From ee6a8c6cdc4b72a45eb1084b47b49d9bb7a0cdaa Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Mon, 27 Dec 2021 21:20:54 +0300 Subject: [PATCH 2/7] * a new bunch of functions moved from Shutter::Draw::DrawingTool to Shutter::Draw::Utils --- .../modules/Shutter/Draw/DrawingTool.pm | 129 ++---------------- .../resources/modules/Shutter/Draw/Utils.pm | 82 ++++++++--- 2 files changed, 72 insertions(+), 139 deletions(-) diff --git a/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm b/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm index b5868ec6..0593349d 100644 --- a/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm +++ b/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm @@ -55,15 +55,13 @@ use File::Glob qw/ bsd_glob /; use File::Temp qw/ tempfile tempdir /; use Data::Dumper; -#Sort::Naturally - sort lexically, but sort numeral parts numerically -use Sort::Naturally; - #load and save settings use XML::Simple; #Glib use Glib qw/TRUE FALSE/; +require Shutter::Utils; require Shutter::Draw::Utils; require Shutter::App::Directories; require Shutter::Draw::UIManager; @@ -4259,30 +4257,22 @@ sub show_item_properties { #apply changes directly $use_font->signal_connect( 'toggled' => sub { - - $self->modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); - + Shutter::Draw::Utils::modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); }); $use_font_color->signal_connect( 'toggled' => sub { - - $self->modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); - + Shutter::Draw::Utils::modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); }); $font_btn->signal_connect( 'font-set' => sub { - - $self->modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); - + Shutter::Draw::Utils::modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); }); $font_color->signal_connect( 'color-set' => sub { - - $self->modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); - + Shutter::Draw::Utils::modify_text_in_properties($font_btn, $textview, $font_color, $item, $use_font, $use_font_color); }); #apply current font settings to button @@ -4694,41 +4684,6 @@ sub apply_properties { } -sub modify_text_in_properties { - my $self = shift; - my $font_btn = shift; - my $textview = shift; - my $font_color = shift; - my $item = shift; - my $use_font = shift; - my $use_font_color = shift; - - my $font_descr = Pango::FontDescription->from_string($font_btn->get_font_name); - my $texttag = Gtk3::TextTag->new; - - if ($use_font->get_active && $use_font_color->get_active) { - $texttag->set('font-desc' => $font_descr, 'foreground-rgba' => $font_color->get_rgba); - } elsif ($use_font->get_active) { - $texttag->set('font-desc' => $font_descr); - } elsif ($use_font_color->get_active) { - $texttag->set('foreground-rgba' => $font_color->get_rgba); - } - - my $texttagtable = Gtk3::TextTagTable->new; - $texttagtable->add($texttag); - my $text = Gtk3::TextBuffer->new($texttagtable); - $text->signal_connect( - 'changed' => sub { - $text->apply_tag($texttag, $text->get_start_iter, $text->get_end_iter); - }); - - $text->set_text($textview->get_buffer->get_text($textview->get_buffer->get_start_iter, $textview->get_buffer->get_end_iter, FALSE)); - $text->apply_tag($texttag, $text->get_start_iter, $text->get_end_iter); - $textview->set_buffer($text); - - return TRUE; -} - sub move_all { my ($self, $x, $y) = @_; @@ -5818,6 +5773,7 @@ sub import_from_dnd { return TRUE; } +# TODO: consider to remove this method sub utf8_decode { my $self = shift; my $string = shift; @@ -5958,7 +5914,9 @@ sub import_from_filesystem { my $session_menu_item = Gtk3::ImageMenuItem->new_with_label($self->{_d}->get("Import from session...")); $session_menu_item->set('always_show_image' => TRUE); $session_menu_item->set_image(Gtk3::Image->new_from_stock('gtk-index', 'menu')); - $session_menu_item->set_submenu($self->import_from_session($button)); + $session_menu_item->set_submenu( + Shutter::Draw::Utils::import_from_session($button, $self->import_hash, $self->filename) + ); #gen thumbnails in an idle callback $self->gen_thumbnail_on_idle('gtk-index', $session_menu_item, $button, TRUE, $session_menu_item->get_submenu->get_children); @@ -6081,7 +6039,7 @@ sub import_from_utheme { 'activate' => sub { $utheme_ctxt->set_image(Gtk3::Image->new_from_file($self->{_icons} . "/throbber_16x16.gif")); - my $context_submenu = $self->import_from_utheme_ctxt($icontheme, $context, $button); + my $context_submenu = Shutter::Draw::Utils::import_from_utheme_ctxt($icontheme, $context, $button); if ($context_submenu->get_children) { @@ -6114,71 +6072,6 @@ sub import_from_utheme { return $menu_ctxt; } -sub import_from_utheme_ctxt { - my $self = shift; - my $icontheme = shift; - my $context = shift; - my $button = shift; - - my $menu_ctxt_items = Gtk3::Menu->new; - - my $size = Gtk3::IconSize->lookup('dialog'); - - foreach my $icon (sort $icontheme->list_icons($context)) { - - #objects from current theme (icons for specific contexts) - my $utheme_ctxt_item = Gtk3::ImageMenuItem->new_with_label($icon); - $utheme_ctxt_item->set('always_show_image' => TRUE); - my $iconinfo = $icontheme->lookup_icon($icon, $size, 'generic-fallback'); - - #save filename and generate thumbnail later - #idle callback - $utheme_ctxt_item->{'name'} = $iconinfo->get_filename; - - $menu_ctxt_items->append($utheme_ctxt_item); - } - - $menu_ctxt_items->show_all; - - return $menu_ctxt_items; -} - -sub import_from_session { - my $self = shift; - my $button = shift; - - my $menu_session_objects = Gtk3::Menu->new; - - my %import_hash = %{$self->{_import_hash}}; - - foreach my $key (Sort::Naturally::nsort(keys %import_hash)) { - - next unless exists $import_hash{$key}->{'short'}; - next unless defined $import_hash{$key}->{'short'}; - - #init item with filename - my $screen_menu_item = Gtk3::ImageMenuItem->new_with_label($import_hash{$key}->{'short'}); - $screen_menu_item->set('always_show_image' => TRUE); - - #set sensitive == FALSE if image eq current file - $screen_menu_item->set_sensitive(FALSE) - if $import_hash{$key}->{'long'} eq $self->{_filename}; - - #save filename and attributes - $screen_menu_item->{'name'} = $import_hash{$key}->{'long'}; - $screen_menu_item->{'mime_type'} = $import_hash{$key}->{'mime_type'}; - $screen_menu_item->{'mtime'} = $import_hash{$key}->{'mtime'}; - $screen_menu_item->{'giofile'} = $import_hash{$key}->{'giofile'}; - $screen_menu_item->{'no_thumbnail'} = $import_hash{$key}->{'no_thumbnail'}; - - $menu_session_objects->append($screen_menu_item); - } - - $menu_session_objects->show_all; - - return $menu_session_objects; -} - sub gen_thumbnail_on_idle { my $self = shift; my $stock = shift; @@ -7223,6 +7116,8 @@ sub uid { shift->{_uid} } sub increase_uid { shift->{_uid}++ } sub uimanager { shift->{_uimanager} } +sub import_hash { shift->{_import_hash} } +sub filename { shift->{_filename} } 1; diff --git a/share/shutter/resources/modules/Shutter/Draw/Utils.pm b/share/shutter/resources/modules/Shutter/Draw/Utils.pm index bce59afe..6befcbcb 100644 --- a/share/shutter/resources/modules/Shutter/Draw/Utils.pm +++ b/share/shutter/resources/modules/Shutter/Draw/Utils.pm @@ -30,6 +30,7 @@ use warnings; use Gtk3; use GooCanvas2; use Glib qw/ TRUE FALSE /; +use Sort::Naturally; sub points_to_canvas_points { my @points = @_; @@ -44,28 +45,6 @@ sub points_to_canvas_points { return $result; } -sub check_valid_mime_type { - my $mime_type = shift; - - for my $format ( Gtk3::Gdk::Pixbuf::get_formats() ) { - for my $mime ( @{ $format->get_mime_types } ) { - return TRUE if $mime_type eq $mime_type; - last; - } - } - - return FALSE; -} - -sub utf8_decode { - my $string = shift; - - #see https://bugs.launchpad.net/shutter/+bug/347821 - utf8::decode $string; - - return $string; -} - sub modify_text_in_properties { my $font_btn = shift; my $textview = shift; @@ -105,4 +84,63 @@ sub modify_text_in_properties { return TRUE; } +sub import_from_utheme_ctxt { + my ( $icontheme, $context, $button ) = @_; + + my $menu_ctxt_items = Gtk3::Menu->new; + my $size = Gtk3::IconSize->lookup('dialog'); + + for my $icon ( sort $icontheme->list_icons($context) ) { + + #objects from current theme (icons for specific contexts) + my $utheme_ctxt_item = Gtk3::ImageMenuItem->new_with_label($icon); + $utheme_ctxt_item->set( 'always_show_image' => TRUE ); + my $iconinfo = $icontheme->lookup_icon( $icon, $size, 'generic-fallback' ); + + #save filename and generate thumbnail later + #idle callback + $utheme_ctxt_item->{'name'} = $iconinfo->get_filename; + + $menu_ctxt_items->append($utheme_ctxt_item); + } + + $menu_ctxt_items->show_all; + + return $menu_ctxt_items; +} + +sub import_from_session { + my ( $button, $import_hash, $filename ) = @_; + + my $menu_session_objects = Gtk3::Menu->new; + + for my $key ( Sort::Naturally::nsort( keys %{$import_hash} ) ) { + + next unless exists $import_hash->{$key}->{'short'}; + next unless defined $import_hash->{$key}->{'short'}; + + #init item with filename + my $screen_menu_item = Gtk3::ImageMenuItem->new_with_label( $import_hash->{$key}->{'short'} ); + $screen_menu_item->set( 'always_show_image' => TRUE ); + + #set sensitive == FALSE if image eq current file + if ( $import_hash->{$key}->{'long'} eq $filename ) { + $screen_menu_item->set_sensitive(FALSE); + } + + #save filename and attributes + $screen_menu_item->{'name'} = $import_hash->{$key}->{'long'}; + $screen_menu_item->{'mime_type'} = $import_hash->{$key}->{'mime_type'}; + $screen_menu_item->{'mtime'} = $import_hash->{$key}->{'mtime'}; + $screen_menu_item->{'giofile'} = $import_hash->{$key}->{'giofile'}; + $screen_menu_item->{'no_thumbnail'} = $import_hash->{$key}->{'no_thumbnail'}; + + $menu_session_objects->append($screen_menu_item); + } + + $menu_session_objects->show_all; + + return $menu_session_objects; +} + 1; From 6815106f322163a9f1f51d2e2b47a2e87f3fa3dc Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Mon, 27 Dec 2021 21:22:47 +0300 Subject: [PATCH 3/7] * removed unused utf8 --- share/shutter/resources/modules/Shutter/Draw/Utils.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/share/shutter/resources/modules/Shutter/Draw/Utils.pm b/share/shutter/resources/modules/Shutter/Draw/Utils.pm index 6befcbcb..d5e141f2 100644 --- a/share/shutter/resources/modules/Shutter/Draw/Utils.pm +++ b/share/shutter/resources/modules/Shutter/Draw/Utils.pm @@ -23,7 +23,6 @@ package Shutter::Draw::Utils; use 5.010; -use utf8; use strict; use warnings; From 81785522bbfdbc0a6dec858ee6c222777958e1c6 Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Mon, 27 Dec 2021 21:34:08 +0300 Subject: [PATCH 4/7] * fixed missing module --- share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm | 1 - 1 file changed, 1 deletion(-) diff --git a/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm b/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm index 0593349d..234c552a 100644 --- a/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm +++ b/share/shutter/resources/modules/Shutter/Draw/DrawingTool.pm @@ -61,7 +61,6 @@ use XML::Simple; #Glib use Glib qw/TRUE FALSE/; -require Shutter::Utils; require Shutter::Draw::Utils; require Shutter::App::Directories; require Shutter::Draw::UIManager; From 4a35e0bdc58ebd6bd2ef3c2049693cd216e7dd27 Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Mon, 27 Dec 2021 21:34:23 +0300 Subject: [PATCH 5/7] * added readme for tests --- t/README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 t/README.md diff --git a/t/README.md b/t/README.md new file mode 100644 index 00000000..dc47ace4 --- /dev/null +++ b/t/README.md @@ -0,0 +1,17 @@ +# RUNNING TESTS + +## INSTALL DEPENDECIES + +```bash +# install cpanm +cpan App::cpanminus + +# install dependecies from cpanfile +cpanm -v --installdeps . +``` + +## RUN TESTS + +```bash +TEST_APP_SHUTTER_PATH=$(pwd) prove -I share/shutter/resources/modules/ -I t/lib t -r +``` From 46c3a23c94be28f1967c36315bef45b60aeb4e14 Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Mon, 27 Dec 2021 21:35:39 +0300 Subject: [PATCH 6/7] * fixed typo --- t/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/t/README.md b/t/README.md index dc47ace4..99639cee 100644 --- a/t/README.md +++ b/t/README.md @@ -1,12 +1,12 @@ # RUNNING TESTS -## INSTALL DEPENDECIES +## INSTALL DEPENDENCIES ```bash # install cpanm cpan App::cpanminus -# install dependecies from cpanfile +# install dependencies from cpanfile cpanm -v --installdeps . ``` From 9ec04a4dd8583a81cfe4ba58e4cf64219bc63b01 Mon Sep 17 00:00:00 2001 From: Alexander Ruzhnikov Date: Wed, 15 Jun 2022 22:48:13 +0300 Subject: [PATCH 7/7] * working on more tests for Shutter::Draw::Utils --- t/Shutter/Draw/005_utils.t | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/t/Shutter/Draw/005_utils.t b/t/Shutter/Draw/005_utils.t index aa2ee4ef..afecb5df 100644 --- a/t/Shutter/Draw/005_utils.t +++ b/t/Shutter/Draw/005_utils.t @@ -12,10 +12,28 @@ subtest "points_to_canvas_points" => sub { can_ok( "Shutter::Draw::Utils", "points_to_canvas_points" ); my @points = qw/116.295135498047 146.150695800781 463.101501464844 458.543548583984/; - my $res = Shutter::Draw::Utils::points_to_canvas_points(@points); + my $res = Shutter::Draw::Utils::points_to_canvas_points(@points); ok( defined $res, "There's a result of points_to_canvas_points" ); isa_ok( $res, "GooCanvas2::CanvasPoints" ); }; +subtest "modify_text_in_properties" => sub { + can_ok( "Shutter::Draw::Utils", "modify_text_in_properties" ); + + # .. +}; + +subtest "import_from_utheme_ctxt" => sub { + can_ok( "Shutter::Draw::Utils", "import_from_utheme_ctxt" ); + + # .. +}; + +subtest "import_from_session" => sub { + can_ok( "Shutter::Draw::Utils", "import_from_session" ); + + # .. +}; + done_testing;