Skip to content

Commit

Permalink
Enable to change the background color of dialogs. (#413)
Browse files Browse the repository at this point in the history
  • Loading branch information
pocari committed Jun 27, 2022
1 parent eb17de0 commit bd49537
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 25 deletions.
53 changes: 43 additions & 10 deletions lib/reline.rb
Expand Up @@ -33,7 +33,18 @@ def match?(other)
alias_method :==, :match?
end
CursorPos = Struct.new(:x, :y)
DialogRenderInfo = Struct.new(:pos, :contents, :bg_color, :width, :height, :scrollbar, keyword_init: true)
DialogRenderInfo = Struct.new(
:pos,
:contents,
:bg_color,
:pointer_bg_color,
:fg_color,
:pointer_fg_color,
:width,
:height,
:scrollbar,
keyword_init: true
)

class Core
ATTR_READER_NAMES = %i(
Expand All @@ -58,6 +69,19 @@ class Core
attr_accessor :last_incremental_search
attr_reader :output

extend Forwardable
def_delegators :config,
:autocompletion,
:autocompletion=,
:dialog_default_bg_color,
:dialog_default_bg_color=,
:dialog_default_fg_color,
:dialog_default_fg_color=,
:dialog_pointer_bg_color,
:dialog_pointer_bg_color=,
:dialog_pointer_fg_color,
:dialog_pointer_fg_color=

def initialize
self.output = STDOUT
@dialog_proc_list = {}
Expand Down Expand Up @@ -123,14 +147,6 @@ def completion_proc=(p)
@completion_proc = p
end

def autocompletion
@config.autocompletion
end

def autocompletion=(val)
@config.autocompletion = val
end

def output_modifier_proc=(p)
raise ArgumentError unless p.respond_to?(:call) or p.nil?
@output_modifier_proc = p
Expand Down Expand Up @@ -243,7 +259,16 @@ def get_screen_size
context.push(cursor_pos_to_render, result, pointer, dialog)
end
dialog.pointer = pointer
DialogRenderInfo.new(pos: cursor_pos_to_render, contents: result, scrollbar: true, height: 15)
DialogRenderInfo.new(
pos: cursor_pos_to_render,
contents: result,
scrollbar: true,
height: 15,
bg_color: config.dialog_default_bg_color,
pointer_bg_color: config.dialog_pointer_bg_color,
fg_color: config.dialog_default_fg_color,
pointer_fg_color: config.dialog_pointer_fg_color
)
}
Reline::DEFAULT_DIALOG_CONTEXT = Array.new

Expand Down Expand Up @@ -528,6 +553,10 @@ def self.insert_text(*args, &block)
def_single_delegators :core, :add_dialog_proc
def_single_delegators :core, :dialog_proc
def_single_delegators :core, :autocompletion, :autocompletion=
def_single_delegators :core, :dialog_default_bg_color, :dialog_default_bg_color=
def_single_delegators :core, :dialog_pointer_bg_color, :dialog_pointer_bg_color=
def_single_delegators :core, :dialog_default_fg_color, :dialog_default_fg_color=
def_single_delegators :core, :dialog_pointer_fg_color, :dialog_pointer_fg_color=

def_single_delegators :core, :readmultiline
def_instance_delegators self, :readmultiline
Expand All @@ -550,6 +579,10 @@ def self.core
core.filename_quote_characters = ""
core.special_prefixes = ""
core.add_dialog_proc(:autocomplete, Reline::DEFAULT_DIALOG_PROC_AUTOCOMPLETE, Reline::DEFAULT_DIALOG_CONTEXT)
core.dialog_default_bg_color = 46 # Cyan
core.dialog_default_fg_color = 37 # White
core.dialog_pointer_bg_color = 45 # Magenta
core.dialog_pointer_fg_color = 37 # White
}
end

Expand Down
28 changes: 20 additions & 8 deletions lib/reline/config.rb
Expand Up @@ -45,6 +45,14 @@ class InvalidInputrc < RuntimeError
attr_accessor v
end

attr_accessor(
:autocompletion,
:dialog_default_bg_color,
:dialog_default_fg_color,
:dialog_pointer_bg_color,
:dialog_pointer_fg_color,
)

def initialize
@additional_key_bindings = {} # from inputrc
@additional_key_bindings[:emacs] = {}
Expand All @@ -69,6 +77,10 @@ def initialize
@test_mode = false
@autocompletion = false
@convert_meta = true if seven_bit_encoding?(Reline::IOGate.encoding)
@dialog_default_bg_color = nil
@dialog_pointer_bg_color = nil
@dialog_default_fg_color = nil
@dialog_pointer_fg_color = nil
end

def reset
Expand All @@ -94,14 +106,6 @@ def editing_mode_is?(*val)
(val.respond_to?(:any?) ? val : [val]).any?(@editing_mode_label)
end

def autocompletion=(val)
@autocompletion = val
end

def autocompletion
@autocompletion
end

def keymap
@key_actors[@keymap_label]
end
Expand Down Expand Up @@ -334,6 +338,14 @@ def bind_variable(name, value)
@vi_ins_mode_string = retrieve_string(value)
when 'emacs-mode-string'
@emacs_mode_string = retrieve_string(value)
when 'dialog-default-bg-color'
@dialog_default_bg_color = value.to_i
when 'dialog-pointer-bg-color'
@dialog_pointer_bg_color = value.to_i
when 'dialog-default-fg-color'
@dialog_default_fg_color = value.to_i
when 'dialog-pointer-fg-color'
@dialog_pointer_fg_color = value.to_i
when *VARIABLE_NAMES then
variable_name = :"@#{name.tr(?-, ?_)}"
instance_variable_set(variable_name, value.nil? || value == '1' || value == 'on')
Expand Down
12 changes: 5 additions & 7 deletions lib/reline/line_editor.rb
Expand Up @@ -743,17 +743,15 @@ def add_dialog_proc(name, p, context = nil)
Reline::IOGate.move_cursor_column(dialog.column)
dialog.contents.each_with_index do |item, i|
if i == pointer
bg_color = '45'
fg_color = dialog_render_info.pointer_fg_color
bg_color = dialog_render_info.pointer_bg_color
else
if dialog_render_info.bg_color
bg_color = dialog_render_info.bg_color
else
bg_color = '46'
end
fg_color = dialog_render_info.fg_color
bg_color = dialog_render_info.bg_color
end
str_width = dialog.width - (dialog.scrollbar_pos.nil? ? 0 : @block_elem_width)
str = padding_space_with_escape_sequences(Reline::Unicode.take_range(item, 0, str_width), str_width)
@output.write "\e[#{bg_color}m#{str}"
@output.write "\e[#{bg_color}m\e[#{fg_color}m#{str}"
if dialog.scrollbar_pos and (dialog.scrollbar_pos != old_dialog.scrollbar_pos or dialog.column != old_dialog.column)
@output.write "\e[37m"
if dialog.scrollbar_pos <= (i * 2) and (i * 2 + 1) < (dialog.scrollbar_pos + bar_height)
Expand Down
15 changes: 15 additions & 0 deletions test/reline/test_config.rb
Expand Up @@ -408,4 +408,19 @@ def test_relative_xdg_config_home
ENV['XDG_CONFIG_HOME'] = xdg_config_home_backup
ENV['HOME'] = home_backup
end

def test_dialog_configurations
@config.read_lines(<<~LINES.lines)
set dialog-default-bg-color 1
set dialog-pointer-bg-color 2
set dialog-default-fg-color 3
set dialog-pointer-fg-color 4
LINES

assert_equal 1, @config.dialog_default_bg_color
assert_equal 2, @config.dialog_pointer_bg_color
assert_equal 3, @config.dialog_default_fg_color
assert_equal 4, @config.dialog_pointer_fg_color
end
end

0 comments on commit bd49537

Please sign in to comment.