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