Class: PhotoCanvas

Inherits:
TkScrolledCanvas show all
Defined in:
sample/figmemo_sample.rb

Constant Summary collapse

USAGE =
<<EOT
--- WHAT IS ---
You can write comments on the loaded image, and save it as a Postscipt
file (original image file is not modified). Each comment is drawn as a
set of an indicator circle, an arrow, and a memo text. See the following
how to write comments.
This can save the list of memo texts to another file. It may useful to
search the saved Postscript file by the comments on them.
This may not support multibyte characters (multibyte texts are broken on
a Postscript file). It depends on features of canvas widgets of Tcl/Tk
libraries linked your Ruby/Tk. If you use Tcl/Tk8.0-jp (Japanized Tcl/Tk),
you can (possibly) get a Japanese Postscript file.

--- BINDINGS ---
* Button-1 : draw comments by following steps
    1st - Set center of a indicator circle.
    2nd - Set head position of an arrow.
    3rd - Set tail position of an arrow, and show an entry box.
          Input a memo text and hit 'Enter' key to entry the comment.

* Button-2-drag : scroll the canvas

* Button-3 : when drawing, cancel current drawing

* Double-Button-3 : delete the clicked comment (text, arrow, and circle)
EOT

Constants included from Tk

Tk::AUTO_PATH, Tk::Fontchooser, Tk::INTERP, Tk::JAPANIZED_TK, Tk::LIBRARY_PATH, Tk::MAINLOOP, Tk::PACKAGE_PATH, Tk::RELEASE_DATE, Tk::TCL_LIBRARY_PATH, Tk::TCL_MAJOR_VERSION, Tk::TCL_MINOR_VERSION, Tk::TCL_PACKAGE_PATH, Tk::TCL_PATCHLEVEL, Tk::TCL_PRECISION, Tk::TCL_VERSION, Tk::TK_MAJOR_VERSION, Tk::TK_MINOR_VERSION, Tk::TK_PATCHLEVEL, Tk::TK_VERSION, Tk::Tkextlib_RELEASE_DATE, Tk::TreeCtrl_Widget, Tk::X_Scrollable, Tk::Y_Scrollable

Constants included from Tk::Encoding

Tk::Encoding::BINARY, Tk::Encoding::BINARY_NAME, Tk::Encoding::DEFAULT_EXTERNAL_NAME, Tk::Encoding::DEFAULT_INTERNAL_NAME, Tk::Encoding::ENCODING_TABLE, Tk::Encoding::RubyEncoding, Tk::Encoding::TkCommandNames, Tk::Encoding::UNKNOWN, Tk::Encoding::UTF8_NAME

Constants included from TkCore

TkCore::EventFlag, TkCore::INTERP, TkCore::INTERP_MUTEX, TkCore::INTERP_ROOT_CHECK, TkCore::INTERP_THREAD, TkCore::INTERP_THREAD_STATUS, TkCore::RUN_EVENTLOOP_ON_MAIN_THREAD, TkCore::WIDGET_DESTROY_HOOK, TkCore::WITH_ENCODING, TkCore::WITH_RUBY_VM

Constants included from TkComm

TkComm::GET_CONFIGINFO_AS_ARRAY, TkComm::GET_CONFIGINFOwoRES_AS_ARRAY, TkComm::TkExtlibAutoloadModule, TkComm::Tk_CMDTBL, TkComm::Tk_IDs, TkComm::Tk_WINDOWS, TkComm::USE_TCLs_LIST_FUNCTIONS, TkComm::WidgetClassNames

Constants included from TkUtil

TkUtil::None, TkUtil::RELEASE_DATE

Instance Method Summary collapse

Methods inherited from TkScrolledCanvas

#initialize_composite

Methods included from TkComposite

#cget, #cget_strict, #cget_tkstring, #configinfo, #configure, #database_class, #database_classname, #delegate, #delegate_alias, #epath, #inspect, #option_methods

Methods included from Tk

BinaryString, EncodedString, #Grid, #Pack, #Place, UTF8_String, __create_widget_set__, __disable_toplevel_control__, __import_toplevel_aliases__, __regist_toplevel_aliases__, __remove_toplevel_aliases__, __reset_toplevel_owner__, __set_loaded_toplevel_aliases__, __set_toplevel_aliases__, __toplevel_alias_setup_proc__, _replace_toplevel_aliases, add_kinsoku, backup_current_topdef, bell, bell_on_display, const_missing, current_grabs, cursor_display, default_widget_set, default_widget_set=, define_topalias, define_topobj, delete_kinsoku, destroy, #encoding, #encoding=, errorCode, errorInfo, exit, focus, focus_lastfor, focus_next, focus_prev, focus_to, fromUTF8, grid, grid_forget, has_mainwindow?, load_tcllibrary, load_tclscript, load_tclscript_rsrc, load_tclscript_rsrcid, lower_window, pack, pack_forget, pkgconfig_get, pkgconfig_list, place, place_forget, raise_window, regist_sym_for_loaded_file, replace_topalias, replace_topobj, #root, set_topalias, show_kinsoku, sleep, strictMotif, subst_tk_backslash, subst_utf_backslash, tcl_pkgconfig_get, tcl_pkgconfig_list, thread_update, thread_update_idletasks, tk_pkgconfig_get, tk_pkgconfig_list, toUTF8, to_backslash_sequence, topalias_defined?, toplevel_aliases_on_widget_set, topobj_defined?, ungrid, unload_tcllibrary, unpack, unplace, #update, update, update_idletasks, utf_to_backslash, utf_to_backslash_sequence, wakeup, widget_set_symbols

Methods included from Tk::Encoding

#default_encoding=, #encoding=, #encoding_convertfrom, #encoding_convertto, #encoding_dirs, #encoding_dirs=, #encoding_name, #encoding_names, #encoding_obj, #encoding_objs, #encoding_system=, #encoding_system_name, #encoding_system_obj, #force_default_encoding, #force_default_encoding=, #force_default_encoding?, #tk_encoding_names

Methods included from TkCore

#_tk_call_to_list_core, #after, #after_cancel, #after_idle, #appname, #appsend, #appsend_deny, #appsend_displayof, callback, #callback_break, #callback_continue, #callback_return, #chooseColor, #chooseDirectory, #do_one_event, #event_generate, #getMultipleOpenFile, #getMultipleSaveFile, #getOpenFile, #getSaveFile, #get_eventloop_tick, #get_eventloop_weight, #get_no_event_wait, #inactive, #inactive_displayof, #info, #ip_eval, #ip_eval_with_enc, #ip_eval_without_enc, #ip_invoke, #ip_invoke_with_enc, #ip_invoke_without_enc, #is_mainloop?, #load_cmd_on_ip, #mainloop, #mainloop_exist?, #mainloop_thread?, #mainloop_watchdog, #messageBox, #rb_appsend, #rb_appsend_displayof, #reset_inactive, #reset_inactive_displayof, #restart, #scaling, #scaling_displayof, #set_eventloop_tick, #set_eventloop_weight, #set_no_event_wait, #tk_call, #tk_call_to_list, #tk_call_to_list_with_enc, #tk_call_to_list_without_enc, #tk_call_to_simplelist, #tk_call_to_simplelist_with_enc, #tk_call_to_simplelist_without_enc, #tk_call_with_enc, #tk_call_without_enc, #windowingsystem

Methods included from TkComm

_at, _callback_entry?, _callback_entry_class?, _curr_cmd_id, _fromUTF8, _genobj_for_tkwidget, _next_cmd_id, _toUTF8, array2tk_list, #bind, #bind_all, #bind_append, #bind_append_all, #bind_remove, #bind_remove_all, #bindinfo, #bindinfo_all, bool, image_obj, #install_cmd, install_cmd, list, num_or_nil, num_or_str, number, procedure, simplelist, slice_ary, string, #subst, tk_tcl2ruby, uninstall_cmd, #uninstall_cmd, window

Methods included from TkEvent

#install_bind, #install_bind_for_event_class

Methods included from TkUtil

_conv_args, #_conv_args, #_fromUTF8, #_get_eval_enc_str, _get_eval_enc_str, #_get_eval_string, _get_eval_string, #_symbolkey2str, _symbolkey2str, #_toUTF8, #bool, bool, callback, eval_cmd, hash_kv, #hash_kv, install_cmd, num_or_nil, #num_or_nil, #num_or_str, num_or_str, #number, number, string, #string, uninstall_cmd, untrust

Constructor Details

#initialize(*args) ⇒ PhotoCanvas

Returns a new instance of PhotoCanvas.


83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'sample/figmemo_sample.rb', line 83

def initialize(*args)
  super(*args)

  self.highlightthickness = 0
  self.selectborderwidth = 0

  @photo = TkPhotoImage.new
  @img = TkcImage.new(self, 0, 0, :image=>@photo)

  width  = self.width
  height = self.height
  @scr_region = [-width, -height, width, height]
  self.scrollregion(@scr_region)
  self.xview_moveto(0.25)
  self.yview_moveto(0.25)

  @col = 'red'
  @font = 'Helvetica -12'

  @memo_id_num = -1
  @memo_id_head = 'memo_'
  @memo_id_tag = nil
  @overlap_d = 2

  @state = TkVariable.new
  @border = 2
  @selectborder = 1
  @delta = @border + @selectborder
  @entry = TkEntry.new(self, :relief=>:ridge, :borderwidth=>@border,
                       :selectborderwidth=>@selectborder,
                       :highlightthickness=>0)
  @entry.bind('Return'){@state.value = 0}

  @mode = old_mode = 0

  _state0()

  bind('2', :x, :y){|x,y| scan_mark(x,y)}
  bind('B2-Motion', :x, :y){|x,y| scan_dragto(x,y)}

  bind('3'){
    next if (old_mode = @mode) == 0
    @items.each{|item| item.delete }
    _state0()
  }

  bind('Double-3', :widget, :x, :y){|w, x, y|
    next if old_mode != 0
    x = w.canvasx(x)
    y = w.canvasy(y)
    tag = nil
    w.find_overlapping(x - @overlap_d, y - @overlap_d,
                       x + @overlap_d, y + @overlap_d).find{|item|
      ! (item.tags.find{|name|
           if name =~ /^(#{@memo_id_head}\d+)$/
             tag = $1
           end
         }.empty?)
    }
    w.delete(tag) if tag
  }
end

Instance Method Details

#fig_eraseObject


264
265
266
# File 'sample/figmemo_sample.rb', line 264

def fig_erase
  (find_withtag('all') - [@img]).each{|item| item.delete}
end

#get_textsObject


287
288
289
290
291
292
293
294
295
# File 'sample/figmemo_sample.rb', line 287

def get_texts
  ret = []
  find_withtag('all').each{|item|
    if item.kind_of?(TkcText)
      ret << item[:text]
    end
  }
  ret
end

#load_photo(filename) ⇒ Object


256
257
258
# File 'sample/figmemo_sample.rb', line 256

def load_photo(filename)
  @photo.configure(:file=>filename)
end

#modified?Boolean

Returns:

  • (Boolean)

260
261
262
# File 'sample/figmemo_sample.rb', line 260

def modified?
  ! ((find_withtag('all') - [@img]).empty?)
end

#reset_regionObject


268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
# File 'sample/figmemo_sample.rb', line 268

def reset_region
  width = @photo.width
  height = @photo.height

  if width > @scr_region[2]
    @scr_region[0] = -width
    @scr_region[2] = width
  end

  if height > @scr_region[3]
    @scr_region[1] = -height
    @scr_region[3] = height
  end

  self.scrollregion(@scr_region)
  self.xview_moveto(0.25)
  self.yview_moveto(0.25)
end