예제 #1
0
파일: tester.py 프로젝트: ASayre/UCSBsketch
class CanvasTest(object):
   def __init__(self):
      self.canvas = GWTCanvas(coordX = 400, coordY= 400, pixelX = 400, pixelY = 400)
      self.canvas.addStyleName("gwt-canvas")
      DOM.sinkEvents(self.canvas.getElement(), Event.MOUSEEVENTS)
      #DOM.setEventListener(self.canvas.getElement(), self)

      self.canvas.setFillStyle(Color.Color(255, 0, 0))
      self.canvas.fillRect(4,4,10,10)

      self._dragging = False
      #Register for canvas mouse events


      RootPanel().add(self.canvas)

   def onBrowserEvent(self, event):
      print "Event happened"
      kind = DOM.eventGetType(event)
      x = DOM.eventGetClientX(event) - DOM.getAbsoluteLeft(self.canvas.getElement())
      y = DOM.eventGetClientY(event) - DOM.getAbsoluteTop(self.canvas.getElement())
      print "Type of event: %s" % (kind)
      if kind == "mousedown":
         self._dragging = True
         self.onMouseDown(x,y)
      elif kind == "mousemove" and self._dragging:
         self.onMouseDrag(x,y)
      elif (kind == "mouseup" or kind == "mouseout") and self._dragging:
         self._dragging = False
         self.onMouseUp(x,y)

   def onMousedown(self, x, y):
      print "Mousedown"

   def onMouseDrag(self, x, y):
      print "Mouse dragging"

   def onMouseUp(self, x, y):
      print "Mouseup"
예제 #2
0
파일: dash2.py 프로젝트: davelab6/telaro
class Dash:

    def __init__(self):

        self.p = VerticalPanel(Width="700px", Height="700px",
                               StyleName="dashpanel")
        RootPanel().add(self.p)
        self.log = HTML("log", Width="500px", Height="100px")

        self.cwidth = 700.0
        self.cheight = 700.0
        self.canvas = GWTCanvas(self.cwidth, self.cheight)
        self.canvas.resize(self.cwidth, self.cheight)
        self.p.add(self.canvas)
        self.p.add(self.log)
        self.cwidth = 700.0
        self.cheight = 700.0
        #self.offset_x = 423.0-233#240.0
        #self.offset_y = 153.0-220#-100.0
        self.offset_x = 0.0
        self.offset_y = 0.0
        self.scale = 1.0
        self.target_scale = 1.0
        self.move_allowed = False

        w2 = self.cwidth / 2.0
        h2 = self.cheight / 2.0

        self.word_chain = get_test_letters()
        # TODO: make a fake "top level" LetterNode, which these are added to
        self.letters = self.get_more_letters()
        self.root_node = self.letters

        self.cur_time = time()
        self.mouse_pos_x = w2
        self.mouse_pos_y = h2

        self.redraw_required = True
        #self.draw()

        Timer(50, self)

        self.canvas.addMouseListener(self)

    def new_mouse_pos(self, x, y):
        el = self.canvas.getElement()
        self.mouse_pos_x = x - DOM.getAbsoluteLeft(el)
        self.mouse_pos_y = y - DOM.getAbsoluteTop(el)

    def onMouseDown(self, sender, x, y):
        self.move_allowed = True
        self.new_mouse_pos(x, y)

    def onMouseUp(self, sender, x, y):
        self.move_allowed = False
        self.new_mouse_pos(x, y)

    def onMouseMove(self, sender, x, y):
        self.new_mouse_pos(x, y)

    def onMouseEnter(self, sender):
        pass

    def onMouseLeave(self, sender):
        self.move_allowed = False

    def onTimer(self, timer):
        
        new_time = time()
        diff_time = new_time - self.cur_time
        self.cur_time = new_time

        self.log_txt = "time: %.2f<br/>test<br/>" % self.cur_time

        scale = diff_time / (self.scale)

        #print self.move_allowed, "%.3f" % diff_time, self.mouse_pos_x, self.mouse_pos_y

        scale_diff = math.log10(self.target_scale) - math.log10(self.scale)
        scale_diff = scale_diff * diff_time * 2
        self.scale = math.pow(10, math.log10(self.scale) + scale_diff)

        if self.move_allowed:
            w2 = self.cwidth / 2.0
            h2 = self.cheight / 2.0
            x_vel = scale * (self.mouse_pos_x - w2)
            y_vel = scale * (self.mouse_pos_y - h2)

            self.offset_x += x_vel
            self.offset_y += y_vel
            self.redraw_required = True

        elif abs(scale_diff) > 1e-15:
            self.redraw_required = True

        if self.redraw_required:
            self.draw()

        self.log.setHTML(self.log_txt)

        Timer(50, self)

    def draw(self):

        self.canvas.resize(self.cwidth, self.cheight)
        self.redraw_required = False

        w2 = self.cwidth / 2.0
        h2 = self.cheight / 2.0

        self.closest = [None, None]

        self.get_closest(0.0, 0.0, self.cwidth, self.cheight,
                                self.root_node)

        #print self.closest

        scale = calc_scale(self.closest[0], self.closest[1],
                                  self.offset_x,
                                    self.offset_y+h2,
                                    self.cheight)
        self.target_scale = scale

        self.log_txt += "scale: %f<br/>" % self.scale
        self.log_txt += "targetscale: %f<br/>" % self.target_scale

        #print "scale:", self.scale, self.target_scale

        x1 = self.offset_x + (self.cwidth / self.scale)
        y1 = self.offset_y + (self.cheight / self.scale)

        #print "redbox", self.offset_x, self.offset_y, x1, y1

        self.canvas.saveContext()
        self.canvas.clear()

        #self.canvas.setFillStyle(Color("#888"))
        #self.canvas.setLineWidth(1)
        #self.canvas.fillRect(0, 0, self.cwidth, self.cheight)

        self.display_letters(None, 0.0, 0.0, self.cwidth, self.cheight,
                                self.root_node, 0)

        self.canvas.restoreContext()

        #print self.closest

    def sr(self, x, y, w, h):
        #sw = (self.cwidth/2/self.scale)
        #sh = (self.cheight/2/self.scale)
        sw = self.cwidth/2.0
        sh = self.cheight/2.0
        rect = (-sw*self.scale+(x+(-self.offset_x+sw/self.scale))*self.scale,
                -sh*self.scale+(y+(-self.offset_y+sh/self.scale))*self.scale,
                w*self.scale,
                h*self.scale)
        #print "rect", x,y,w,h, rect
        return rect

    def check_closest(self, letter, x, y):
        """ this function gets the two closest letters to the current cursor.
        """
        #print self.closest
        if self.closest[0] is None:
            #print "none"
            self.closest[0] = letter
        else:
            #print x, y, letter.x, letter.y
            if _check_closest(self.closest[0], letter, x, y):
                return
            self.closest[1] = self.closest[0]
            self.closest[0] = letter

    def get_closest(self, px, py, pwidth, pheight, letters):

        if not letters:
            return

        length = len(letters)
        amount_use = 1.0
        oy = 0.0 # pheight * (1.0-amount_use) / 2.0
        for i, letter in enumerate(letters):
            height = letter.weight * pheight 
            width  = letter.weight * pwidth
            letter.x = px+(pwidth - width) #+ height * 0.1
            letter.y = py+oy
            letter.box_width = width
            letter.box_height = height * amount_use

            cursor_x = self.offset_x + (self.cwidth/2.0)
            cursor_y = self.offset_y + (self.cheight/2.0)

            if _inside(letter, cursor_x, cursor_y):
                self.inside_letter = letter

            self.get_closest(letter.x, letter.y,
                                 letter.box_width, letter.box_height,
                                 letter)
            self.check_closest(letter, cursor_x, cursor_y)

            oy += letter.box_height

    def get_more_letters(self, letter=None):
        res = []
        if letter is None or letter.word_ptr is None or \
           len(letter.word_ptr) == 0:
            chain = self.word_chain
        else:
            chain = letter.word_ptr
        for l in chain:
            ln = LetterNode(l.letter, l.weight, parent=l.parent)
            ln.word_ptr = l
            res.append(ln)
        #print "letter", letter
        #pprint_letters(res)
        return res

    def display_letters(self, ch, px, py, pwidth, pheight, letters, colouridx):

        if colouridx == 0:
            col = Color("#ccf")
            altcol = Color("#88f")
        elif colouridx == 1:
            col = Color("#fcc")
            altcol = Color("#f88")
        else:
            col = Color("#cfc")
            altcol = Color("#8f8")

        self.canvas.setLineWidth(1)
        x, y, w, h = self.sr(px, py, pwidth, pheight)

        if y + h < 0:
            return
        if y > self.cheight:
            return
        if x + w < 0:
            return
        if x > self.cwidth:
            return

        self.canvas.fillRect(x, y, w, h)

        if ch:
            self.canvas.setFillStyle(Color("#000"))
            self.canvas.fillText(ch, x, y + h)

        if h < 20:
            return

        if not letters:
            more = self.get_more_letters(letters)
            self.redraw_required = True
            return more

        if not letters:
            return

        newidx = (colouridx+1) % 3
        length = len(letters)
        oy = 0
        for i, letter in enumerate(letters):
            height = letter.box_width
            width  = letter.box_height
            if i % 2 == 0:
                self.canvas.setFillStyle(col)
            else:
                self.canvas.setFillStyle(altcol)
            more = self.display_letters(letter.letter, letter.x, letter.y,
                                 width, height,
                                 letter, newidx)
            if more:
                for l in more:
                    letter.append(l)
            oy += height