Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Enable to change the background color of dialogs. #413

53 changes: 43 additions & 10 deletions lib/reline.rb
Original file line number Diff line number Diff line change
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
Original file line number Diff line number Diff line change
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
Comment on lines +341 to +348
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a test for this in test_config.rb?

Copy link
Contributor Author

@pocari pocari Jun 25, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@peterzhu2118 I have added it. (d0559f8)

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
Original file line number Diff line number Diff line change
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}"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This can be "\e[#{bg_color};#{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"
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Maybe scrollbar color too?

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
Original file line number Diff line number Diff line change
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