diff --git a/dynamic_curses_input.gemspec b/dynamic_curses_input.gemspec index acc3220..6fb3c8f 100644 --- a/dynamic_curses_input.gemspec +++ b/dynamic_curses_input.gemspec @@ -5,8 +5,8 @@ require_relative 'lib/dynamic_curses_input/version' Gem::Specification.new do |spec| spec.name = 'dynamic_curses_input' spec.version = DynamicCursesInput::VERSION - spec.authors = ['VetheonGames'] - spec.email = ['vetheon@pixelatedstudios.net'] + spec.authors = ['PixelRidge-Softworks'] + spec.email = ['connorc@pixelridgesoftworks.com'] spec.summary = 'A simple library for making Curses TUI input more dynamic and user-friendly' spec.description = "Dynamic Curses Input is a highly simple, yet powerful gem that allows simple implementation of @@ -16,17 +16,22 @@ Gem::Specification.new do |spec| that code, by providing simple to use methods that allow developers to capture user input, while allowing the special keys to work as the average user would expect. IE: When you press the left arrow key, the cursor moves to the left and allows you to delete a - character you entered that isn't the last character you entered." - spec.homepage = 'https://github.com/Pixelated-Studios/dynamic_curses_input' + character you entered that isn't the last character you entered. + + KNOWN BUG: X & Y coords for placing windows appear to be broken right now. Will fix with + next update" + spec.homepage = 'https://git.pixelridgesoftworks.com/PixelRidge-Softworks/dynamic_curses_input' spec.license = 'MIT' spec.required_ruby_version = '3.2.2' spec.metadata['homepage_uri'] = spec.homepage - spec.metadata['source_code_uri'] = 'https://github.com/Pixelated-Studios/dynamic_curses_input' - spec.metadata['changelog_uri'] = 'https://github.com/Pixelated-Studios/dynamic_curses_input/blob/main/CHANGELOG.md' + spec.metadata['source_code_uri'] = 'https://git.pixelridgesoftworks.com/PixelRidge-Softworks/dynamic_curses_input' + spec.metadata['changelog_uri'] = 'https://git.pixelridgesoftworks.com/PixelRidge-Softworks/dynamic_curses_input/src/branch/main/CHANGELOG.md' # Specify which files should be added to the gem when it is released. - spec.files = Dir.glob('{bin,lib,sig}/**/*') + Dir.glob('*').reject { |f| f.start_with?('spec', '.rspec', 'dynamic_curses_input.gemspec') } + spec.files = Dir.glob('{bin,lib,sig}/**/*') + Dir.glob('*').reject do |f| + f.start_with?('spec', '.rspec', 'dynamic_curses_input.gemspec') + end spec.files << 'LICENSE.txt' spec.files << 'README.md' spec.files << 'dynamic_curses_input.gemspec' diff --git a/lib/dynamic_curses_input.rb b/lib/dynamic_curses_input.rb index 5257de0..5c81bd3 100644 --- a/lib/dynamic_curses_input.rb +++ b/lib/dynamic_curses_input.rb @@ -15,12 +15,12 @@ module DynamicCursesInput InputHandler.catch_input(echo) end - def self.ask_question(color = 'white', question, x: 'center', input: true, echo: nil) + def self.ask_question(color = 'white', question, x: 'center', input: true, echo: nil) # rubocop:disable Naming/MethodParameterName Curses.clear ColorWindow.add_color_window(color, question, y:, x:, input:, echo:) end - def self.print_color_window(color, text, y_value: nil, x: 'center', input: nil, echo: true) + def self.print_color_window(color, text, y_value: nil, x: 'center', input: nil, echo: true) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength, Metrics/ParameterLists, Naming/MethodParameterName case x when 'center' terminal_size = `stty size`.split.map(&:to_i) @@ -59,7 +59,7 @@ module DynamicCursesInput class << self private - def process_print_color_window_args(args) + def process_print_color_window_args(args) # rubocop:disable Metrics/MethodLength case args.size when 2 ['white', args[0], args[1], 'center', nil, true] diff --git a/lib/dynamic_curses_input/color_window.rb b/lib/dynamic_curses_input/color_window.rb index 1d22975..e38f92b 100644 --- a/lib/dynamic_curses_input/color_window.rb +++ b/lib/dynamic_curses_input/color_window.rb @@ -9,7 +9,7 @@ module DynamicCursesInput # Class for creating a colored window class ColorWindow # Initialize instance variables and setup curses - def initialize(echo, x, y) + def initialize(echo, x, y) # rubocop:disable Metrics/MethodLength, Naming/MethodParameterName @echo = echo # Determines whether input should be echoed to the screen setup_curses_color # Setup curses @x = x @@ -26,7 +26,7 @@ module DynamicCursesInput end # Method that adds colored text to the window - def add_color_window(color, text, x, y, input: nil, echo: true) + def add_color_window(color, text, x, y, input: nil, echo: true) # rubocop:disable Metrics/MethodLength, Metrics/ParameterLists, Naming/MethodParameterName # Map color names to color pair numbers color_map = { 'black' => 1, @@ -70,7 +70,7 @@ module DynamicCursesInput end # Set cursor position manually on the X and Y axis - def set_position(y, x) + def set_position(y, x) # rubocop:disable Naming/MethodParameterName Curses.setpos(y, x) end end diff --git a/lib/dynamic_curses_input/input_handler.rb b/lib/dynamic_curses_input/input_handler.rb index a7eac7d..1c71c05 100644 --- a/lib/dynamic_curses_input/input_handler.rb +++ b/lib/dynamic_curses_input/input_handler.rb @@ -47,6 +47,8 @@ module DynamicCursesInput case chk when Curses::KEY_LEFT then handle_left_key # Move cursor left when Curses::KEY_RIGHT then handle_right_key # Move cursor right + when Curses::KEY_UP then handle_up_key + when Curses::KEY_DOWN then handle_down_key when Curses::KEY_BACKSPACE, 127 then handle_backspace_key # Delete character when 10, 13 then handle_enter_key # Break loop if enter key is pressed else handle_default_key(chk) # Add character to input string @@ -63,6 +65,16 @@ module DynamicCursesInput @cursor_pos = CursorMover.right(@cursor_pos, @input.length) end + # Move cursor down + def handle_down_key + @cursor_pos = CursorMover.down(@cursor_pos, @input.length) + end + + # Move cursor up + def handle_up_key + @cursor_pos = CursorMover.up(@cursor_pos, @input.length) + end + # Delete character def handle_backspace_key @input, @cursor_pos = CharacterDeleter.delete(@input, @cursor_pos) @@ -103,8 +115,18 @@ module DynamicCursesInput cursor_pos == length ? cursor_pos : cursor_pos + 1 end + # Handle down arrow key + def self.down(_, length) + length # Move to the end of the line + end + + # Handle up arrow key + def self.up(_, _length) + 0 # Move to the beginning of the line (position 0) + end + # Set cursor position - def self.set_position(y, x) + def self.set_position(y, x) # rubocop:disable Naming/MethodParameterName Curses.setpos(y, x) end end diff --git a/lib/dynamic_curses_input/version.rb b/lib/dynamic_curses_input/version.rb index 19fd94b..f6da930 100644 --- a/lib/dynamic_curses_input/version.rb +++ b/lib/dynamic_curses_input/version.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true module DynamicCursesInput - VERSION = '1.1.0' + VERSION = '1.2.0' end