Raumplaner Drag & Drop Problem

Plattformunabhängige GUIs mit wxWidgets.
Antworten
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Hallöchen erstmal

Ich habe folgenes Problem:

Ich habe einen Raumplaner, auf dem man durch Drag & Drop die Rasterelemente durch vollgrafische Elemente belegen soll.

Nun meine Frage:

1. Wie krieg ich es hin, dass die Rasterelemente meine "gezogenen" Bitmaps annehmen? Mit leeren Bitmaps?

Bin da etwas ratlos. :!:

Code: Alles auswählen

# coding=utf-8

import wx    # wxPython
import os    # OS-spezifische Funktionen
import cPickle 

class DropTarget(wx.PyDropTarget):
   def __init__(self, parent):
      wx.PyDropTarget.__init__(self)
            
      self.data = wx.CustomDataObject("DoodleLines")
      self.SetDataObject(self.data) 
            
   def OnDrop(self, x, y):
      return True
   
   def OnData(self, x, y, d):
         
      return d
   
class Room_draw(object):
#--------------------------------------

   def __init__(self, room_name, size):
   #-----------------------------------
      self.name_room = room_name
      self.size = size
      self.pos  = (0,0)
      self.status = 0

   def SetPosition(self, pos):
   #-----------------------------------
      self.pos = pos

   #Zeichnen der Räume für die Belegung
   def Draw_Room(self, dc):
   #-----------------------------------
      if self.status == 1:
         actPen_o = dc.GetPen()
         dc.SetPen(wx.Pen('black', 5, wx.SOLID))

      dc.DrawRectangle(self.pos[0], self.pos[1], self.size[0], self.size[1])
      dc.DrawText(self.name_room, self.pos[0], self.pos[1])

      if self.status == 1:
         dc.SetPen(actPen_o)

   #Prüfen ob Raum ausgewählt
   def HitTest(self, x_pos, y_pos):
   #-----------------------------------
      if x_pos > self.pos[0] and x_pos < (self.pos[0] + self.size[0]):
         if y_pos > self.pos[1] and y_pos < (self.pos[1] + self.size[1]):
            return True

      return False

   def Select_Room(self):
   #-----------------------------------
      self.status = 1

   def DeSelect_Room(self):
   #-----------------------------------
      self.status = 0
            
class DropSource(wx.Window):
   def __init__(self, parent_opl):
   #-----------------------------------
      wx.Window.__init__(self, parent_opl, size=(300,400), pos=(800,50))

      self.Bind(wx.EVT_PAINT, self.OnPaint)
      self.Bind(wx.EVT_SIZE, self.OnSize)
      self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
      self.Bind(wx.EVT_LEFT_UP, self.OnLeftUp)

      self.rooms_list = [Room_draw('W1', (90, 160)), Room_draw('W2', (90, 110))]
      
      #Position der Räume festlegen
      x_pos = 100
      y_pos = 100
      for room_each in self.rooms_list:
         room_each.SetPosition((x_pos, y_pos))
         x_pos = x_pos + 100

      self.dragRoom_o = None

   def OnPaint(self, event):
   #-----------------------------------
      dc = wx.PaintDC(self)

      dc.SetPen(wx.Pen('black', 1, wx.SOLID))
      font = wx.SystemSettings.GetFont(wx.SYS_DEFAULT_GUI_FONT)
      dc.SetFont(font)

      # alle Räume darstellen
      for room_each in self.rooms_list:
         room_each.Draw_Room(dc)

   def OnSize(self, event):
   #-----------------------------------
      size = self.GetParent().GetClientSize()
      self.SetSize(size)

   def OnLeftDown(self, event):
   #-----------------------------------
      # wurde ein Rechteck getroffen ?
      x_pos = event.GetX()
      y_pos = event.GetY()

      for room_each in self.rooms_list:
         if room_each.HitTest(x_pos, y_pos):
            room_each.Select_Room()
            self.dragRoom_one = room_each
         else:
            room_each.DeSelect_Room()
            
      linesdata = cPickle.dumps(room_each, 1)
            
      bdata = wx.CustomDataObject("DoodleLines")
      bdata.SetData(linesdata)
      
      dropSource = wx.DropSource(self)
      dropSource.SetData(bdata)
      
      dropSource.DoDragDrop(wx.Drag_AllowMove)

      # neu darstellen
      self.Refresh()

   def OnLeftUp(self, event):
   #-----------------------------------
      if self.dragRoom_one != None:
         # Ziehen beenden
         self.dragRoom_one = None
         self.Refresh()
     
class W1(wx.Window):
   def __init__(self, parent):
      wx.Window.__init__(self, parent, pos=(0, 0), size=(90, 160), style=wx.SUNKEN_BORDER)
      
      dt = DropTarget(self)
      self.SetDropTarget(dt)
         
nubie2001
User
Beiträge: 14
Registriert: Samstag 9. Januar 2010, 19:19

Soo kleines Update von mir ich habs zumindest hingerkriegt schonmal 2 Rechtecke in einem Fenster zu zeichnen, welche ich auch makieren kann. Allerdings hab ich jetzt das Problem dass ich diese nicht per Drag & Drop in das andere Fenster ziehen kann, wo sie eigentlich dargestellt werden sollen.

Jemand vielleicht ne Idee wie ich Rechtecke die mit nem Device Context gezeichnet werde, so modifizier, dass ich diese von einem CustomDataObject draggen bzw droppen kann? Oder vielleicht sogar mit einem BitmapDataObject?

Besten Dank
Antworten