From: Jari Matilainen Date: Wed, 3 Jan 2018 14:14:11 +0000 (+0100) Subject: script to toggle hidden levels in windows X-Git-Url: http://git.99rst.org/?a=commitdiff_plain;h=be7fffaa4664a7b11d195cc66cc5bddd4af7318f;p=irssi-scripts.irssi.org.git script to toggle hidden levels in windows changed command names, simplified code change toggle command to /window togglelevel, added help complete refactoring, make toggling and default values work smoother Enable toggling custom hidelevel settings on per window basis bug when toggling levels forgot to remove debug printout sometimes hidden_level would become NONE, should be fixed now removed debug function Use ->set_hidden_level to show/hide levels Revert "Use ->set_hidden_level to show/hide levels" Wait for v1.2.0 to add set_hidden_level to script This reverts commit be740017cda212674e16e20615bf6b2079cb935d. --- diff --git a/scripts/toggle_winlevels.pl b/scripts/toggle_winlevels.pl new file mode 100644 index 0000000..5d6544f --- /dev/null +++ b/scripts/toggle_winlevels.pl @@ -0,0 +1,117 @@ +# Settings: +# window_hidden_levels - levels to hide/show with below commands +# Included commands: +# /window togglelevel - hide/show levels in active window +# /show_levels_all - show levels in all windows +# /hide_levels_all - hide levels in all windows + +use strict; +use warnings; +use Irssi v1.1; +use Irssi::TextUI; +use Data::Dumper; +use vars qw($VERSION %IRSSI); + +$VERSION = "0.3"; +%IRSSI = ( + authors => 'Jari Matilainen', + contact => 'vague!#irssi@freenode on irc', + name => 'toggle_winlevels', + description => 'Toggle hidden levels on per window basis', + licence => "GPLv2", + changed => "17.01.2018 01:00pm CET" +); + +my $windows; +my $processing = 0; + +sub set_mode_all { + my ($mode) = @_; + for my $win (Irssi::windows) { + set_mode($win, $mode); + } +} + +sub set_mode { + my ($win, $mode) = @_; + my $lvlbits = ($win->view->{hidden_level} - Irssi::level2bits('HIDDEN')) || $windows->{$win->{refnum}}{levels} - Irssi::level2bits('HIDDEN'); + my $levels = Irssi::bits2level($lvlbits); + my $val; + + unless($levels && length $levels) { + $val = '-ALL +HIDDEN'; + $windows->{$win->{refnum}}{mode} = 0; + } + else { + $mode = ($windows->{$win->{refnum}}{mode} // 0) ^ 1 unless defined $mode; + $val = $levels =~ s/(\w+)/sprintf("%s%s", $mode ? '+' : '-', $1)/gre; + $windows->{$win->{refnum}}{mode} = $mode; + } + + if($val) { + $processing += 1; + $win->command("^window hidelevel $val"); + } +} + +Irssi::signal_add('message join' => sub { + my ($server, $target, $nick) = @_; + return unless $server->{nick} eq $nick; + + my $win = $server->window_find_item($target); + my $levels = $win->view->{hidden_level}; + $windows->{$win->{refnum}}{levels} = $levels - Irssi::level2bits('HIDDEN') ? $levels : Irssi::settings_get_level('window_default_hidden_level'); + $windows->{$win->{refnum}}{mode} = $levels - Irssi::level2bits('HIDDEN') ? 1 : 0; + set_mode($win, 1) unless $levels - Irssi::level2bits('HIDDEN'); +}); + +Irssi::signal_add('window destroyed' => sub { + my ($win) = @_; + delete $windows->{$win->{refnum}}; +}); + +Irssi::signal_add('window refnum changed' => sub { + my ($win, $old_refnum) = @_; + $windows->{$win->{refnum}} = $windows->{$old_refnum}; + delete $windows->{$old_refnum}; +}); + +Irssi::command_bind('hide_levels_all' => sub { + set_mode_all(1); +}); + +Irssi::command_bind('show_levels_all' => sub { + set_mode_all(0); +}); + +Irssi::command_bind('window togglelevel' => sub { + my ($args, $server, $witem) = @_; + return unless $witem; + set_mode($witem->window, undef); +}); + +Irssi::command_bind_last('window hidelevel' => sub { + my ($args, $server, $witem) = @_; + + if($processing) { + $processing -= 1; + return; + } + + return unless $witem; + + if($args) { + my $levels = $witem->window->view->{hidden_level}; + $windows->{$witem->window->{refnum}}{levels} = $levels; + $windows->{$witem->window->{refnum}}{mode} = $levels - Irssi::level2bits('HIDDEN') ? 1 : 0; + } +}); + +Irssi::settings_add_level('lookandfeel', 'window_default_hidden_level', 'HIDDEN'); + +for my $win (Irssi::windows) { + my $view = $win->view(); + my $levels = $win->view->{hidden_level}; + $windows->{$win->{refnum}}{levels} = $levels - Irssi::level2bits('HIDDEN') ? $levels : Irssi::settings_get_level('window_default_hidden_level'); + $windows->{$win->{refnum}}{mode} = $levels - Irssi::level2bits('HIDDEN') ? 1 : 0; +}