lib/glimmer/tk/text_proxy.rb in glimmer-dsl-tk-0.0.25 vs lib/glimmer/tk/text_proxy.rb in glimmer-dsl-tk-0.0.26

- old
+ new

@@ -43,23 +43,139 @@ end end def text=(value) if value != @text + if @text && value.start_with?(@text) + insert('end', value[@text.size..-1]) + else + delete('1.0', 'end') + insert('end', value) + end @text = value - delete('1.0', 'end') - insert('end', value) end end - def text(value = nil) - if value.nil? - @text = get("1.0", 'end') - else - self.text = value + def text + @text = get("1.0", 'end') + end + + def add_selection_format(option, value) + process_selection_ranges { |range_start, range_end| add_format(range_start, range_end, option, value) } + end + + def remove_selection_format(option, value) + process_selection_ranges { |range_start, range_end| remove_format(range_start, range_end, option, value) } + end + + def toggle_selection_format(option, value) + process_selection_ranges { |range_start, range_end| toggle_format(range_start, range_end, option, value) } + end + + def add_selection_font_format(option, value) + process_selection_ranges { |range_start, range_end| add_font_format(range_start, range_end, option, value) } + end + + def remove_selection_font_format(option, value) + process_selection_ranges { |range_start, range_end| remove_font_format(range_start, range_end, option, value) } + end + + def toggle_selection_font_format(option, value) + process_selection_ranges { |range_start, range_end| toggle_font_format(range_start, range_end, option, value) } + end + + def process_selection_ranges(&processor) + @tk.tag_ranges('sel').each do |region| + range_start = region.first + range_end = region.last + processor.call(range_start, range_end) end end + def applied_format?(region_start, region_end, option, value) + !applied_format_tags(region_start, region_end, option, value).empty? + end + + def applied_format_tags(region_start, region_end, option, value) + tag_names = @tk.tag_names - ['sel'] + + tag_names.select do |tag_name| + @tk.tag_ranges(tag_name).any? do |range| + if range.first.to_f <= region_start.to_f && range.last.to_f >= region_end.to_f + @tk.tag_cget(tag_name, option) == value + end + end + end + end + + def add_format(region_start, region_end, option, value) + @@tag_number = 0 unless defined?(@@tag_number) + tag = "tag#{@@tag_number += 1}" + @tk.tag_configure(tag, {option => value}) + @tk.tag_add(tag, region_start, region_end) + tag + end + + def remove_format(region_start, region_end, option, value) + partial_intersection_option_applied_tags = tag_names.select do |tag_name| + @tk.tag_ranges(tag_name).any? do |range| + if range.first.to_f.between?(region_start.to_f, region_end.to_f) or + range.last.to_f.between?(region_start.to_f, region_end.to_f) or + (range.first.to_f <= region_start.to_f && range.last.to_f >= region_end.to_f) + @tk.tag_cget(tag_name, option) == value + end + end + end + + partial_intersection_option_applied_tags.each do |tag_name| + @tk.tag_remove(tag_name, region_start, region_end) + end + + nil + end + + # toggles option/value tag (removes if already applied) + def toggle_format(region_start, region_end, option, value) + if applied_format?(region_start, region_end, option, value) + remove_format(region_start, region_end, option, value) + else + add_format(region_start, region_end, option, value) + end + end + +# def applied_font_format?(region_start, region_end, option, value) +# !applied_font_format_tags(region_start, region_end, option, value).empty? +# end +# +# def applied_font_format_tags(region_start, region_end, option, value) +# tag_names = @tk.tag_names - ['sel'] +# +# tag_names.select do |tag_name| +# @tk.tag_ranges(tag_name).any? do |range| +# if range.first.to_f <= region_start.to_f && range.last.to_f >= region_end.to_f +# @tk.tag_cget(tag_name, option) == value +# end +# end +# end +# end +# +# def add_font_format(region_start, region_end, option, value) +# end +# +# def remove_font_format(region_start, region_end, option, value) +# end +# + ### toggles option/value tag (removes if already applied) +# def toggle_font_format(region_start, region_end, option, value) +# if applied_font_format?(region_start, region_end, option, value) + ### ensure removing from previous font combination (perhaps checking widget font too) +# remove_font_format(region_start, region_end, option, value) +# else + ### ensure adding to previous font combination (perhaps checking widget font too) +# add_font_format(region_start, region_end, option, value) +# end +# end + private def initialize_defaults super self.padx = 5