mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* ext/tk/sample/demos-en/tcolor.bak: remove.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9267 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c6b5ca0e21
commit
140a4cd9d4
1 changed files with 0 additions and 513 deletions
|
@ -1,513 +0,0 @@
|
|||
#!/usr/local/bin/ruby
|
||||
#
|
||||
# tcolor --
|
||||
# このスクリプトはRGB,HSB,CYM形式をサポートする
|
||||
# 簡易カラーエディタです。
|
||||
#
|
||||
# Copyright (C) 1998 Takaaki Tateishi(ttate@jaist.ac.jp)
|
||||
# last update: Thu Jun 18 06:32:35 JST 1998
|
||||
#
|
||||
|
||||
# まずはtk.rbを読み込む。
|
||||
|
||||
require "tk"
|
||||
|
||||
|
||||
# Tkによって変更される変数はTkVariableのインスタンスを使う。
|
||||
|
||||
$colorSpace = TkVariable.new(:rgb)
|
||||
$red = 65535
|
||||
$green = 0
|
||||
$blue = 0
|
||||
$color = "#ffff00000000"
|
||||
$updating = TkVariable.new(0)
|
||||
$autoUpdate = TkVariable.new(1)
|
||||
$name = TkVariable.new("")
|
||||
# $command = TkVariable.new("print(%%,\"\n\")")
|
||||
$command = TkVariable.new("")
|
||||
$label1 = TkVariable.new("label1")
|
||||
$label2 = TkVariable.new("label2")
|
||||
$label3 = TkVariable.new("label3")
|
||||
|
||||
|
||||
# 各イベント用のメソッド
|
||||
|
||||
def rgbToHsv(red,green,blue)
|
||||
|
||||
if ( red > green )
|
||||
max = red
|
||||
min = green
|
||||
else
|
||||
max = green
|
||||
min = red
|
||||
end
|
||||
|
||||
if ( blue > max )
|
||||
max = blue
|
||||
else
|
||||
if ( blue < min )
|
||||
min = blue
|
||||
end
|
||||
end
|
||||
|
||||
range = max - min
|
||||
|
||||
if ( max == 0 )
|
||||
sat = 0.0
|
||||
else
|
||||
sat = (max-min)/max
|
||||
end
|
||||
|
||||
if ( sat == 0 )
|
||||
hue = 0.0
|
||||
else
|
||||
rc = (max-red)/range
|
||||
gc = (max-green)/range
|
||||
bc = (max-blue)/range
|
||||
if ( red == max )
|
||||
hue = 0.166667 * (bc - gc)
|
||||
else
|
||||
if ( green == max )
|
||||
hue = 0.166667 * (2.0 + rc - bc)
|
||||
else
|
||||
hue = 0.166667 * (4.0 + gc - rc)
|
||||
end
|
||||
end
|
||||
if ( hue < 0.0 )
|
||||
hue = hue + 1.0
|
||||
end
|
||||
end
|
||||
|
||||
[hue,sat,max/65535]
|
||||
end
|
||||
|
||||
|
||||
def hsbToRgb(hue,sat,value)
|
||||
v = 65535.0 * value
|
||||
if( sat == 0 )
|
||||
ans = [v,v,v]
|
||||
else
|
||||
hue = hue*6.0
|
||||
if ( hue >= 6 )
|
||||
hue = 0.0
|
||||
end
|
||||
i = hue.to_i
|
||||
f = hue - i
|
||||
p = 65535.0 * value * (1.0 - sat)
|
||||
q = 65535.0 * value * (1.0 - (sat * f))
|
||||
t = 65535.0 * value * (1.0 - (sat * (1.0 - f)))
|
||||
case i
|
||||
when 0
|
||||
ans = [v,t,p]
|
||||
when 1
|
||||
ans = [q,v,p]
|
||||
when 2
|
||||
ans = [p,v,t]
|
||||
when 3
|
||||
ans = [p,q,v]
|
||||
when 4
|
||||
ans = [t,p,v]
|
||||
when 5
|
||||
ans = [v,p,q]
|
||||
else
|
||||
raise(eException,"i value #{i} is out of range")
|
||||
end
|
||||
end
|
||||
return ans
|
||||
end
|
||||
|
||||
|
||||
def doUpdate
|
||||
newCmd = $command.to_s.gsub("%%","\"#{$color}\"")
|
||||
eval(newCmd)
|
||||
end
|
||||
|
||||
|
||||
def tc_scaleChanged
|
||||
if( $updating.to_i == 1 )
|
||||
return
|
||||
end
|
||||
|
||||
scale1 = $root.middle.middle.scale1
|
||||
scale2 = $root.middle.middle.scale2
|
||||
scale3 = $root.middle.middle.scale3
|
||||
|
||||
case $colorSpace.to_i
|
||||
when :rgb
|
||||
$red = (scale1.get * 65.535).to_i
|
||||
$green = (scale2.get * 65.535).to_i
|
||||
$blue = (scale3.get * 65.535).to_i
|
||||
when :cmy
|
||||
$red = (65535 - scale1.get * 65.535).to_i
|
||||
$green = (65535 - scale2.get * 65.535).to_i
|
||||
$blue = (65535 - scale3.get * 65.535).to_i
|
||||
when :hsb
|
||||
list = hsbToRgb(scale1.get / 1000.0,
|
||||
scale2.get / 1000.0,
|
||||
scale3.get / 1000.0)
|
||||
$red = list[0]
|
||||
$green = list[1]
|
||||
$blue = list[2]
|
||||
else
|
||||
raise(Exception,"unknown colorSpace")
|
||||
end
|
||||
$color = format("#%04x%04x%04x",$red.to_i,$green.to_i,$blue.to_i)
|
||||
$root.middle.right.set_color($color)
|
||||
if( $autoUpdate.to_i == 1 )
|
||||
doUpdate
|
||||
end
|
||||
Tk.update(TRUE)
|
||||
end
|
||||
|
||||
|
||||
def tc_setScales
|
||||
$updating.value = 1
|
||||
|
||||
scale1 = $root.middle.middle.scale1
|
||||
scale2 = $root.middle.middle.scale2
|
||||
scale3 = $root.middle.middle.scale3
|
||||
|
||||
case $colorSpace.to_i
|
||||
when :rgb
|
||||
scale1.set($red / 65.535)
|
||||
scale2.set($green / 65.535)
|
||||
scale3.set($blue / 65.535)
|
||||
when :cmy
|
||||
scale1.set((65535 - $red) / 65.535)
|
||||
scale2.set((65535 - $green) / 65.535)
|
||||
scale3.set((65535 - $blue) / 65.535)
|
||||
when :hsb
|
||||
list = rgbToHsv($red,$green,$blue)
|
||||
scale1.set( list[0] * 1000.0 )
|
||||
scale2.set( list[1] * 1000.0 )
|
||||
scale3.set( list[2] * 1000.0 )
|
||||
else
|
||||
raise(Exception,"unknown colorSpace")
|
||||
end
|
||||
|
||||
$updating.value = 0
|
||||
end
|
||||
|
||||
|
||||
def tc_loadNamedColor(name)
|
||||
if name[0,1] != "#"
|
||||
list = TkWinfo.rgb($root.middle.right.swatch,name)
|
||||
$red = list[0]
|
||||
$green = list[1]
|
||||
$blue = list[2]
|
||||
else
|
||||
case name.length
|
||||
when 4
|
||||
format = /#(.{1})(.{1})(.{1})/
|
||||
shift = 12
|
||||
when 7
|
||||
format = /#(.{2})(.{2})(.{2})/
|
||||
shift = 8
|
||||
when 10
|
||||
format = /#(.{3})(.{3})(.{3})/
|
||||
shift = 4
|
||||
when 13
|
||||
format = /#(.{4})(.{4})(.{4})/
|
||||
shift = 0
|
||||
else
|
||||
raise(eException,"syntax error in color name \"#{name}\"")
|
||||
end
|
||||
name.scan(format){|strlist|
|
||||
if strlist.length != 3
|
||||
raise(eException,"syntax error in color name \"#{name}\"")
|
||||
end
|
||||
$red = strlist[0].to_i
|
||||
$green = strlist[1].to_i
|
||||
$blue = strlist[2].to_i
|
||||
}
|
||||
$red = $red << shift
|
||||
$green = $green << shift
|
||||
$blue = $blue << shift
|
||||
end
|
||||
|
||||
tc_setScales
|
||||
$color = format("#%04x%04x%04x",$red,$green,$blue)
|
||||
$root.middle.right.set_color($color)
|
||||
if $autoUpdate.to_i == 1
|
||||
doUpdate
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
def changeColorSpace(space)
|
||||
case space
|
||||
when :rgb
|
||||
$label1.value = "Red"
|
||||
$label2.value = "Green"
|
||||
$label3.value = "Blue"
|
||||
when :cmy
|
||||
$label1.value = "Cyan"
|
||||
$label2.value = "Magenta"
|
||||
$label3.value = "Yellow"
|
||||
when :hsb
|
||||
$label1.value = "Hue"
|
||||
$label2.value = "Saturation"
|
||||
$label3.value = "Brightness"
|
||||
end
|
||||
tc_setScales
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# tcolor用のメニュー
|
||||
|
||||
class TkColorMenuFrame<TkFrame
|
||||
def initialize(parent)
|
||||
super(parent,
|
||||
"relief"=>"raised",
|
||||
"borderwidth"=>"2")
|
||||
|
||||
# Fileメニューボタンの生成
|
||||
@file = TkMenubutton.new(self){|button|
|
||||
|
||||
# Fileメニューの作成
|
||||
@file_menu = TkMenu.new(button){
|
||||
add "radio",
|
||||
"label" => "RGB color space",
|
||||
"variable" => $colorSpace,
|
||||
"value" => :rgb,
|
||||
"underline" => "0",
|
||||
"command" => proc{changeColorSpace(:rgb)}
|
||||
add "radio",
|
||||
"label" => "CMY color space",
|
||||
"variable" => $colorSpace,
|
||||
"value" => :cmy,
|
||||
"underline" => "0",
|
||||
"command" => proc{changeColorSpace(:cmy)}
|
||||
add "radio",
|
||||
"label" => "HSB color space",
|
||||
"variable" => $colorSpace,
|
||||
"value" => :hsb,
|
||||
"underline" => "0",
|
||||
"command" => proc{changeColorSpace(:hsb)}
|
||||
add "separator"
|
||||
add "radio",
|
||||
"label" => "Qutomatic updates",
|
||||
"variable" => $autoUpdate,
|
||||
"value" => "1",
|
||||
"underline" => "0"
|
||||
add "radio",
|
||||
"label" => "Manual updates",
|
||||
"variable" => $autoUpdate,
|
||||
"value" => "0",
|
||||
"underline" => "0"
|
||||
add "separator"
|
||||
add "command",
|
||||
"label" => "Exit program",
|
||||
"underline" => "0",
|
||||
"command" => proc{exit}
|
||||
}
|
||||
|
||||
# FileメニューとFileボタンを関連付ける
|
||||
menu @file_menu
|
||||
|
||||
text "File"
|
||||
underline "0"
|
||||
}.pack("side"=>"left")
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# 下部のフレームのためのクラス
|
||||
class TkColorBotFrame<TkFrame
|
||||
def initialize(parent)
|
||||
super(parent,
|
||||
"relief"=> "raised",
|
||||
"borderwidth"=> 2)
|
||||
|
||||
@commandLabel = TkLabel.new(self,
|
||||
"text"=> "Command:")
|
||||
@command = TkEntry.new(self,
|
||||
"relief"=> "sunken",
|
||||
"borderwidth"=> "2",
|
||||
"textvariable"=> $command,
|
||||
"font"=> "-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*")
|
||||
@update = TkButton.new(self,
|
||||
"text"=> "Update",
|
||||
"command"=> proc{doUpdate})
|
||||
@commandLabel.pack("side"=>"left")
|
||||
@update.pack("side"=>"right","pady"=>".1c","padx"=>".25c")
|
||||
@command.pack("expand"=>"yes","fill"=>"x","ipadx"=>".25c")
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# 中段左のフレーム
|
||||
class TkColorMiddleLeftFrame<TkFrame
|
||||
def initialize(parent)
|
||||
super(parent)
|
||||
|
||||
for i in ["/usr/local/lib/X11rgb.txt","/usr/lib/X11/rgb.txt",
|
||||
"/X11/R5/lib/X11/rgb.txt","/X11/R4/lib/rgb/rgb.txt",
|
||||
"/usr/openwin/lib/X11/rgb.txt"]
|
||||
if !File.readable?(i)
|
||||
next
|
||||
end
|
||||
f = File.open(i)
|
||||
@scroll = TkScrollbar.new(self,
|
||||
"orient"=>"vertical",
|
||||
"relief"=>"sunken",
|
||||
"borderwidth"=>"2")
|
||||
@scroll.pack("side"=>"right","fill"=>"y")
|
||||
@names = TkListbox.new(self,
|
||||
"width"=>"20",
|
||||
"height"=>"12",
|
||||
"yscrollcommand"=> proc{|first,last| @scroll.set first,last},
|
||||
"relief"=>"sunken",
|
||||
"borderwidth"=>"2",
|
||||
"exportselection"=>"false")
|
||||
@scroll.command(proc{|*args| @names.yview *args})
|
||||
@names.bind("Double-1",proc{
|
||||
tc_loadNamedColor(@names.get(@names.curselection))})
|
||||
@names.pack("side"=>"left")
|
||||
while (line = f.gets)
|
||||
line.chop!
|
||||
linelist = line.split(/[ \t]+/)
|
||||
if linelist.length == 4
|
||||
@names.insert("end",linelist[3])
|
||||
end
|
||||
end
|
||||
f.close
|
||||
break
|
||||
end
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# 中段中央のフレーム
|
||||
class TkColorMiddleMiddleFrame<TkFrame
|
||||
# @scale1,@scale2,@scale3を外部から参照のみ許可する。(変更不可)
|
||||
attr_reader :scale1, :scale2, :scale3
|
||||
|
||||
def initialize(parent)
|
||||
super(parent)
|
||||
|
||||
@f1 = TkFrame.new(self)
|
||||
@f2 = TkFrame.new(self)
|
||||
@f3 = TkFrame.new(self)
|
||||
@f4 = TkFrame.new(self)
|
||||
|
||||
for f in [@f1,@f2,@f3]
|
||||
f.pack("side"=>"top","expand"=>"yes")
|
||||
end
|
||||
@f4.pack("side"=>"top","expand"=>"yes","fill"=>"x")
|
||||
|
||||
@label1 = TkLabel.new(self,"textvariable"=>$label1)
|
||||
@scale1 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c",
|
||||
"orient"=>"horizontal",
|
||||
"command"=>proc{tc_scaleChanged})
|
||||
@scale1.pack("side"=>"top","anchor"=>"w")
|
||||
@label1.pack("side"=>"top","anchor"=>"w")
|
||||
|
||||
@label2 = TkLabel.new(self,"textvariable"=>$label2)
|
||||
@scale2 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c",
|
||||
"orient"=>"horizontal",
|
||||
"command"=>proc{tc_scaleChanged})
|
||||
@scale2.pack("side"=>"top","anchor"=>"w")
|
||||
@label2.pack("side"=>"top","anchor"=>"w")
|
||||
|
||||
@label3 = TkLabel.new(self,"textvariable"=>$label3)
|
||||
@scale3 = TkScale.new(self,"from"=>"0","to"=>"1000","length"=>"6c",
|
||||
"orient"=>"horizontal",
|
||||
"command"=>proc{tc_scaleChanged})
|
||||
@scale3.pack("side"=>"top","anchor"=>"w")
|
||||
@label3.pack("side"=>"top","anchor"=>"w")
|
||||
|
||||
@nameLabel = TkLabel.new(self,"text"=>"Name:")
|
||||
@name = TkEntry.new(self,"relief"=>"sunken","borderwidth"=>"2",
|
||||
"textvariable"=>$name,"width"=>"10",
|
||||
"font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*")
|
||||
@nameLabel.pack("side"=>"left")
|
||||
@name.pack("side"=>"right", "expand"=>"1", "fill"=>"x")
|
||||
@name.bind("Return",proc{tc_loadNamedColor $name.to_s})
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class TkColorMiddleRightFrame<TkFrame
|
||||
attr_reader :swatch
|
||||
|
||||
def initialize(parent)
|
||||
super(parent)
|
||||
@swatch = TkFrame.new(self, "width"=>"2c", "height"=>"5c",
|
||||
"background"=>$color)
|
||||
@value = TkLabel.new(self,
|
||||
"text"=>$color,
|
||||
"width"=>"13",
|
||||
"font"=>"-Adobe-Courier-Medium-R-Normal--*-120-*-*-*-*-*-*")
|
||||
@swatch.pack("side"=>"top","expand"=>"yes","fill"=>"both")
|
||||
@value.pack("side"=>"bottom","pady"=>".25c")
|
||||
|
||||
self
|
||||
end
|
||||
|
||||
def set_color(color)
|
||||
@swatch["background"] = color
|
||||
@value["text"] = color
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
# 中段のフレーム
|
||||
class TkColorMiddleFrame<TkFrame
|
||||
attr_reader :left, :middle, :right
|
||||
|
||||
def initialize(parent)
|
||||
super(parent,
|
||||
"relief"=> "raised",
|
||||
"borderwidth"=> "2")
|
||||
|
||||
@left = TkColorMiddleLeftFrame.new(self)
|
||||
@left.pack("side"=>"left","padx"=>".25c","pady"=>".25c")
|
||||
|
||||
@middle = TkColorMiddleMiddleFrame.new(self)
|
||||
@middle.pack("side"=>"left","expand"=>"yes","fill"=>"y")
|
||||
|
||||
@right = TkColorMiddleRightFrame.new(self)
|
||||
@right.pack("side"=>"left","padx"=>".25c","pady"=>".25c","anchor"=>"s")
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
class TkColor<TkRoot
|
||||
attr_reader :menu, :bottom, :middle
|
||||
|
||||
def initialize
|
||||
super
|
||||
@menu = TkColorMenuFrame.new(self)
|
||||
@menu.pack("side"=>"top", "fill"=>"x")
|
||||
|
||||
@bottom = TkColorBotFrame.new(self)
|
||||
@bottom.pack("side"=>"bottom","fill"=>"x")
|
||||
|
||||
@middle = TkColorMiddleFrame.new(self)
|
||||
@middle.pack("side"=>"top","fill"=>"both")
|
||||
|
||||
self
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
$root = TkColor.new
|
||||
|
||||
# イベントを待つ為にループに入る。
|
||||
changeColorSpace :rgb
|
||||
Tk.mainloop
|
Loading…
Reference in a new issue