Class: Rufio::TabModeManager

Inherits:
Object
  • Object
show all
Defined in:
lib/rufio/tab_mode_manager.rb

Overview

タブモード管理クラス上部メニューの2段目に表示するモードタブを管理する

Constant Summary collapse

MODES =
%i[files logs jobs help].freeze
MODE_LABELS =
{
  files: 'Files',
  logs: 'Logs',
  jobs: 'Jobs',
  help: 'Help'
}.freeze
MODE_KEYS =
{
  files: nil,
  logs: 'L',
  jobs: 'J',
  help: '?'
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeTabModeManager

Returns a new instance of TabModeManager.



25
26
27
28
# File 'lib/rufio/tab_mode_manager.rb', line 25

def initialize
  @current_mode = :files
  @mode_change_callback = nil
end

Instance Attribute Details

#current_modeObject (readonly)

Returns the value of attribute current_mode.



23
24
25
# File 'lib/rufio/tab_mode_manager.rb', line 23

def current_mode
  @current_mode
end

Instance Method Details

#available_modesObject

利用可能なモード一覧



31
32
33
# File 'lib/rufio/tab_mode_manager.rb', line 31

def available_modes
  MODES
end

#current_mode_infoObject

現在のモード情報を取得



69
70
71
72
73
74
75
# File 'lib/rufio/tab_mode_manager.rb', line 69

def current_mode_info
  {
    mode: @current_mode,
    label: MODE_LABELS[@current_mode],
    index: MODES.index(@current_mode)
  }
end

#mode_keysObject

モードのキーバインド一覧



41
42
43
# File 'lib/rufio/tab_mode_manager.rb', line 41

def mode_keys
  MODE_KEYS
end

#mode_labelsObject

モードのラベル一覧



36
37
38
# File 'lib/rufio/tab_mode_manager.rb', line 36

def mode_labels
  MODE_LABELS
end

#next_modeObject

次のモードに切り替え



46
47
48
49
50
# File 'lib/rufio/tab_mode_manager.rb', line 46

def next_mode
  current_index = MODES.index(@current_mode)
  new_index = (current_index + 1) % MODES.length
  switch_to(MODES[new_index])
end

#on_mode_change(&block) ⇒ Object

モード変更時のコールバックを設定



78
79
80
# File 'lib/rufio/tab_mode_manager.rb', line 78

def on_mode_change(&block)
  @mode_change_callback = block
end

#previous_modeObject

前のモードに切り替え



53
54
55
56
57
# File 'lib/rufio/tab_mode_manager.rb', line 53

def previous_mode
  current_index = MODES.index(@current_mode)
  new_index = (current_index - 1) % MODES.length
  switch_to(MODES[new_index])
end

#render_tab_line(width) ⇒ String

タブ行をレンダリング

Parameters:

  • width (Integer)

    画面幅

Returns:

  • (String)

    ANSIエスケープシーケンスを含むタブ行



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/rufio/tab_mode_manager.rb', line 85

def render_tab_line(width)
  tabs = MODES.map do |mode|
    label = MODE_LABELS[mode]
    if mode == @current_mode
      # 現在のモード: シアン背景 + 黒文字 + 太字で目立たせる
      "\e[46m\e[30m\e[1m #{label} \e[0m"
    else
      # 非選択モード: 暗めの色
      "\e[90m #{label} \e[0m"
    end
  end

  tab_content = tabs.join("\e[90m│\e[0m")

  # 幅に合わせてパディング
  # ANSIエスケープシーケンスを除いた実際の表示幅を計算
  display_width = strip_ansi(tab_content).length
  padding = width - display_width

  if padding > 0
    tab_content + ' ' * padding
  else
    tab_content[0...width]
  end
end

#switch_to(mode) ⇒ Object

特定のモードに切り替え



60
61
62
63
64
65
66
# File 'lib/rufio/tab_mode_manager.rb', line 60

def switch_to(mode)
  return unless MODES.include?(mode)
  return if @current_mode == mode

  @current_mode = mode
  @mode_change_callback&.call(mode)
end