diff options
Diffstat (limited to 'lib/utilities/notes.tcl')
-rwxr-xr-x | lib/utilities/notes.tcl | 896 |
1 files changed, 896 insertions, 0 deletions
diff --git a/lib/utilities/notes.tcl b/lib/utilities/notes.tcl new file mode 100755 index 0000000..f39312f --- /dev/null +++ b/lib/utilities/notes.tcl @@ -0,0 +1,896 @@ +#!/usr/bin/tclsh +# Part of MCU 8051 IDE ( http://mcu8051ide.sf.net ) + +############################################################################ +# Copyright (C) 2007-2009 by Martin Ošmera # +# martin.osmera@gmail.com # +# # +# This program is free software; you can redistribute it and#or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation; either version 2 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program; if not, write to the # +# Free Software Foundation, Inc., # +# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # +############################################################################ + +# -------------------------------------------------------------------------- +# DESCRIPTION: +# Scribble notes independent on project +# -------------------------------------------------------------------------- + +class Notes { + ## COMMON + common count 0 ;# Int: Counter of object instances + common bgcolor {#EEEE55} ;# Color: Background color for title bar and window border + common bgcolor2 {#FFFF88} ;# Color: Background color for the canvas widget + # Font: For inserted text + common canvas_text_font [font create \ + -family $::DEFAULT_FIXED_FONT \ + -size -14 \ + -weight bold \ + ] + # List: Popup menu for the canvas widget + common MENU { + {radiobutton "Pencil" {} ::Notes::__mode {P} + "change_mode P" 0} + {radiobutton "Line" {} ::Notes::__mode {L} + "change_mode L" 0} + {radiobutton "Arrow" {} ::Notes::__mode {A} + "change_mode A" 0} + {radiobutton "Rectangle" {} ::Notes::__mode {R} + "change_mode R" 0} + {radiobutton "Oval" {} ::Notes::__mode {O} + "change_mode O" 0} + {radiobutton "Insert text" {} ::Notes::__mode {T} + "change_mode T" 0} + {radiobutton "Move canvas" {} ::Notes::__mode {M} + "change_mode M" 0} + {radiobutton "Eraser" {} ::Notes::__mode {C} + "change_mode C" 0} + {separator} + {command "Zoom in" "" 0 {canvas_zoom_in_from_pmenu} + {viewmag_in}} + {command "Zoom out" "" 0 {canvas_zoom_out_from_pmenu} + {viewmag_out}} + {separator} + {command "Insert image" "" 0 {load_image} + {fileimport}} + {command "Select color" "" 0 {select_color} + {colorize}} + {separator} + {command "Clear all" "" 0 {canvas_clear_all} + {emptytrash}} + } + + ## PRIVATE + private variable filename ;# String: Nothing yet ... + private variable geometry ;# Geometry: Window geometry + private variable win ;# Widget: Dialog window (widget class Frame) + + private variable main_frame ;# Widget: Main window frame + private variable canvas_widget ;# Widget: Canvas widget for writing notes + private variable title_bar ;# Widget: Window title bar + private variable title_label ;# Widget: Label containg text "Scribble notepad" + private variable close_button ;# Widget: Close button + private variable coll_exp_but ;# Widget: Shade button + private variable minim_flag 0 ;# Bool: Shaded or not + private variable allow_raise_win 1 ;# Bool: Allows to use command "raise" to force window visibility + private variable popup_menu_created 0 ;# Bool: Canvas widget popup menu has been created + private variable menu ;# Widget: Popup menu for he canvas widget + + private variable drawing_mode P ;# Char: Current drawing mode + private variable selected_color black ;# Color: Selected drawing color + private variable loaded_image {} ;# Image: Image to insert (image object not filename) + private variable text_to_write {} ;# String: Text to insert + + private variable click_X ;# Int: Auxiliary variable for storing last position + private variable click_Y ;# Int: Auxiliary variable for storing last position + + private variable max_X ;# Int: Auxiliary variable for storing max. allowed position + private variable max_Y ;# Int: Auxiliary variable for storing max. allowed position + + private variable mode_pen_but ;# Widget: Button "Pencil" mode + private variable mode_line_but ;# Widget: Button "Line" mode + private variable mode_arrow_but ;# Widget: Button "Arrow" mode + private variable mode_rectangle_but ;# Widget: Button "Rectangle" mode + private variable mode_oval_but ;# Widget: Button "Oval" mode + private variable mode_text_but ;# Widget: Button "Insert text" mode + private variable mode_clear_but ;# Widget: Button "Eraser" mode + private variable load_image_but ;# Widget: Button "Import image" + private variable select_color_but ;# Widget: Button "Select color" + private variable move_but ;# Widget: Button "Move canvas" mode + private variable flag_modified 0 ;# Bool: Flag modified + + ## contructor + # @parm String _file_name - (Nothing yet) + # @parm List _geometry - {X Y W H} + constructor {_file_name _geometry} { + incr count + + set filename $_file_name + if {$_geometry == {}} { + set geometry {50 50 300 300} + } { + set geometry $_geometry + } + + # Configure specific ttk styles + ttk::style configure Notes.TButton \ + -padding 0 \ + -background $bgcolor + ttk::style configure Notes_Flat.TButton \ + -background $bgcolor \ + -padding 0 \ + -borderwidth 1 \ + -relief flat + ttk::style map Notes_Flat.TButton \ + -relief [list active raised] \ + -background [list disabled {#EEEEEE}] + + create_win + } + + destructor { + destroy $win + } + + ## Close the window + # @return void + public method close {} { + if {$flag_modified} { + if {[tk_messageBox \ + -type yesno \ + -icon question \ + -parent $win \ + -title [mc "Really close ?"] \ + -message [mc "Do you really want to close your notes ? (There is no save function ...)"] \ + ] != {yes}} then { + return + } + } + delete object $this + } + + ## Event handler: title bar <Button-1> + # @parm Int x - Absolute X coordinate + # @parm Int y - Absolute Y coordinate + # @return void + public method title_B1 {x y} { + set click_X [expr {[winfo x $win] - $x}] + set click_Y [expr {[winfo y $win] - $y}] + + set max_X [winfo width .] + set max_Y [winfo height .] + incr max_X -70 + incr max_Y -70 + + focus $title_label + $title_label configure -cursor fleur + } + + ## Event handler: title bar <ButtonRelease-1> + # @return void + public method title_B1_release {} { + $title_label configure -cursor left_ptr + } + + ## Event handler: title bar <B1-Motion> + # @parm Int x - Absolute X coordinate + # @parm Int y - Absolute Y coordinate + # @return void + public method title_B1_motion {x y} { + incr x $click_X + incr y $click_Y + + if {$x > 0 && $x < $max_X} { + place $win -x $x + } + if {$y > 0 && $y < $max_Y} { + place $win -y $y + } + } + + ## Event handler: right bottom corner <Button-1> + # @return void + public method resize_B1 {} { + set click_X [expr {-[winfo x $win] - [winfo x .]}] + set click_Y [expr {-[winfo y $win] - [winfo y .]}] + + set max_X [expr {[winfo width .] + [winfo x .]}] + set max_Y [expr {[winfo height .] + [winfo y .]}] + } + + ## Event handler: right bottom corner <B1-Motion> + # @parm Int x - Absolute X coordinate + # @parm Int y - Absolute Y coordinate + # @return void + public method resize_B1_motion {x y} { + set _x $x + set _y $y + incr x $click_X + incr y $click_Y + + if {$x < 200 || $_x > $max_X} { + set x [winfo width $win] + } + if {$y < 200 || $_y > $max_Y} { + set y [winfo height $win] + } + place $win -width $x -height $y + } + + ## Change drawing mode + # @parm Char mode - New mode + # A - Arrow + # C - Eraser + # T - Insert text + # O - Oval + # R - Rectangle + # L - Line + # P - Pencil + # I - Insert image + # M - Move canvas + # @return void + public method change_mode {mode} { + # Local variables + set drawing_mode_org $drawing_mode + + # Object variables + set drawing_mode $mode + + # Bring toolbar buttons to default states + foreach w [list \ + $mode_pen_but $mode_line_but $mode_arrow_but \ + $mode_rectangle_but $mode_oval_but $mode_text_but \ + $mode_clear_but $load_image_but $move_but \ + ] { + $w configure -style Notes_Flat.TButton + } + + # Switch drawing mode + set w {} + switch -- $drawing_mode { + A { ;# Arrow + $canvas_widget configure -cursor cross + set w $mode_arrow_but + } + C { ;# Eraser + $canvas_widget configure -cursor left_ptr + set w $mode_clear_but + } + T { ;# Insert text + if {[prompt_for_text]} { + $canvas_widget configure -cursor cross + set w $mode_text_but + } { + if {$drawing_mode_org == {T}} { + set drawing_mode_org {M} + } + change_mode $drawing_mode_org + } + } + O { ;# Draw oval + $canvas_widget configure -cursor cross + set w $mode_oval_but + } + R { ;# Draw rectangle + $canvas_widget configure -cursor cross + set w $mode_rectangle_but + } + L { ;# Draw line + $canvas_widget configure -cursor cross + set w $mode_line_but + } + P { ;# Pencil + $canvas_widget configure -cursor pencil + set w $mode_pen_but + } + I { ;# Insert image + $canvas_widget configure -cursor cross + set w $load_image_but + } + M { ;# Move canvas + $canvas_widget configure -cursor fleur + set w $move_but + } + } + + # Highlight toolbar button belonging to the selected mode + if {$w != {}} { + $w configure -style Notes.TButton + } + } + + ## (Un)Shade window + # @return void + public method collapse_expand {} { + # Object variables + set minim_flag [expr {!$minim_flag}] + + # Shade + if {$minim_flag} { + set image _1downarrow + pack forget $main_frame + place $win -height [expr {[winfo height $win.title_bar] + 4}] + # Unshade + } { + set image _1uparrow + pack $main_frame -fill both -expand 1 -padx 2 -pady 2 + place $win -height [expr {[lindex $geometry 3] + 2}] + } + $coll_exp_but configure -image ::ICONS::16::$image + } + + ## Create popup menu + # @return void + private method create_popup_menu {} { + if {$popup_menu_created} {return} + set popup_menu_created 1 + + set menu $canvas_widget.menu + menuFactory $MENU $menu 0 "$this " 0 {} + } + + ## Popup menu + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @parm Int X - Absolute X coordinate + # @parm Int Y - Absolute Y coordinate + # @return void + public method popup_menu {x y X Y} { + create_popup_menu + set ::Notes::__mode $drawing_mode + set ::Notes::_menu_x $x + set ::Notes::_menu_y $y + + tk_popup $menu $X $Y + focus $title_label + } + + ## Zoom in canvas contents from the specified coordinates + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_zoom_in {x y} { + $canvas_widget scale all $x $y 1.5 1.5 + } + + ## Zoom out canvas contents from the specified coordinates + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_zoom_out {x y} { + $canvas_widget scale all $x $y 0.75 0.75 + } + + ## Zoom in canvas contents (from popup menu) + # @return void + public method canvas_zoom_in_from_pmenu {} { + canvas_zoom_in $::Notes::_menu_x $::Notes::_menu_y + } + + ## Zoom out canvas contents (from popup menu) + # @return void + public method canvas_zoom_out_from_pmenu {} { + canvas_zoom_out $::Notes::_menu_x $::Notes::_menu_y + } + + ## Create notepad window + # @return void + private method create_win {} { + # Create window frame + set win [frame .notes$count -bd 1 -relief raised -bg $bgcolor] + + ## Create title bar + # - Title bar frame + set title_bar [frame $win.title_bar -bg $bgcolor] + set title_label [label $title_bar.text \ + -bg $bgcolor -compound left \ + -text [mc "Scribble notepad"] \ + -image ::ICONS::16::pencil \ + -pady 0 \ + ] + # - Button "Close" + set close_button [ttk::button $title_bar.close_but \ + -style Notes_Flat.TButton \ + -command "$this close" \ + -image ::ICONS::16::button_cancel \ + -takefocus 0 \ + ] + DynamicHelp::add $title_bar.close_but -text [mc "Close"] + setStatusTip -widget $close_button -text [mc "Close"] + # - Button "Shade" + set coll_exp_but [ttk::button $title_bar.col_exp_but \ + -style Notes_Flat.TButton \ + -command "$this collapse_expand" \ + -image ::ICONS::16::_1uparrow \ + -takefocus 0 \ + ] + DynamicHelp::add $title_bar.col_exp_but -text [mc "Shade"] + setStatusTip -widget $coll_exp_but -text [mc "Shade"] + # Pack buttons + pack $coll_exp_but -padx 5 -side left -pady 0 -ipady 0 + pack $title_label -side left -fill x -pady 0 -ipady 0 -expand 1 + pack $close_button -side right -pady 0 -ipady 0 -padx 3 + # Set title bar event bindings + bind $title_label <Double-1> "$this collapse_expand" + bind $title_label <Button-1> "$this title_B1 %X %Y" + bind $title_label <B1-Motion> "$this title_B1_motion %X %Y" + bind $title_label <ButtonRelease-1> "$this title_B1_release" + + ## Create main frame + set main_frame [frame $win.main_frame -bg $bgcolor2] + set canvas_widget [canvas $main_frame.canvas \ + -bg $bgcolor2 -highlightthickness 0 \ + -width 0 -height 0 -bd 0 \ + ] + bind $canvas_widget <Button-1> "$this canvas_B1 %x %y" + bind $canvas_widget <B1-Motion> "$this canvas_B1_motion %x %y" + bind $canvas_widget <Motion> "$this canvas_motion %x %y" + bind $canvas_widget <ButtonRelease-1> "$this canvas_B1_release %x %y" + bind $canvas_widget <ButtonRelease-3> "$this popup_menu %x %y %X %Y" + bind $canvas_widget <Leave> "$this canvas_leave" + bind $canvas_widget <Enter> "$this canvas_enter %x %y" + + bind $canvas_widget <Button-4> "$this canvas_zoom_in %x %y" + bind $canvas_widget <Button-5> "$this canvas_zoom_out %x %y" + + ## Create bottom frame + # Create the frame + set bottom_frame [frame $main_frame.bottom_frame -bg $bgcolor] + # - Resizing corner + pack [label $bottom_frame.resize \ + -bg $bgcolor -cursor lr_angle \ + -image ::ICONS::16::corner \ + ] -side right + # - Set event bindings for the resizing corner + bind $bottom_frame.resize <Button-1> "$this resize_B1" + bind $bottom_frame.resize <B1-Motion> "$this resize_B1_motion %X %Y" + # - Button "Pencil" + set mode_pen_but [ttk::button $bottom_frame.mode_pen_but \ + -command "$this change_mode P" \ + -image ::ICONS::16::pencil \ + ] + DynamicHelp::add $bottom_frame.mode_pen_but -text [mc "Pencil"] + setStatusTip -widget $mode_pen_but -text [mc "Pencil"] + pack $mode_pen_but -side left -ipady 0 + # - Button "Line" + set mode_line_but [ttk::button $bottom_frame.mode_line_but \ + -command "$this change_mode L" \ + -image ::ICONS::16::line \ + ] + DynamicHelp::add $bottom_frame.mode_line_but -text [mc "Line"] + setStatusTip -widget $mode_line_but -text [mc "Draw lines"] + pack $mode_line_but -side left -ipady 0 + # - Button "Arrow" + set mode_arrow_but [ttk::button $bottom_frame.mode_arrow_but \ + -command "$this change_mode A" \ + -image ::ICONS::16::arr \ + ] + DynamicHelp::add $bottom_frame.mode_arrow_but -text [mc "Arrow"] + setStatusTip -widget $mode_arrow_but -text [mc "Draw arrows"] + pack $mode_arrow_but -side left -ipady 0 + # - Button "Retangle" + set mode_rectangle_but [ttk::button $bottom_frame.mode_rectangle_but \ + -command "$this change_mode R" \ + -image ::ICONS::16::grid1 \ + ] + DynamicHelp::add $bottom_frame.mode_rectangle_but -text [mc "Retangle"] + setStatusTip -widget $mode_rectangle_but -text [mc "Draw retangles"] + pack $mode_rectangle_but -side left -ipady 0 + # - Button "Oval" + set mode_oval_but [ttk::button $bottom_frame.mode_oval_but \ + -command "$this change_mode O" \ + -image ::ICONS::16::oval \ + ] + DynamicHelp::add $bottom_frame.mode_oval_but -text [mc "Oval"] + setStatusTip -widget $mode_oval_but -text [mc "Draw ovals"] + pack $mode_oval_but -side left -ipady 0 + # - Button "Insert text" + set mode_text_but [ttk::button $bottom_frame.mode_text_but \ + -command "$this change_mode T" \ + -image ::ICONS::16::editclear \ + ] + DynamicHelp::add $bottom_frame.mode_text_but -text [mc "Insert text"] + setStatusTip -widget $mode_text_but -text [mc "Insert text"] + pack $mode_text_but -side left -ipady 0 + # - Button "Move" + set move_but [ttk::button $bottom_frame.move_but \ + -command "$this change_mode M" \ + -image ::ICONS::16::mouse \ + ] + DynamicHelp::add $bottom_frame.move_but -text [mc "Move"] + setStatusTip -widget $move_but -text [mc "Move"] + pack $move_but -side left -ipady 0 + # - Button "Eraser" + set mode_clear_but [ttk::button $bottom_frame.mode_clear_but \ + -command "$this change_mode C" \ + -image ::ICONS::16::eraser \ + ] + DynamicHelp::add $bottom_frame.mode_clear_but -text [mc "Eraser"] + setStatusTip -widget $mode_clear_but -text [mc "Eraser"] + pack $mode_clear_but -side left -ipady 0 + # - Button "Select color" + set select_color_but [button $bottom_frame.select_color_but \ + -command "$this select_color" \ + -bd 1 -relief raised -overrelief raised \ + -activebackground $selected_color \ + -bg $selected_color -pady 0 \ + ] + DynamicHelp::add $bottom_frame.select_color_but -text [mc "Select color"] + setStatusTip -widget $select_color_but -text [mc "Select color"] + pack $select_color_but -side right -ipady 0 -pady 0 -padx 8 + # - Button "Insert image" + set load_image_but [ttk::button $bottom_frame.load_image_but \ + -command "$this load_image" \ + -image ::ICONS::16::fileimport \ + ] + DynamicHelp::add $bottom_frame.load_image_but -text [mc "Insert image"] + setStatusTip -widget $load_image_but -text [mc "Insert image"] + pack $load_image_but -side right -ipady 0 + # - Button "Clear all" + set clear_all_but [ttk::button $bottom_frame.clear_all_but \ + -command "$this canvas_clear_all" \ + -image ::ICONS::16::emptytrash \ + ] + DynamicHelp::add $bottom_frame.clear_all_but -text [mc "Clear all"] + setStatusTip -widget $clear_all_but -text [mc "Clear all"] + pack $clear_all_but -side right -ipady 0 + # - Separator + pack [ttk::separator $bottom_frame.sep0 \ + -orient vertical \ + ] -fill y -padx 5 -side right + # Restore default states of buttons on the bottom bar + foreach w [list \ + $mode_pen_but $mode_line_but $mode_arrow_but \ + $mode_rectangle_but $mode_oval_but $mode_text_but \ + $mode_clear_but $load_image_but $clear_all_but \ + $move_but \ + ] { + $w configure -style Notes_Flat.TButton + } + + # Pack all components of the window + pack $title_bar -fill x + pack $canvas_widget -fill both -expand 1 + pack $bottom_frame -fill x -side bottom + pack $main_frame -fill both -expand 1 -padx 2 -pady 2 + + # Set default drawing mode + change_mode P + + # Show the window + bind $win <Visibility> "$this raise_win" + place $win \ + -x [lindex $geometry 0] \ + -y [lindex $geometry 1] \ + -width [lindex $geometry 2] \ + -height [lindex $geometry 3] \ + -anchor nw + raise $win + } + + ## Insure window visibility + # @return void + public method raise_win {} { + if {!$allow_raise_win} {return} + set allow_raise_win 0 + after 1000 "catch {$this set_allow_raise_win}" + raise $win + } + + ## @see raise_win + # @return void + public method set_allow_raise_win {} { + set allow_raise_win 1 + } + + ## Prompt user for text to insert to the canvas + # @return void + private method prompt_for_text {} { + set ::Notes::text_prompt_text {} + set dialog [toplevel .notes_pd -bg {#EEEEEE}] + + ## Create top frame + set frame [frame $dialog.frm] + # - Label "Text" + pack [label $frame.lbl \ + -text [mc "Text:"] \ + ] -side left + # - EntryBox + set entry [ttk::entry $frame.text_entry \ + -textvariable ::Notes::text_prompt_text \ + -width 30 \ + ] + # Pack them + pack $entry -side left -fill x -expand 1 + pack $frame -padx 5 -pady 5 -fill x -expand 1 + # Set events bindings + bind $entry <Return> " + grab release $dialog + destroy $dialog + " + bind $entry <Escape> " + set ::Notes::text_prompt_text {} + grab release $dialog + destroy $dialog + " + + ## Create bottom frame + set frame [frame $dialog.frm_b] + # - Button "Cancel" + pack [ttk::button $dialog.cancel_button \ + -compound left \ + -image ::ICONS::16::button_cancel \ + -text [mc "Cancel"] \ + -command " + set ::Notes::text_prompt_text {} + grab release $dialog + destroy $dialog + " \ + ] -side right + # - Button "Ok" + pack [ttk::button $dialog.ok_button \ + -compound left \ + -image ::ICONS::16::ok \ + -text [mc "Ok"] \ + -command " + grab release $dialog + destroy $dialog + " \ + ] -side right + pack $frame -pady 5 -padx 5 -fill x + + wm title $dialog [mc "Enter text"] + wm transient $dialog . + wm geometry $dialog =250x70+[expr {[winfo screenwidth $win] / 2 - 250}]+[expr {[winfo screenheight $win] / 2 - 70}] + update + focus -force $entry + grab $dialog + raise $dialog + tkwait window $dialog + + set text_to_write ${::Notes::text_prompt_text} + return [string length $text_to_write] + } + + ## Event handler: canvas <Enter> + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_enter {x y} { + switch -- $drawing_mode { + T { ;# Insert text + $canvas_widget create text $x $y -text $text_to_write -anchor w -tags incomplete -font $canvas_text_font -fill $selected_color + } + I { ;# Import image + $canvas_widget create image $x $y -image $loaded_image -tags incomplete + } + } + } + + ## Event handler: canvas <Button-1> + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_B1 {x y} { + set click_X $x + set click_Y $y + + switch -- $drawing_mode { + C { ;# Eraser + set flag_modified 1 + $canvas_widget create rectangle \ + [expr {$x - 10}] [expr {$y - 10}] \ + [expr {$x + 10}] [expr {$y + 10}] \ + -outline $bgcolor2 -fill $bgcolor2 + } + T { ;# Insert text + set flag_modified 1 + $canvas_widget dtag incomplete incomplete + $canvas_widget create text $x $y -text $text_to_write -anchor w -tags incomplete -font $canvas_text_font -fill $selected_color + } + I { ;# Import image + set flag_modified 1 + $canvas_widget dtag incomplete incomplete + $canvas_widget create image $x $y -image $loaded_image -tags incomplete + } + } + + focus $canvas_widget + } + + ## Event handler: canvas <Motion> + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_motion {x y} { + switch -- $drawing_mode { + C { ;# Eraser + $canvas_widget delete incomplete + $canvas_widget create rectangle \ + [expr {$x - 10}] [expr {$y - 10}] \ + [expr {$x + 10}] [expr {$y + 10}] \ + -tag incomplete -outline #FF0000 + } + T { ;# Insert text + $canvas_widget coords incomplete $x $y + } + I { ;# Import image + $canvas_widget coords incomplete $x $y + } + } + } + + ## Event handler: canvas <B1-Motion> + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_B1_motion {x y} { + $canvas_widget delete incomplete + switch -- $drawing_mode { + C { ;# Eraser + set flag_modified 1 + $canvas_widget create rectangle \ + [expr {$x - 10}] [expr {$y - 10}] \ + [expr {$x + 10}] [expr {$y + 10}] \ + -outline $bgcolor2 -fill $bgcolor2 + $canvas_widget create rectangle \ + [expr {$x - 10}] [expr {$y - 10}] \ + [expr {$x + 10}] [expr {$y + 10}] \ + -tag incomplete -outline #FF0000 + } + T { ;# Insert text + if {![llength [$canvas_widget find withtag incomplete]]} { + $canvas_widget create text $x $y -text $text_to_write -anchor w -tags incomplete -font $canvas_text_font -fill $selected_color + } + $canvas_widget coords incomplete $x $y + } + O { ;# Draw oval + $canvas_widget create oval $click_X $click_Y $x $y -tag incomplete -dash {_} -outline $selected_color + } + R { ;# Draw rectangle + $canvas_widget create rectangle $click_X $click_Y $x $y -tag incomplete -dash {_} -outline $selected_color + } + L { ;# Draw line + $canvas_widget create line $click_X $click_Y $x $y -tag incomplete -dash {_} -fill $selected_color + } + P { ;# Pencil + set flag_modified 1 + $canvas_widget create line $click_X $click_Y $x $y -fill $selected_color + set click_X $x + set click_Y $y + } + A { ;# Draw arrow + $canvas_widget create line $click_X $click_Y $x $y -tag incomplete -dash {_} -arrow last -fill $selected_color + } + I { ;# Import image + if {![llength [$canvas_widget find withtag incomplete]]} { + $canvas_widget create image $x $y -image $loaded_image -tags incomplete + } + $canvas_widget coords incomplete $x $y + } + M { ;# Move canvas + $canvas_widget move all [expr {$x - $click_X}] [expr {$y - $click_Y}] + + set click_X $x + set click_Y $y + } + } + } + + ## Event handler: canvas <ButtonRelease-1> + # @parm Int x - Relative X coordinate + # @parm Int y - Relative Y coordinate + # @return void + public method canvas_B1_release {x y} { + switch -- $drawing_mode { + O { ;# Draw oval + set flag_modified 1 + $canvas_widget itemconfigure incomplete -dash {} -outline $selected_color + $canvas_widget dtag incomplete incomplete + } + R { ;# Draw rectangle + set flag_modified 1 + $canvas_widget itemconfigure incomplete -dash {} -outline $selected_color + $canvas_widget dtag incomplete incomplete + } + L { ;# Draw line + set flag_modified 1 + $canvas_widget itemconfigure incomplete -dash {} -fill $selected_color + $canvas_widget dtag incomplete incomplete + } + A { ;# Draw arrow + set flag_modified 1 + $canvas_widget itemconfigure incomplete -dash {} -fill $selected_color + $canvas_widget dtag incomplete incomplete + } + } + } + + ## Event handler: canvas <Leave> + # @return void + public method canvas_leave {} { + $canvas_widget delete incomplete + } + + ## Completely clear the canvas + # @return void + public method canvas_clear_all {} { + if {[tk_messageBox \ + -parent . \ + -type yesno \ + -icon question \ + -title [mc "Are you sure ?"] \ + -message [mc "Do you really want to clear this notepad\n(there is no undo action)"] \ + ] != {yes}} { + return + } + $canvas_widget delete all + } + + ## Select drawing color + # @return void + public method select_color {} { + set color [SelectColor .select_color \ + -parent . \ + -color $selected_color \ + -title [mc "Select color"] \ + ] + + if {$color != {}} { + set selected_color $color + $select_color_but configure -bg $color -activebackground $color + } + } + + ## Select image file to import + # @return void + public method load_image {} { + catch {delete object ::fsd} + + set directory {} + catch { + set directory [$::X::actualProject cget -projectPath] + } + + KIFSD::FSD ::fsd \ + -directory $directory \ + -title [mc "Insert image from file"] \ + -defaultmask 0 -multiple 0 -filetypes { + {{PNG files} {*.png}} + {{All files} {*}} + } + + ::fsd setokcmd "$this load_image_file \[::fsd get\]" + ::fsd activate + } + + ## Import image from file + # @parm String file - Full file name + # @return void + public method load_image_file {file} { + set loaded_image {} + if {[catch { + set loaded_image [image create photo -file $file] + }]} { + tk_messageBox \ + -title [mc "Unable to read file"] \ + -type ok -icon warning \ + -message [mc "Unable to read file:\n%s" $file] + return + } + + if {$loaded_image != {}} { + change_mode I + } + } +} |