Improved matplotlib graphic debug panel implementation
authorLaurent Bessard
Sun, 17 Feb 2013 23:47:41 +0100
changeset 929 c562031146e4
parent 928 a94e7fea7051
child 930 4be515ac635e
Improved matplotlib graphic debug panel implementation
controls/DebugVariablePanel.py
images/delete_graph.png
images/force.png
images/maximize_graph.png
images/minimize_graph.png
images/plcopen_icons.svg
images/release.png
--- a/controls/DebugVariablePanel.py	Tue Feb 12 23:19:57 2013 +0100
+++ b/controls/DebugVariablePanel.py	Sun Feb 17 23:47:41 2013 +0100
@@ -335,10 +335,7 @@
                 if self.ParentControl.Is3DCanvas():
                     if y > height / 2:
                         target_idx += 1
-                    if len(values) > 2 and values[2] == "move":
-                        self.ParentWindow.MoveGraph(values[0], target_idx)
-                    else:
-                        self.ParentWindow.InsertValue(values[0], target_idx, force=True)
+                    self.ParentWindow.InsertValue(values[0], target_idx, force=True)
                 else:
                     rect = self.ParentControl.GetAxesBoundingBox()
                     if rect.InsideXY(x, y):
@@ -349,14 +346,8 @@
                     else:
                         if y > height / 2:
                             target_idx += 1
-                        if len(values) > 2 and values[2] == "move":
-                            self.ParentWindow.MoveGraph(values[0], target_idx)
-                        else:
-                            self.ParentWindow.InsertValue(values[0], target_idx, force=True)
-            elif len(values) > 2 and values[2] == "move":
-                self.ParentWindow.MoveGraph(values[0])
-            else:
-                self.ParentWindow.InsertValue(values[0], force=True)
+                        self.ParentWindow.InsertValue(values[0], target_idx, force=True)
+            self.ParentWindow.InsertValue(values[0], force=True)
     
     def OnLeave(self):
         if self.ParentControl is not None:
@@ -422,13 +413,6 @@
             self.ParentWindow = window
             self.Items = items
             
-            self.MainSizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
-            self.AddViewer()
-            self.AddButtons()
-            self.MainSizer.AddGrowableCol(0)
-            
-            self.SetSizer(self.MainSizer)
-        
         def __del__(self):
             self.ParentWindow = None
             
@@ -567,10 +551,15 @@
         
     class DebugVariableText(DebugVariableViewer):
         
-        def AddViewer(self):
+        def __init__(self, parent, window, items=[]):
+            DebugVariableViewer.__init__(self, parent, window, items)
+        
+            main_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
+            main_sizer.AddGrowableCol(0)
+            
             viewer_sizer = wx.FlexGridSizer(cols=2, hgap=0, rows=1, vgap=0)
             viewer_sizer.AddGrowableCol(0)
-            self.MainSizer.AddSizer(viewer_sizer, border=5, 
+            main_sizer.AddSizer(viewer_sizer, border=5, 
                 flag=wx.ALL|wx.GROW|wx.ALIGN_CENTER_VERTICAL)
             
             variable_name_label = wx.TextCtrl(self, size=wx.Size(0, -1),
@@ -582,8 +571,7 @@
                 size=wx.Size(100, -1), style=wx.TE_READONLY|wx.TE_RIGHT|wx.NO_BORDER)
             viewer_sizer.AddWindow(self.ValueLabel, 
                 border=5, flag=wx.LEFT)
-        
-        def AddButtons(self):
+            
             button_sizer = wx.BoxSizer(wx.HORIZONTAL)
             self.MainSizer.AddSizer(button_sizer, border=5, 
                 flag=wx.TOP|wx.BOTTOM|wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
@@ -591,15 +579,17 @@
             buttons = [
                 ("ForceButton", "force", _("Force value")),
                 ("ReleaseButton", "release", _("Release value")),
-                ("DeleteButton", "remove_element", _("Remove debug variable"))]
+                ("DeleteButton", "delete_graph", _("Remove debug variable"))]
             
             for name, bitmap, help in buttons:
                 button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), 
-                      size=wx.Size(28, 28), style=wx.NO_BORDER)
+                      size=wx.Size(20, 20), style=wx.NO_BORDER)
                 button.SetToolTipString(help)
                 setattr(self, name, button)
                 self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
                 button_sizer.AddWindow(button, border=5, flag=wx.LEFT)
+            
+            self.SetSizer(main_sizer)
     
         def Refresh(self):
             self.ValueLabel.ChangeValue(self.Items[0].GetValue())
@@ -628,14 +618,87 @@
     HIGHLIGHT_PEN = wx.Pen(wx.Colour(0, 128, 255))
     HIGHLIGHT_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128))
     
+    if wx.Platform == '__WXMSW__':
+        popupclass = wx.PopupTransientWindow
+    else:
+        popupclass = wx.PopupWindow
+    
+    class PopupWithButtons(popupclass):
+    
+        def __init__(self, parent, window, item, style=wx.HORIZONTAL):
+            popupclass.__init__(self, parent, wx.NO_BORDER)
+            self.SetBackgroundColour(wx.WHITE)
+            
+            self.ParentWindow = window
+            self.Item = item
+            
+            main_sizer = wx.BoxSizer(style)
+            
+            if self.Item.IsForced():
+                buttons = [("ReleaseButton", "release", _("Release value"))]
+            
+            else:
+                buttons = [("ForceButton", "force", _("Force value"))]
+            buttons.append(("DeleteButton", "delete_graph", _("Remove debug variable")))
+            
+            for name, bitmap, help in buttons:
+                button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), 
+                      size=wx.Size(20, 20), style=wx.NO_BORDER)
+                button.SetToolTipString(help)
+                setattr(self, name, button)
+                self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
+                main_sizer.AddWindow(button)
+            main_sizer.Layout()
+            
+            self.SetSizer(main_sizer)
+            main_sizer.Fit(self)
+        
+        def GetItem(self):
+            return self.Item
+        
+        def OnForceButton(self, event):
+            wx.CallAfter(self.Parent.DismissButtons)
+            wx.CallAfter(self.Parent.ForceValue, self.Item)
+            event.Skip()
+        
+        def OnReleaseButton(self, event):
+            wx.CallAfter(self.Parent.DismissButtons)
+            wx.CallAfter(self.Parent.ReleaseValue, self.Item)
+            event.Skip()
+        
+        def OnDeleteButton(self, event):            
+            wx.CallAfter(self.Parent.DismissButtons)
+            wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent, self.Item)
+            event.Skip()
+    
+        def OnDismiss(self):
+            wx.CallAfter(self.Parent.DismissButtons)
+    
     class DraggingFigureCanvas(FigureCanvas):
         
         def __init__(self, parent, window, *args, **kwargs):
             FigureCanvas.__init__(self, parent, *args, **kwargs)
+            self.SetBackgroundColour(wx.WHITE)
+            self.Bind(wx.EVT_ENTER_WINDOW, self.OnEnterWindow)
+            self.Bind(wx.EVT_LEAVE_WINDOW, self.OnLeaveWindow)
+            self.Bind(wx.EVT_SIZE, self.OnResizeWindow)
             
             self.ParentWindow = window
             self.Highlight = HIGHLIGHT_NONE
-        
+            
+            self.ChangeSizeButton = wx.lib.buttons.GenBitmapToggleButton(self, 
+                    bitmap=GetBitmap("minimize_graph"), 
+                    size=wx.Size(20, 20), style=wx.NO_BORDER)
+            self.ChangeSizeButton.SetBitmapSelected(GetBitmap("maximize_graph"))
+            self.Bind(wx.EVT_BUTTON, self.OnChangeSizeButton, self.ChangeSizeButton)
+            
+            self.CloseButton = wx.lib.buttons.GenBitmapButton(self, 
+                    bitmap=GetBitmap("delete_graph"), 
+                    size=wx.Size(20, 20), style=wx.NO_BORDER)
+            self.Bind(wx.EVT_BUTTON, self.OnCloseButton, self.CloseButton)
+            
+            self.ShowButtons(False)
+            
         def SetHighlight(self, highlight):
             if self.Highlight != highlight:
                 self.Highlight = highlight
@@ -702,6 +765,43 @@
             
             self._isDrawn = True
             self.gui_repaint(drawDC=drawDC)
+        
+        def ShowButtons(self, show):
+            if show:
+                self.ChangeSizeButton.Show()
+                self.CloseButton.Show()
+            else:
+                self.ChangeSizeButton.Hide()
+                self.CloseButton.Hide()
+        
+        def OnEnterWindow(self, event):
+            self.ShowButtons(True)
+            event.Skip()
+            
+        def OnLeaveWindow(self, event):
+            x, y = event.GetPosition()
+            width, height = self.GetSize()
+            if (x <= 0 or x >= width - 1 or
+                y <= 0 or y >= height - 1):
+                self.ShowButtons(False)
+            event.Skip()
+        
+        def OnChangeSizeButton(self, event):
+            if self.ChangeSizeButton.GetToggle():
+                self.Parent.Minimize()
+            else:
+                self.Parent.Maximize()
+            event.Skip()
+        
+        def OnCloseButton(self, event):
+            wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent)
+            event.Skip()
+    
+        def OnResizeWindow(self, event):
+            width, height = self.GetSize()
+            self.ChangeSizeButton.SetPosition(wx.Point(width - 50, 5))
+            self.CloseButton.SetPosition(wx.Point(width - 25, 5))
+            event.Skip()
     
     class DebugVariableGraphic(DebugVariableViewer):
         
@@ -712,41 +812,35 @@
             self.CursorTick = None
             self.MouseStartPos = None
             self.StartCursorTick = None
-            
-            self.ResetGraphics()
-        
-        def AddViewer(self):
+            self.ItemButtons = None
+            
+            main_sizer = wx.BoxSizer(wx.VERTICAL)
+            
             self.Figure = matplotlib.figure.Figure(facecolor='w')
             
             self.Canvas = DraggingFigureCanvas(self, self.ParentWindow, -1, self.Figure)
             self.Canvas.SetMinSize(wx.Size(200, 200))
             self.Canvas.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self))
-            self.Canvas.Bind(wx.EVT_LEFT_DOWN, self.OnCanvasLeftDown)
+            self.Canvas.Bind(wx.EVT_MOUSEWHEEL, self.OnCanvasMouseWheel)
             self.Canvas.mpl_connect('button_press_event', self.OnCanvasButtonPressed)
             self.Canvas.mpl_connect('motion_notify_event', self.OnCanvasMotion)
             self.Canvas.mpl_connect('button_release_event', self.OnCanvasButtonReleased)
             self.Canvas.mpl_connect('scroll_event', self.OnCanvasScroll)
             
-            self.MainSizer.AddWindow(self.Canvas, flag=wx.GROW)
-        
-        def AddButtons(self):
-            button_sizer = wx.BoxSizer(wx.VERTICAL)
-            self.MainSizer.AddSizer(button_sizer, border=5, 
-                flag=wx.RIGHT|wx.ALIGN_CENTER_VERTICAL)
-            
-            buttons = [
-                ("ForceButton", "force", _("Force value")),
-                ("ReleaseButton", "release", _("Release value")),
-                ("SplitButton", "split", _("Split graphs")),
-                ("DeleteButton", "remove_element", _("Remove debug variable"))]
-            
-            for name, bitmap, help in buttons:
-                button = wx.lib.buttons.GenBitmapButton(self, bitmap=GetBitmap(bitmap), 
-                      size=wx.Size(28, 28), style=wx.NO_BORDER)
-                button.SetToolTipString(help)
-                setattr(self, name, button)
-                self.Bind(wx.EVT_BUTTON, getattr(self, "On" + name), button)
-                button_sizer.AddWindow(button, border=5, flag=wx.LEFT)
+            main_sizer.AddWindow(self.Canvas, 1, flag=wx.GROW)
+            self.SetSizer(main_sizer)
+            
+            self.ResetGraphics()
+        
+        def Minimize(self):
+            self.Canvas.SetMinSize(wx.Size(200, 100))
+            self.Figure.subplotpars.update(bottom=0.20)
+            self.ParentWindow.RefreshGraphicsSizer()
+        
+        def Maximize(self):
+            self.Canvas.SetMinSize(wx.Size(200, 200))
+            self.Figure.subplotpars.update(bottom=0.1)
+            self.ParentWindow.RefreshGraphicsSizer()
         
         def GetAxesBoundingBox(self, absolute=False):
             bbox = self.Canvas.GetAxesBoundingBox()
@@ -756,29 +850,33 @@
                 bbox.y += yw
             return bbox
         
-        def OnCanvasLeftDown(self, event):
+        def OnCanvasButtonPressed(self, event):
             if not self.Is3DCanvas():
-                x, y = event.GetPosition()
                 width, height = self.Canvas.GetSize()
+                x, y = event.x, height - event.y
                 rect = self.GetAxesBoundingBox()
                 if rect.InsideXY(x, y):
                     self.MouseStartPos = wx.Point(x, y)
                 if self.Legend is not None:
-                    item_idx = None
-                    for i, t in enumerate(self.Legend.get_texts()):
-                        (x0, y0), (x1, y1) = t.get_window_extent().get_points()
-                        rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
-                        if rect.InsideXY(x, y):
-                            item_idx = i
-                            break
-                    if item_idx is not None:
-                        self.DoDragDrop(item_idx)
-                        return
-            event.Skip()
-        
-        def OnCanvasButtonPressed(self, event):
-            if not self.Is3DCanvas():
-                if event.button == 1:
+                    texts = self.Legend.get_texts()
+                elif len(self.AxesLabels) > 0:
+                    texts = self.AxesLabels
+                else:
+                    texts = []
+                item_idx = None
+                for i, t in enumerate(texts):
+                    (x0, y0), (x1, y1) = t.get_window_extent().get_points()
+                    rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
+                    if rect.InsideXY(x, y):
+                        item_idx = i
+                        break
+                if item_idx is not None:
+                    self.Canvas.ShowButtons(False)
+                    self.DismissButtons()
+                    xw, yw = self.GetPosition()
+                    self.ParentWindow.StartDragNDrop(self, 
+                        self.Items[item_idx], x + xw, y + yw, x + xw, y + yw)
+                elif event.button == 1:
                     self.HandleCursorMove(event)
                 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
                     width, height = self.Canvas.GetSize()
@@ -799,8 +897,8 @@
                 self.StartCursorTick = None
         
         def OnCanvasMotion(self, event):
+            width, height = self.Canvas.GetSize()
             if self.ParentWindow.IsDragging():
-                width, height = self.Canvas.GetSize()
                 xw, yw = self.GetPosition()
                 self.ParentWindow.MoveDragNDrop(
                     xw + event.x, 
@@ -810,10 +908,10 @@
                     if event.inaxes == self.Axes:
                         if self.MouseStartPos is not None:
                             self.HandleCursorMove(event)
-                    elif self.MouseStartPos is not None:
+                    elif self.MouseStartPos is not None and len(self.Items) == 1:
                         xw, yw = self.GetPosition()
-                        width, height = self.Canvas.GetSize()
                         self.ParentWindow.StartDragNDrop(self, 
+                            self.Items[0],
                             event.x + xw, height - event.y + yw, 
                             self.MouseStartPos.x + xw, self.MouseStartPos.y + yw)
                 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL:
@@ -822,11 +920,33 @@
                     self.ParentWindow.SetCanvasPosition(
                         self.StartCursorTick + (self.MouseStartPos.x - event.x) *
                         (end_tick - start_tick) / rect.width)
+                elif event.button is None:
+                    if self.Legend is not None:
+                        labels = self.Legend.get_texts()
+                        texts = zip(labels, [wx.HORIZONTAL] * len(labels))
+                    elif len(self.AxesLabels) > 0:
+                        texts = zip(self.AxesLabels, [wx.HORIZONTAL, wx.VERTICAL])
+                    else:
+                        texts = []
+                    item_idx = None
+                    item_style = None
+                    for i, (t, style) in enumerate(texts):
+                        (x0, y0), (x1, y1) = t.get_window_extent().get_points()
+                        rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0)
+                        if rect.InsideXY(event.x, height - event.y):
+                            item_idx = i
+                            item_style = style
+                            break
+                    if item_idx is not None:
+                        self.PopupButtons(item_idx, rect, item_style)
+                        return 
+                    if self.ItemButtons is not None:
+                        self.DismissButtons()
         
         def OnCanvasDragging(self, x, y, refresh=True):
             width, height = self.Canvas.GetSize()
             bbox = self.Canvas.GetAxesBoundingBox()
-            if bbox.InsideXY(x, y):
+            if bbox.InsideXY(x, y) and not self.Is3DCanvas():
                 rect = wx.Rect(bbox.x, bbox.y, bbox.width / 2, bbox.height)
                 if rect.InsideXY(x, y):
                     self.Canvas.SetHighlight(HIGHLIGHT_LEFT)
@@ -853,6 +973,10 @@
                     tick = event.xdata
                 self.ParentWindow.ChangeRange(int(-event.step) / 3, tick)
         
+        def OnCanvasMouseWheel(self, event):
+            if self.ItemButtons is not None:
+                event.Skip()
+        
         def HandleCursorMove(self, event):
             start_tick, end_tick = self.ParentWindow.GetRange()
             cursor_tick = None
@@ -871,11 +995,45 @@
                 self.ParentWindow.SetCursorTick(cursor_tick)
         
         def DoDragDrop(self, item_idx):
+            self.Canvas.ShowButtons(False)
+            self.DismissButtons()
             data = wx.TextDataObject(str((self.Items[item_idx].GetVariable(), "debug", "move")))
             dragSource = wx.DropSource(self.Canvas)
             dragSource.SetData(data)
             dragSource.DoDragDrop()
         
+        def PopupButtons(self, item_idx, rect, style=wx.HORIZONTAL):
+            item = self.Items[item_idx]
+            if self.ItemButtons is not None and item != self.ItemButtons.GetItem():
+                self.DismissButtons()
+            if self.ItemButtons is None:
+                
+                self.ItemButtons = PopupWithButtons(self, self.ParentWindow, item, style)
+                
+                # Show the popup right below or above the button
+                # depending on available screen space...
+                w, h = self.ItemButtons.GetSize()
+                if style == wx.HORIZONTAL:
+                    x = rect.x + rect.width
+                    y = rect.y + (rect.height - h) / 2
+                else:
+                    x = rect.x + (rect.width - w ) / 2
+                    y = rect.y - h
+                self.ItemButtons.SetPosition(self.ClientToScreen((x, y)))
+                
+                if wx.Platform == '__WXMSW__':
+                    self.ItemButtons.Popup()
+                else:
+                    self.ItemButtons.Show()
+        
+        def DismissButtons(self):
+            if self.ItemButtons:
+                if wx.Platform == '__WXMSW__':
+                    self.ItemButtons.Dismiss()
+                else:
+                    self.ItemButtons.Destroy()
+                self.ItemButtons = None
+        
         def OnAxesMotion(self, event):
             if self.Is3DCanvas():
                 current_time = gettime()
@@ -883,26 +1041,6 @@
                     self.LastMotionTime = current_time
                     Axes3D._on_move(self.Axes, event)
         
-        def OnSplitButton(self, event):
-            if len(self.Items) == 2 or self.GraphType == GRAPH_ORTHOGONAL:
-                wx.CallAfter(self.ParentWindow.SplitGraphs, self)
-            else:
-                menu = wx.Menu(title='')
-                for item in self.Items:
-                    new_id = wx.NewId()
-                    AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, 
-                        text=item.GetVariable(self.ParentWindow.GetVariableNameMask()))
-                    self.Bind(wx.EVT_MENU, 
-                        self.GetSplitGraphMenuFunction(item),
-                        id=new_id)
-                
-                new_id = wx.NewId()
-                AppendMenu(menu, help='', id=new_id, kind=wx.ITEM_NORMAL, text=_("All"))
-                self.Bind(wx.EVT_MENU, self.OnSplitAllGraphsMenu, id=new_id)
-                
-                self.PopupMenu(menu)
-            event.Skip()
-        
         def ResetGraphics(self):
             self.Figure.clear()
             if self.Is3DCanvas():
@@ -913,25 +1051,45 @@
                 self.Axes.mouse_init()
             else:
                 self.Axes = self.Figure.gca()
-                self.Figure.subplotpars.update(top=0.95)
-                if self.GraphType == GRAPH_ORTHOGONAL:
-                    self.Figure.subplotpars.update(bottom=0.15)
+                self.Figure.subplotpars.update(top=0.95, right=0.95)
             self.Plots = []
             self.VLine = None
             self.HLine = None
             self.Legend = None
             self.Labels = []
-            if self.GraphType == GRAPH_PARALLEL:
+            self.AxesLabels = []
+            if self.GraphType == GRAPH_PARALLEL or self.Is3DCanvas():
                 num_item = len(self.Items)
+                if not self.Is3DCanvas():
+                    text_func = self.Axes.text
+                else:
+                    text_func = self.Axes.text2D
                 for idx in xrange(num_item):
                     self.Labels.append(
-                        self.Axes.text(0.95, 0.05 + (num_item - idx - 1) * 0.1, 
-                                       "", size = 'large', 
-                                       horizontalalignment='right',
-                                       color = color_cycle[idx % len(color_cycle)],
-                                       transform = self.Axes.transAxes))
-            self.SplitButton.Enable(len(self.Items) > 1)
-        
+                        text_func(0.95, 0.05 + (num_item - idx - 1) * 0.1, 
+                                  "", size='large', 
+                                  horizontalalignment='right',
+                                  color=color_cycle[idx % len(color_cycle)],
+                                  transform=self.Axes.transAxes))
+            else:
+                self.AxesLabels.append(
+                    self.Axes.text(0.1, 0.05, "", size='small',
+                                   transform=self.Axes.transAxes))
+                self.Labels.append(
+                    self.Axes.text(0.95, 0.05, "", size='large',
+                                   horizontalalignment='right',
+                                   transform=self.Axes.transAxes))
+                self.AxesLabels.append(
+                    self.Axes.text(0.05, 0.1, "", size='small',
+                                   rotation='vertical',
+                                   verticalalignment='bottom',
+                                   transform=self.Axes.transAxes))
+                self.Labels.append(
+                    self.Axes.text(0.05, 0.95, "", size='large',
+                                   rotation='vertical',
+                                   verticalalignment='top',
+                                   transform=self.Axes.transAxes))
+            
         def AddItem(self, item):
             DebugVariableViewer.AddItem(self, item)
             self.ResetGraphics()
@@ -939,6 +1097,8 @@
         def RemoveItem(self, item):
             DebugVariableViewer.RemoveItem(self, item)
             if not self.IsEmpty():
+                if len(self.Items) == 1:
+                    self.GraphType = GRAPH_PARALLEL
                 self.ResetGraphics()
         
         def UnregisterObsoleteData(self):
@@ -1069,8 +1229,7 @@
                 values, forced = apply(zip, [item.GetValue(self.CursorTick) for item in self.Items])
             else:
                 values, forced = apply(zip, [(item.GetValue(), item.IsForced()) for item in self.Items])
-            names = [item.GetVariable(variable_name_mask) for item in self.Items]
-            labels = map(lambda x: "%s: %s" % x, zip(names, values))
+            labels = [item.GetVariable(variable_name_mask) for item in self.Items]
             colors = map(lambda x: {True: 'b', False: 'k'}[x], forced)
             if self.GraphType == GRAPH_PARALLEL:
                 if self.Legend is None:
@@ -1080,23 +1239,20 @@
                     self.Legend.get_title().set_fontsize('small')
                 for t, color in zip(self.Legend.get_texts(), colors):
                     t.set_color(color)
-                for label, value in zip(self.Labels, values):
-                    label.set_text(value)
             else:
                 self.Legend = None
-                self.Axes.set_xlabel(labels[0], fontdict={'size':'small','color':colors[0]})
-                self.Axes.set_ylabel(labels[1], fontdict={'size':'small','color':colors[1]})
-                if len(labels) > 2:
+                if self.Is3DCanvas():
+                    self.Axes.set_xlabel(labels[0], fontdict={'size':'small','color':colors[0]})
+                    self.Axes.set_ylabel(labels[1], fontdict={'size':'small','color':colors[1]})
                     self.Axes.set_zlabel(labels[2], fontdict={'size':'small','color':colors[2]})
+                else:
+                    for label, text, color in zip(self.AxesLabels, labels, colors):
+                        label.set_text(text)
+                        label.set_color(color)
+            for label, value in zip(self.Labels, values):
+                label.set_text(value)
+                        
             self.Canvas.draw()
-        
-        def GetSplitGraphMenuFunction(self, item):
-            def SplitGraphFunction(event):
-                self.ParentWindow.SplitGraphs(self, item)
-            return SplitGraphFunction
-        
-        def OnSplitAllGraphsMenu(self, event):
-            self.ParentWindow.SplitGraphs(self)
     
 class DebugVariablePanel(wx.Panel, DebugViewer):
     
@@ -1312,8 +1468,15 @@
                 panel.SetCursorTick(self.CursorTick)
         self.ForceRefresh()
     
-    def StartDragNDrop(self, panel, x_mouse, y_mouse, x_mouse_start, y_mouse_start):
-        self.DraggingAxesPanel = panel
+    def StartDragNDrop(self, panel, item, x_mouse, y_mouse, x_mouse_start, y_mouse_start):
+        if len(panel.GetItems()) > 1:
+            self.DraggingAxesPanel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
+            self.DraggingAxesPanel.SetCursorTick(self.CursorTick)
+            width, height = panel.GetSize()
+            self.DraggingAxesPanel.SetMinSize(wx.Size(width, height))
+            self.DraggingAxesPanel.SetPosition(wx.Point(0, -height))
+        else:
+            self.DraggingAxesPanel = panel
         self.DraggingAxesBoundingBox = panel.GetAxesBoundingBox(absolute=True)
         self.DraggingAxesMousePos = wx.Point(
             x_mouse_start - self.DraggingAxesBoundingBox.x, 
@@ -1323,11 +1486,13 @@
     def MoveDragNDrop(self, x_mouse, y_mouse):
         self.DraggingAxesBoundingBox.x = x_mouse - self.DraggingAxesMousePos.x
         self.DraggingAxesBoundingBox.y = y_mouse - self.DraggingAxesMousePos.y
-        for panel in self.GraphicPanels:
+        for idx, panel in enumerate(self.GraphicPanels):
             x, y = panel.GetPosition()
             width, height = panel.Canvas.GetSize()
             rect = wx.Rect(x, y, width, height)
-            if rect.InsideXY(x_mouse, y_mouse):
+            if (rect.InsideXY(x_mouse, y_mouse) or 
+                idx == 0 and y_mouse < 0 or
+                idx == len(self.GraphicPanels) - 1 and y_mouse > panel.GetPosition()[1]):
                 panel.OnCanvasDragging(x_mouse - x, y_mouse - y, False)
             else:
                 panel.OnCanvasLeave(False)
@@ -1360,7 +1525,6 @@
                     if y_mouse > yw + height / 2:
                         idx += 1
                     wx.CallAfter(self.MoveGraph, variable, idx)
-                    return
                 else:
                     rect = panel.GetAxesBoundingBox(True)
                     if rect.InsideXY(x_mouse, y_mouse):
@@ -1372,19 +1536,44 @@
                         if y_mouse > yw + height / 2:
                             idx += 1
                         wx.CallAfter(self.MoveGraph, variable, idx)
-                break
+                self.ForceRefresh()
+                return 
+        width, height = self.GraphicsWindow.GetVirtualSize()
+        rect = wx.Rect(0, 0, width, height)
+        if rect.InsideXY(x_mouse, y_mouse):
+            wx.CallAfter(self.MoveGraph, variable, len(self.GraphicPanels))
         self.ForceRefresh()
     
     def RefreshView(self, only_values=False):
         if USE_MPL:
             self.RefreshCanvasPosition()
             
+            width, height = self.GraphicsWindow.GetVirtualSize()
+            bitmap = wx.EmptyBitmap(width, height)
+            dc = wx.BufferedPaintDC(self.GraphicsWindow, bitmap)
+            dc.Clear()
+            dc.BeginDrawing()
+            if self.DraggingAxesPanel is not None:
+                destBBox = self.DraggingAxesBoundingBox
+                srcBBox = self.DraggingAxesPanel.GetAxesBoundingBox()
+                
+                srcBmp = _convert_agg_to_wx_bitmap(self.DraggingAxesPanel.Canvas.get_renderer(), None)
+                srcDC = wx.MemoryDC()
+                srcDC.SelectObject(srcBmp)
+                    
+                dc.Blit(destBBox.x, destBBox.y, 
+                        int(destBBox.width), int(destBBox.height), 
+                        srcDC, srcBBox.x, srcBBox.y)
+            dc.EndDrawing()
+            
             if not self.Fixed or self.Force:
                 self.Force = False
                 refresh_graphics = True
             else:
                 refresh_graphics = False
             
+            if self.DraggingAxesPanel is not None and self.DraggingAxesPanel not in self.GraphicPanels:
+                self.DraggingAxesPanel.Refresh()
             for panel in self.GraphicPanels:
                 if isinstance(panel, DebugVariableGraphic):
                     panel.Refresh(refresh_graphics)
@@ -1738,39 +1927,6 @@
             self.RefreshGraphicsSizer()
             self.ForceRefresh()
     
-    def SplitGraphs(self, source_panel, item=None):
-        source_idx = self.GetViewerIndex(source_panel)
-        if source_idx is not None:
-            
-            if item is None:
-                source_items = source_panel.GetItems()
-                while len(source_items) > 1:
-                    item = source_items.pop(-1)
-                    if item.IsNumVariable():
-                        panel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
-                        if self.CursorTick is not None:
-                            panel.SetCursorTick(self.CursorTick)
-                    else:
-                        panel = DebugVariableText(self.GraphicsWindow, self, [item])
-                    self.GraphicPanels.insert(source_idx + 1, panel)
-                if isinstance(source_panel, DebugVariableGraphic):
-                    source_panel.GraphType = GRAPH_PARALLEL
-                    source_panel.ResetGraphics()
-                    
-            else:
-                source_panel.RemoveItem(item)
-                if item.IsNumVariable():
-                    panel = DebugVariableGraphic(self.GraphicsWindow, self, [item], GRAPH_PARALLEL)
-                    if self.CursorTick is not None:
-                        panel.SetCursorTick(self.CursorTick)
-                else:
-                    panel = DebugVariableText(self.GraphicsWindow, self, [item])
-                self.GraphicPanels.insert(source_idx + 1, panel)
-            
-            self.ResetVariableNameMask()
-            self.RefreshGraphicsSizer()
-            self.ForceRefresh()
-    
     def MergeGraphs(self, source, target_idx, merge_type, force=False):
         source_item = None
         source_panel = None
Binary file images/delete_graph.png has changed
Binary file images/force.png has changed
Binary file images/maximize_graph.png has changed
Binary file images/minimize_graph.png has changed
--- a/images/plcopen_icons.svg	Tue Feb 12 23:19:57 2013 +0100
+++ b/images/plcopen_icons.svg	Sun Feb 17 23:47:41 2013 +0100
@@ -10034,6 +10034,787 @@
          style="stop-color:#eeeeec;stop-opacity:1"
          id="stop697-9" />
     </linearGradient>
+    <linearGradient
+       id="linearGradient3234"
+       y2="22"
+       gradientUnits="userSpaceOnUse"
+       x2="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,1.0526,0.36108)"
+       y1="3"
+       x1="11.192">
+      <stop
+         id="stop3205"
+         style="stop-color:#777976"
+         offset="0" />
+      <stop
+         id="stop3207"
+         style="stop-color:#565755"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3231"
+       y2="32.702"
+       xlink:href="#linearGradient7916"
+       gradientUnits="userSpaceOnUse"
+       x2="16.330999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.0772,7.6731)"
+       y1="13.023"
+       x1="36.011002" />
+    <linearGradient
+       id="linearGradient7916">
+      <stop
+         id="stop7918"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop7920"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3228"
+       y2="32.702"
+       xlink:href="#linearGradient7916"
+       gradientUnits="userSpaceOnUse"
+       x2="16.330999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.3874,7.8369)"
+       y1="20.584"
+       x1="28.448999" />
+    <linearGradient
+       id="linearGradient3013-6">
+      <stop
+         id="stop3015"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop3017"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="20.584"
+       x1="28.448999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.3874,7.8369)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3023"
+       xlink:href="#linearGradient7916"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5528"
+       y2="39.924"
+       gradientUnits="userSpaceOnUse"
+       x2="21.780001"
+       gradientTransform="matrix(0.45455,0,0,0.45902,-3.3637,-2.6312)"
+       y1="8.5762997"
+       x1="21.865999">
+      <stop
+         id="stop2783-3"
+         style="stop-color:#505050"
+         offset="0" />
+      <stop
+         id="stop6301-8"
+         style="stop-color:#6e6e6e"
+         offset=".13216" />
+      <stop
+         id="stop2785-2"
+         style="stop-color:#8c8c8c"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5525"
+       y2="15.044"
+       gradientUnits="userSpaceOnUse"
+       x2="16.075001"
+       gradientTransform="matrix(0.41935,0,0,0.41379,-2.4838,-1.431)"
+       y1="9.0734997"
+       x1="16.034">
+      <stop
+         id="stop3692-4"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop3694-1"
+         style="stop-color:#fff;stop-opacity:.46875"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5522"
+       y2="40"
+       gradientUnits="userSpaceOnUse"
+       x2="24"
+       gradientTransform="matrix(0.36842,0,0,0.48002992,-0.8421,-4.2013409)"
+       y1="13"
+       x1="24">
+      <stop
+         id="stop6459-0"
+         style="stop-color:#fff;stop-opacity:.94118"
+         offset="0" />
+      <stop
+         id="stop6461-6"
+         style="stop-color:#fff;stop-opacity:.70588"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3234-2"
+       y2="22"
+       gradientUnits="userSpaceOnUse"
+       x2="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,1.0526,0.36108)"
+       y1="3"
+       x1="11.192">
+      <stop
+         id="stop3205-6"
+         style="stop-color:#777976"
+         offset="0" />
+      <stop
+         id="stop3207-8"
+         style="stop-color:#565755"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient3231-1"
+       y2="32.702"
+       xlink:href="#linearGradient7916-4"
+       gradientUnits="userSpaceOnUse"
+       x2="16.330999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.0772,7.6731)"
+       y1="13.023"
+       x1="36.011002" />
+    <linearGradient
+       id="linearGradient7916-4">
+      <stop
+         id="stop7918-4"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop7920-5"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="20.584"
+       x1="28.448999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.3874,7.8369)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3023-8"
+       xlink:href="#linearGradient7916-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient5800">
+      <stop
+         id="stop5802"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop5804"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="20.584"
+       x1="28.448999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.3874,7.8369)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5810"
+       xlink:href="#linearGradient7916-4"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3234-5"
+       y2="22"
+       gradientUnits="userSpaceOnUse"
+       x2="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,1.0526,0.36108)"
+       y1="3"
+       x1="11.192">
+      <stop
+         id="stop3205-8"
+         style="stop-color:#777976"
+         offset="0" />
+      <stop
+         id="stop3207-1"
+         style="stop-color:#565755"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="22"
+       x2="11.192"
+       y1="3"
+       x1="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,-0.9473,-1.63892)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5895"
+       xlink:href="#linearGradient3234-5"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3234-1"
+       y2="22"
+       gradientUnits="userSpaceOnUse"
+       x2="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,1.0526,0.36108)"
+       y1="3"
+       x1="11.192">
+      <stop
+         id="stop3205-0"
+         style="stop-color:#777976"
+         offset="0" />
+      <stop
+         id="stop3207-81"
+         style="stop-color:#565755"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="22"
+       x2="11.192"
+       y1="3"
+       x1="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,58.6726,221.75818)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5925"
+       xlink:href="#linearGradient3234-1"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3234-0"
+       y2="22"
+       gradientUnits="userSpaceOnUse"
+       x2="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,1.0526,0.36108)"
+       y1="3"
+       x1="11.192">
+      <stop
+         id="stop3205-5"
+         style="stop-color:#777976"
+         offset="0" />
+      <stop
+         id="stop3207-15"
+         style="stop-color:#565755"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="22"
+       x2="11.192"
+       y1="3"
+       x1="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,-0.9473,-1.63892)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient5925-1"
+       xlink:href="#linearGradient3234-0"
+       inkscape:collect="always" />
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3234-0"
+       id="linearGradient6750"
+       x1="89.006996"
+       y1="228.31628"
+       x2="81.401299"
+       y2="234.28734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96201841,0,0,1.9879765,-206.55613,-188.7245)" />
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="20.584"
+       x1="28.448999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.3874,7.8369)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient3023-80"
+       xlink:href="#linearGradient7916-5"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient7916-5">
+      <stop
+         id="stop7918-47"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop7920-7"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="20.584"
+       x1="28.448999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,39.784853,228.1471)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6767"
+       xlink:href="#linearGradient7916-5"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient3231-16"
+       y2="32.702"
+       xlink:href="#linearGradient7916-9"
+       gradientUnits="userSpaceOnUse"
+       x2="16.330999"
+       gradientTransform="matrix(0.30773,-0.32448,0.30773,0.32448,-7.0772,7.6731)"
+       y1="13.023"
+       x1="36.011002" />
+    <linearGradient
+       id="linearGradient7916-9">
+      <stop
+         id="stop7918-2"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop7920-4"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="13.023"
+       x1="36.011002"
+       gradientTransform="matrix(0.44717834,-0.00406845,-0.01961605,0.44676642,-134.39116,258.96099)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6801"
+       xlink:href="#linearGradient7916-9"
+       inkscape:collect="always" />
+    <linearGradient
+       y2="32.702"
+       x2="16.330999"
+       y1="13.023"
+       x1="36.011002"
+       gradientTransform="matrix(0.44717834,-0.00406845,-0.01961605,0.44676642,-78.185829,253.58647)"
+       gradientUnits="userSpaceOnUse"
+       id="linearGradient6801-3"
+       xlink:href="#linearGradient7916-9-1"
+       inkscape:collect="always" />
+    <linearGradient
+       id="linearGradient7916-9-1">
+      <stop
+         id="stop7918-2-7"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop7920-4-4"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       inkscape:collect="always"
+       xlink:href="#linearGradient3234-0-5"
+       id="linearGradient6750-4"
+       x1="89.006996"
+       y1="228.31628"
+       x2="81.401299"
+       y2="234.28734"
+       gradientUnits="userSpaceOnUse"
+       gradientTransform="matrix(0.96236471,0,0,5.1478585,-150.36967,-920.8619)" />
+    <linearGradient
+       id="linearGradient3234-0-5"
+       y2="22"
+       gradientUnits="userSpaceOnUse"
+       x2="11.192"
+       gradientTransform="matrix(0.57895,0,0,0.61111,1.0526,0.36108)"
+       y1="3"
+       x1="11.192">
+      <stop
+         id="stop3205-5-5"
+         style="stop-color:#777976"
+         offset="0" />
+      <stop
+         id="stop3207-15-6"
+         style="stop-color:#565755"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5528-8"
+       y2="39.924"
+       gradientUnits="userSpaceOnUse"
+       x2="21.780001"
+       gradientTransform="matrix(0.45455,0,0,0.45902,-3.3637,-2.6312)"
+       y1="8.5762997"
+       x1="21.865999">
+      <stop
+         id="stop2783-3-7"
+         style="stop-color:#505050"
+         offset="0" />
+      <stop
+         id="stop6301-8-3"
+         style="stop-color:#6e6e6e"
+         offset=".13216" />
+      <stop
+         id="stop2785-2-9"
+         style="stop-color:#8c8c8c"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5525-3"
+       y2="15.044"
+       gradientUnits="userSpaceOnUse"
+       x2="16.075001"
+       gradientTransform="matrix(0.41935,0,0,0.41379,-2.4838,-1.431)"
+       y1="9.0734997"
+       x1="16.034">
+      <stop
+         id="stop3692-4-8"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop3694-1-8"
+         style="stop-color:#fff;stop-opacity:.46875"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient5522-9"
+       y2="40"
+       gradientUnits="userSpaceOnUse"
+       x2="24"
+       gradientTransform="matrix(0.36842,0,0,0.48002992,-0.8421,-4.2013409)"
+       y1="13"
+       x1="24">
+      <stop
+         id="stop6459-0-4"
+         style="stop-color:#fff;stop-opacity:.94118"
+         offset="0" />
+      <stop
+         id="stop6461-6-4"
+         style="stop-color:#fff;stop-opacity:.70588"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2627"
+       y2="32.161999"
+       gradientUnits="userSpaceOnUse"
+       x2="40.938"
+       gradientTransform="matrix(0.31434,0,0,0.37784,0.45678,-2.0038)"
+       y1="32.161999"
+       x1="6.7268">
+      <stop
+         id="stop2413-2"
+         style="stop-color:#fee7b1"
+         offset="0" />
+      <stop
+         id="stop2419-7"
+         style="stop-color:#ebd4b4"
+         offset=".25797" />
+      <stop
+         id="stop2421-0"
+         style="stop-color:#c8a775"
+         offset=".50797" />
+      <stop
+         id="stop2423-4"
+         style="stop-color:#b0935b"
+         offset=".74010" />
+      <stop
+         id="stop2415-5"
+         style="stop-color:#fcebbf"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2624"
+       y2="36.126999"
+       gradientUnits="userSpaceOnUse"
+       x2="30.875"
+       gradientTransform="matrix(0.27248,0,0,0.33859,1.4645,-0.49541)"
+       y1="25.002001"
+       x1="10.907">
+      <stop
+         id="stop9847-9"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop9849-1"
+         style="stop-color:#fff;stop-opacity:.49485"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2621"
+       y2="17"
+       gradientUnits="userSpaceOnUse"
+       x2="24.75"
+       gradientTransform="matrix(0.29412,0,0,0.60561,0.94118,-3.8915)"
+       y1="21"
+       x1="24.875">
+      <stop
+         id="stop5883-6"
+         style="stop-color:#d6c8a7"
+         offset="0" />
+      <stop
+         id="stop5885-9"
+         style="stop-color:#d0bd99"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2618"
+       y2="18.038"
+       gradientUnits="userSpaceOnUse"
+       x2="21.941999"
+       gradientTransform="matrix(0.27273,0,0,0.25159,1.4545,3.0971)"
+       y1="21.551001"
+       x1="21.941999">
+      <stop
+         id="stop12073-2"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop12075-6"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2608"
+       y2="17.469999"
+       gradientUnits="userSpaceOnUse"
+       x2="27.191999"
+       gradientTransform="matrix(0.26064,0,0,0.31489,1.7268,-1.0478)"
+       y1="2.9137001"
+       x1="10.651">
+      <stop
+         id="stop10593-98"
+         style="stop-color:#cad0c6"
+         offset="0" />
+      <stop
+         id="stop10599-5"
+         style="stop-color:#eaece9"
+         offset=".5" />
+      <stop
+         id="stop10595-9"
+         style="stop-color:#c5cbc0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2631"
+       y2="14.85"
+       xlink:href="#linearGradient6227"
+       gradientUnits="userSpaceOnUse"
+       x2="33.004002"
+       gradientTransform="translate(1.6824,1.125)"
+       y1="14.85"
+       x1="35.005001" />
+    <linearGradient
+       id="linearGradient6227">
+      <stop
+         id="stop6229"
+         offset="0" />
+      <stop
+         id="stop6231"
+         style="stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <filter
+       id="filter6251-1"
+       height="1.0951999"
+       width="1.4849"
+       color-interpolation-filters="sRGB"
+       y="-0.047579002"
+       x="-0.24243">
+      <feGaussianBlur
+         id="feGaussianBlur6253-62"
+         stdDeviation="0.24444548" />
+    </filter>
+    <linearGradient
+       id="linearGradient2629"
+       y2="13.789"
+       xlink:href="#linearGradient6227"
+       gradientUnits="userSpaceOnUse"
+       x2="35.021"
+       gradientTransform="translate(-19.533,1.7437)"
+       y1="13.789"
+       x1="32.127998" />
+    <linearGradient
+       id="linearGradient3056">
+      <stop
+         id="stop3058"
+         offset="0" />
+      <stop
+         id="stop3060"
+         style="stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <filter
+       id="filter3062"
+       height="1.0951999"
+       width="1.4849"
+       color-interpolation-filters="sRGB"
+       y="-0.047579002"
+       x="-0.24243">
+      <feGaussianBlur
+         id="feGaussianBlur3064"
+         stdDeviation="0.24444548" />
+    </filter>
+    <filter
+       id="filter3407"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur3409"
+         stdDeviation="0.82668559" />
+    </filter>
+    <linearGradient
+       id="linearGradient2627-1"
+       y2="32.161999"
+       gradientUnits="userSpaceOnUse"
+       x2="40.938"
+       gradientTransform="matrix(0.31434,0,0,0.37784,0.45678,-2.0038)"
+       y1="32.161999"
+       x1="6.7268">
+      <stop
+         id="stop2413-2-9"
+         style="stop-color:#fee7b1"
+         offset="0" />
+      <stop
+         id="stop2419-7-2"
+         style="stop-color:#ebd4b4"
+         offset=".25797" />
+      <stop
+         id="stop2421-0-6"
+         style="stop-color:#c8a775"
+         offset=".50797" />
+      <stop
+         id="stop2423-4-2"
+         style="stop-color:#b0935b"
+         offset=".74010" />
+      <stop
+         id="stop2415-5-8"
+         style="stop-color:#fcebbf"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2624-6"
+       y2="36.126999"
+       gradientUnits="userSpaceOnUse"
+       x2="30.875"
+       gradientTransform="matrix(0.27248,0,0,0.33859,1.4645,-0.49541)"
+       y1="25.002001"
+       x1="10.907">
+      <stop
+         id="stop9847-9-2"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop9849-1-5"
+         style="stop-color:#fff;stop-opacity:.49485"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2621-2"
+       y2="17"
+       gradientUnits="userSpaceOnUse"
+       x2="24.75"
+       gradientTransform="matrix(0.29412,0,0,0.60561,0.94118,-3.8915)"
+       y1="21"
+       x1="24.875">
+      <stop
+         id="stop5883-6-9"
+         style="stop-color:#d6c8a7"
+         offset="0" />
+      <stop
+         id="stop5885-9-5"
+         style="stop-color:#d0bd99"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2618-4"
+       y2="18.038"
+       gradientUnits="userSpaceOnUse"
+       x2="21.941999"
+       gradientTransform="matrix(0.27273,0,0,0.25159,1.4545,3.0971)"
+       y1="21.551001"
+       x1="21.941999">
+      <stop
+         id="stop12073-2-5"
+         style="stop-color:#fff"
+         offset="0" />
+      <stop
+         id="stop12075-6-4"
+         style="stop-color:#fff;stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2608-4"
+       y2="17.469999"
+       gradientUnits="userSpaceOnUse"
+       x2="27.191999"
+       gradientTransform="matrix(0.26064,0,0,0.31489,7.19555,-1.0478)"
+       y1="2.9137001"
+       x1="10.651">
+      <stop
+         id="stop10593-98-0"
+         style="stop-color:#cad0c6"
+         offset="0" />
+      <stop
+         id="stop10599-5-1"
+         style="stop-color:#eaece9"
+         offset=".5" />
+      <stop
+         id="stop10595-9-8"
+         style="stop-color:#c5cbc0"
+         offset="1" />
+    </linearGradient>
+    <linearGradient
+       id="linearGradient2631-3"
+       y2="14.85"
+       xlink:href="#linearGradient6227-9"
+       gradientUnits="userSpaceOnUse"
+       x2="33.004002"
+       gradientTransform="translate(1.6824,1.125)"
+       y1="14.85"
+       x1="35.005001" />
+    <linearGradient
+       id="linearGradient6227-9">
+      <stop
+         id="stop6229-2"
+         offset="0" />
+      <stop
+         id="stop6231-0"
+         style="stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <filter
+       id="filter6251-1-3"
+       height="1.0951999"
+       width="1.4849"
+       color-interpolation-filters="sRGB"
+       y="-0.047579002"
+       x="-0.24243">
+      <feGaussianBlur
+         id="feGaussianBlur6253-62-0"
+         stdDeviation="0.24444548" />
+    </filter>
+    <linearGradient
+       id="linearGradient2629-8"
+       y2="13.789"
+       xlink:href="#linearGradient6227-9"
+       gradientUnits="userSpaceOnUse"
+       x2="35.021"
+       gradientTransform="translate(-19.533,1.7437)"
+       y1="13.789"
+       x1="32.127998" />
+    <linearGradient
+       id="linearGradient5841">
+      <stop
+         id="stop5843"
+         offset="0" />
+      <stop
+         id="stop5845"
+         style="stop-opacity:0"
+         offset="1" />
+    </linearGradient>
+    <filter
+       id="filter5847"
+       height="1.0951999"
+       width="1.4849"
+       color-interpolation-filters="sRGB"
+       y="-0.047579002"
+       x="-0.24243">
+      <feGaussianBlur
+         id="feGaussianBlur5849"
+         stdDeviation="0.24444548" />
+    </filter>
+    <filter
+       id="filter3407-0"
+       color-interpolation-filters="sRGB">
+      <feGaussianBlur
+         id="feGaussianBlur3409-6"
+         stdDeviation="0.82668559" />
+    </filter>
   </defs>
   <sodipodi:namedview
      id="base"
@@ -10042,9 +10823,9 @@
      borderopacity="1.0"
      inkscape:pageopacity="0"
      inkscape:pageshadow="2"
-     inkscape:zoom="2.828427"
-     inkscape:cx="-47.411844"
-     inkscape:cy="-252.32358"
+     inkscape:zoom="1.9999999"
+     inkscape:cx="-254.99706"
+     inkscape:cy="-254.41678"
      inkscape:document-units="px"
      inkscape:current-layer="layer1"
      width="16px"
@@ -10058,7 +10839,8 @@
      inkscape:window-height="1056"
      inkscape:window-x="0"
      inkscape:window-y="24"
-     inkscape:window-maximized="1">
+     inkscape:window-maximized="1"
+     inkscape:snap-global="false">
     <inkscape:grid
        type="xygrid"
        id="grid2410"
@@ -10088,8 +10870,8 @@
        id="rect6804"
        width="18.335722"
        height="17"
-       x="-19.991972"
-       y="222" />
+       x="-88.491974"
+       y="221.75" />
     <rect
        inkscape:label="#rect3636"
        y="91"
@@ -14540,206 +15322,61 @@
     </g>
     <rect
        inkscape:label="#rect3636"
-       y="218.75002"
-       x="-90.750008"
-       height="24"
-       width="24"
+       y="259.12503"
+       x="-262.00003"
+       height="16"
+       width="16"
        id="force"
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <text
        xml:space="preserve"
        style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
-       x="-92.675056"
-       y="215.125"
+       x="-268.17508"
+       y="255.625"
        id="text3638-3-3-2-0-9-84"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0"
-         x="-92.675056"
-         y="215.125">%%force%%</tspan></text>
-    <g
-       transform="translate(-90.439343,218.49737)"
-       id="layer1-577">
-      <path
-         inkscape:connector-curvature="0"
-         id="path3435"
-         style="opacity:0.4;fill:url(#radialGradient2670)"
-         d="m 22,21.947 c 0,1.113 -4.4771,2.0152 -9.9999,2.0152 -5.5228,0 -9.9999,-0.90224 -9.9999,-2.0152 0,-1.11296 4.4771,-2.0152 9.9999,-2.0152 5.5228,0 9.9999,0.90224 9.9999,2.0152 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1314"
-         style="fill:url(#linearGradient2667);fill-rule:evenodd;stroke:#a2824e;stroke-linecap:round;stroke-linejoin:round"
-         d="m 4.5857,8.0018 c 4.8977,-0.72404 9.8475,-0.61163 14.828,0 0.60151,0 1.0857,0.52347 1.0857,1.1737 v 11.698 c 0,0.65024 -0.5155,1.0797 -1.0857,1.1737 -5.164,0.60626 -9.5919,0.60147 -14.828,0 -0.6955,-0.22 -1.086,-0.524 -1.086,-1.175 V 9.1742 c 0,-0.65024 0.48424,-1.1737 1.0857,-1.1737 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect6903"
-         style="opacity:0.38000039;fill:none;stroke:url(#linearGradient2654);stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.60109002"
-         d="m 5.0857,9.5 h 13.829 c 0.32446,0 0.58567,0.26635 0.58567,0.5972 v 10.396 c 0,0.33085 -0.23192,0.48359 -0.58567,0.5972 -4.5217,0.54696 -8.9848,0.5457 -13.829,0 C 4.76124,20.97679 4.50003,20.82405 4.50003,20.4932 V 10.0972 C 4.50003,9.76635 4.76124,9.5 5.0857,9.5 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1460"
-         style="fill:url(#linearGradient2651);fill-rule:evenodd"
-         d="m 4.7794,8.5385 c 4.8137,-0.78635 9.6274,-0.64629 14.441,0 0.4318,0 0.77943,0.386 0.77943,0.86548 v 1.499 c 0,0.47947 -0.34763,0.86548 -0.77943,0.86548 -5.0234,0.3715 -9.6454,0.23891 -14.441,0 -0.4314,0 -0.779,-0.386 -0.779,-0.865 v -1.499 c 0,-0.4795 0.3476,-0.8655 0.7794,-0.8655 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1593"
-         style="opacity:0.6;fill:none;stroke:url(#linearGradient2648);stroke-linecap:round;stroke-linejoin:round"
-         d="m 5.0455,10.5 h 13.909 c 0.30223,0 0.54554,0.1293 0.54554,0.2899 v 0.17499 c 0,0.1606 -0.24331,0.2899 -0.54554,0.2899 -4.593,0.31718 -9.238,0.33659 -13.909,0 -0.30223,0 -0.54554,-0.1293 -0.54554,-0.2899 V 10.7899 C 4.49996,10.6293 4.74327,10.5 5.0455,10.5 z" />
-      <rect
-         id="rect5887"
-         style="opacity:0.2;fill:#ffffff;fill-rule:evenodd;filter:url(#filter5957)"
-         transform="matrix(0.9234,0,0,0.57774,-7.227,-2.3565)"
-         rx="1.6077"
-         ry="1.6077"
-         height="16.971001"
-         width="2.8283999"
-         y="23.226"
-         x="14.594" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path6073"
-         style="opacity:0.3;fill:url(#radialGradient3446);fill-rule:evenodd"
-         d="M 10,9.25 C 10,9.9404 8.8807,10.5 7.5,10.5 6.1193,10.5 5,9.9404 5,9.25 5,8.5596 6.1193,8 7.5,8 8.8807,8 10,8.5596 10,9.25 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path6083"
-         style="opacity:0.3;fill:url(#radialGradient3444);fill-rule:evenodd"
-         d="M 19,9.25 C 19,9.9404 17.881,10.5 16.5,10.5 15.119,10.5 14,9.9404 14,9.25 14,8.5596 15.119,8 16.5,8 17.881,8 19,8.5596 19,9.25 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path2086"
-         style="fill:url(#linearGradient2638);fill-rule:evenodd;stroke:#888a85"
-         d="M 6.5022,8.6395 V 5.9354 c 0,-3.711 2.1522,-5.4739 5.4773,-5.4276 3.3431,0.046344 5.5183,1.673 5.5183,5.4276 v 2.822 c 0,0.92147 -2.2477,1.0387 -2.2477,0 v -1.879 c 0,-0.94305 0.2327,-3.9947 -3.2471,-3.9947 -3.4511,0 -3.1997,3.0704 -3.1863,3.9909 v 1.7807 c 0,1.1103 -2.3144,1.1055 -2.3144,-0.01588 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1345"
-         style="opacity:0.18235001;fill:url(#linearGradient2623);fill-rule:evenodd;filter:url(#filter6251)"
-         d="m 34.687,10.837 1.2639,0.125 c 0.92724,2.8227 0.73605,9.5104 0.73605,9.5104 -0.0625,1.125 -2.0312,0.53125 -2,0 V 10.837 z"
-         transform="matrix(0.40937,0,0,0.47152,2.1465,-0.90174)" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path6332"
-         style="opacity:0.14118;fill:url(#linearGradient2625);fill-rule:evenodd;filter:url(#filter6251)"
-         d="m 12.927,11.544 0.37172,0.1692 c 1.7203,1.055 2.1735,9.3778 2.1735,9.3778 -0.0625,1.125 -2.0312,0.53125 -2,0 0,0 0.37822,-6.8706 -0.54525,-9.547 z"
-         transform="matrix(-0.40937,0,0,0.47152,14.042,-1.1935)" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path5675"
-         style="opacity:0.62352995;fill:none;stroke:#ffffff;stroke-width:4.29829979;stroke-linecap:round;filter:url(#filter5745)"
-         d="m 13.877,17.722 0.125,-7.5 c 0,-9.8764 18.688,-10.676 18.688,0.875 v 6.875"
-         transform="matrix(0.45915,0,0,0.47152,0.97831,0.22752)" />
-    </g>
+         x="-268.17508"
+         y="255.625">%%force%%</tspan></text>
     <text
        xml:space="preserve"
        style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
-       x="-60"
-       y="215"
+       x="-235.5"
+       y="255.5"
        id="text3638-3-3-2-0-9-84-1"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0-5"
-         x="-60"
-         y="215">%%release%%</tspan></text>
+         x="-235.5"
+         y="255.5">%%release%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
-       y="218.75"
-       x="-56"
-       height="24"
-       width="24"
+       y="259"
+       x="-226.875"
+       height="16"
+       width="16"
        id="release"
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
-    <g
-       style="display:inline"
-       transform="translate(-58.267759,218.481)"
-       id="layer1-577-7">
-      <path
-         inkscape:connector-curvature="0"
-         id="path3435-1"
-         style="opacity:0.4;fill:url(#radialGradient2670-3)"
-         d="m 22,21.947 c 0,1.113 -4.4771,2.0152 -9.9999,2.0152 -5.5228,0 -9.9999,-0.90224 -9.9999,-2.0152 0,-1.11296 4.4771,-2.0152 9.9999,-2.0152 5.5228,0 9.9999,0.90224 9.9999,2.0152 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1314-5"
-         style="fill:url(#linearGradient2667-8);fill-rule:evenodd;stroke:#a2824e;stroke-linecap:round;stroke-linejoin:round"
-         d="m 4.5857,8.0018 c 4.8977,-0.72404 9.8475,-0.61163 14.828,0 0.60151,0 1.0857,0.52347 1.0857,1.1737 v 11.698 c 0,0.65024 -0.5155,1.0797 -1.0857,1.1737 -5.164,0.60626 -9.5919,0.60147 -14.828,0 -0.6955,-0.22 -1.086,-0.524 -1.086,-1.175 V 9.1742 c 0,-0.65024 0.48424,-1.1737 1.0857,-1.1737 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect6903-8"
-         style="opacity:0.38000039;fill:none;stroke:url(#linearGradient2654-8);stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.60109002"
-         d="m 5.0857,9.5 h 13.829 c 0.32446,0 0.58567,0.26635 0.58567,0.5972 v 10.396 c 0,0.33085 -0.23192,0.48359 -0.58567,0.5972 -4.5217,0.54696 -8.9848,0.5457 -13.829,0 C 4.76124,20.97679 4.50003,20.82405 4.50003,20.4932 V 10.0972 C 4.50003,9.76635 4.76124,9.5 5.0857,9.5 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1460-4"
-         style="fill:url(#linearGradient2651-2);fill-rule:evenodd"
-         d="m 4.7794,8.5385 c 4.8137,-0.78635 9.6274,-0.64629 14.441,0 0.4318,0 0.77943,0.386 0.77943,0.86548 v 1.499 c 0,0.47947 -0.34763,0.86548 -0.77943,0.86548 -5.0234,0.3715 -9.6454,0.23891 -14.441,0 -0.4314,0 -0.779,-0.386 -0.779,-0.865 v -1.499 c 0,-0.4795 0.3476,-0.8655 0.7794,-0.8655 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1593-3"
-         style="opacity:0.6;fill:none;stroke:url(#linearGradient2648-2);stroke-linecap:round;stroke-linejoin:round"
-         d="m 5.0455,10.5 h 13.909 c 0.30223,0 0.54554,0.1293 0.54554,0.2899 v 0.17499 c 0,0.1606 -0.24331,0.2899 -0.54554,0.2899 -4.593,0.31718 -9.238,0.33659 -13.909,0 -0.30223,0 -0.54554,-0.1293 -0.54554,-0.2899 V 10.7899 C 4.49996,10.6293 4.74327,10.5 5.0455,10.5 z" />
-      <rect
-         id="rect5887-5"
-         style="opacity:0.2;fill:#ffffff;fill-rule:evenodd;filter:url(#filter5957-1)"
-         transform="matrix(0.9234,0,0,0.57774,-7.227,-2.3565)"
-         rx="1.6077"
-         ry="1.6077"
-         height="16.971001"
-         width="2.8283999"
-         y="23.226"
-         x="14.594" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path6073-2"
-         style="opacity:0.3;fill:url(#radialGradient3446-5);fill-rule:evenodd"
-         d="M 10,9.25 C 10,9.9404 8.8807,10.5 7.5,10.5 6.1193,10.5 5,9.9404 5,9.25 5,8.5596 6.1193,8 7.5,8 8.8807,8 10,8.5596 10,9.25 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path6083-8"
-         style="opacity:0.3;fill:url(#radialGradient3444-4);fill-rule:evenodd"
-         d="M 19,9.25 C 19,9.9404 17.881,10.5 16.5,10.5 15.119,10.5 14,9.9404 14,9.25 14,8.5596 15.119,8 16.5,8 17.881,8 19,8.5596 19,9.25 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path2086-9"
-         style="fill:url(#linearGradient2638-4);fill-rule:evenodd;stroke:#888a85"
-         d="M 15.297692,8.6395 V 5.9354 c 0,-3.711 2.1522,-5.4739 5.4773,-5.4276 3.3431,0.046344 5.5183,1.673 5.5183,5.4276 v 2.822 c 0,0.92147 -2.2477,1.0387 -2.2477,0 v -1.879 c 0,-0.94305 0.2327,-3.9947 -3.2471,-3.9947 -3.4511,0 -3.1997,3.0704 -3.1863,3.9909 v 1.7807 c 0,1.1103 -2.3144,1.1055 -2.3144,-0.01588 z" />
-      <path
-         inkscape:connector-curvature="0"
-         id="rect1345-2"
-         style="opacity:0.18235001;fill:url(#linearGradient2623-6);fill-rule:evenodd;filter:url(#filter6251-7)"
-         d="m 34.687,10.837 1.2639,0.125 c 0.92724,2.8227 0.73605,9.5104 0.73605,9.5104 -0.0625,1.125 -2.0312,0.53125 -2,0 V 10.837 z"
-         transform="matrix(0.40937,0,0,0.47152,10.941992,-0.90174)" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path6332-0"
-         style="opacity:0.14118;fill:url(#linearGradient2625-2);fill-rule:evenodd;filter:url(#filter6251-7)"
-         d="m 12.927,11.544 0.37172,0.1692 c 1.7203,1.055 2.1735,9.3778 2.1735,9.3778 -0.0625,1.125 -2.0312,0.53125 -2,0 0,0 0.37822,-6.8706 -0.54525,-9.547 z"
-         transform="matrix(-0.40937,0,0,0.47152,22.837492,-1.1935)" />
-      <path
-         inkscape:connector-curvature="0"
-         id="path5675-6"
-         style="opacity:0.62352995;fill:none;stroke:#ffffff;stroke-width:4.29829979;stroke-linecap:round;filter:url(#filter5745-0)"
-         d="m 13.877,17.722 0.125,-7.5 c 0,-9.8764 18.688,-10.676 18.688,0.875 v 6.875"
-         transform="matrix(0.45915,0,0,0.47152,9.7738056,0.22752)" />
-    </g>
     <text
        xml:space="preserve"
        style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
-       x="-22.928932"
-       y="215.11613"
+       x="-91.428932"
+       y="214.86613"
        id="text3638-3-3-2-0-9-84-1-0"><tspan
          sodipodi:role="line"
          id="tspan3640-1-8-0-6-8-0-5-0"
-         x="-22.928932"
-         y="215.11613">%%split%%</tspan></text>
+         x="-91.428932"
+         y="214.86613">%%split%%</tspan></text>
     <rect
        inkscape:label="#rect3636"
-       y="218.64645"
-       x="-21.82843"
+       y="218.39645"
+       x="-90.32843"
        height="24"
        width="24"
        id="split"
        style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
     <g
        id="g6806"
-       transform="scale(0.9,1)">
+       transform="matrix(0.9,0,0,1,-68.500003,-0.25000001)">
       <rect
          y="221"
          x="-20"
@@ -14757,7 +15394,7 @@
     <g
        style="display:inline"
        id="layer1-96-5"
-       transform="matrix(0.01312661,-0.55960772,0.55960772,0.01312661,-15.624053,237.13593)">
+       transform="matrix(0.01312661,-0.55960772,0.55960772,0.01312661,-84.124056,236.88593)">
       <g
          id="g6545-1"
          transform="matrix(0.8930733,0.44991119,-0.44991119,0.8930733,-40.088761,-46.216687)">
@@ -14775,7 +15412,7 @@
            style="fill:#d1524c;fill-opacity:1;stroke:#973137;stroke-width:0.64594996;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
            id="polygon5606-0"
            transform="matrix(1.3838457,-0.5995106,0.7577226,1.5096437,-342.70934,195.72431)"
-           points="297.04443,12.300293 297.04443,12.300293 296.39941,13.384766 295.13281,14.71875 294.73242,13.672852 295.74658,11.960449 " />
+           points="297.04443,12.300293 296.39941,13.384766 295.13281,14.71875 294.73242,13.672852 295.74658,11.960449 297.04443,12.300293 " />
         <path
            style="fill:url(#linearGradient6534-2);stroke:#888a85;stroke-width:0.98886794;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
            id="path5608-8"
@@ -14800,7 +15437,7 @@
            style="fill:#d1524c;fill-opacity:1;stroke:#973137;stroke-width:0.6332444;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
            id="polygon5616-1"
            transform="matrix(1.1476031,-0.79527758,0.96691724,1.4548542,-275.37886,255.51909)"
-           points="296.95605,12.300293 297.6001,13.384766 298.86719,14.71875 299.26807,13.672852 298.25391,11.960449 296.95605,12.300293 " />
+           points="297.6001,13.384766 298.86719,14.71875 299.26807,13.672852 298.25391,11.960449 296.95605,12.300293 296.95605,12.300293 " />
         <path
            style="fill:#d1524c;fill-opacity:1;stroke:#973137;stroke-width:0.99573755;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
            id="path5618-3"
@@ -14820,7 +15457,7 @@
     </g>
     <g
        id="g6810"
-       transform="scale(0.9,1)">
+       transform="matrix(0.9,0,0,1,-68.500003,-0.25000001)">
       <rect
          y="232.23741"
          x="-20"
@@ -14835,5 +15472,250 @@
          d="m -20,234 3.427184,4 5.08233,-2.66431 L -10,237 -5.3695924,233.56793 0,236"
          style="fill:none;stroke:#ff0000;stroke-width:0.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
     </g>
+    <text
+       xml:space="preserve"
+       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       x="-200"
+       y="255.625"
+       id="text3638-3-3-2-0-9-84-1-0-7"><tspan
+         sodipodi:role="line"
+         id="tspan3640-1-8-0-6-8-0-5-0-8"
+         x="-200"
+         y="255.625">%%delete_graph%%</tspan></text>
+    <g
+       transform="translate(-184.69001,259.127)"
+       id="layer1-1">
+      <path
+         inkscape:connector-curvature="0"
+         id="text1314"
+         style="fill:url(#linearGradient3234);stroke:#4d4d4d"
+         d="M 13.5,11.239 10.315,7.998 13.38,4.6029 11.17,2.5 8.0165,5.7353 4.7985,2.5 2.5,4.6803 5.7179,7.9842 2.4999,11.2353 4.7984,13.5 8.0126,10.1029 11.2343,13.5 13.4999,11.2388 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path7076"
+         style="opacity:0.3;fill:none;stroke:url(#linearGradient3231);stroke-linecap:square"
+         d="M 12.003,4.6567 11.232,3.9069 8.0826,7.1693 4.7768,3.9261 3.9136,4.7225" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3165-0"
+         style="opacity:0.3;fill:none;stroke:url(#linearGradient3023)"
+         d="M 12.449,11.612 9.3447,8.3988 M 6.6909,8.39262 3.5815,11.58332" />
+    </g>
+    <rect
+       inkscape:label="#rect3636"
+       y="259.12503"
+       x="-184.75002"
+       height="16"
+       width="16"
+       id="delete_graph"
+       style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <text
+       xml:space="preserve"
+       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       x="-149.75002"
+       y="255.75"
+       id="text3638-3-3-2-0-9-84-1-0-7-8"><tspan
+         sodipodi:role="line"
+         x="-149.75002"
+         y="255.75"
+         id="tspan5713">%%minimize_graph%%</tspan></text>
+    <rect
+       inkscape:label="#rect3636"
+       y="259"
+       x="-131.50002"
+       height="16"
+       width="16"
+       id="minimize_graph"
+       style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <g
+       transform="translate(-131.43751,258.375)"
+       id="g5498">
+      <rect
+         id="rect1887-0"
+         style="fill:url(#linearGradient5528);stroke:#565853;stroke-width:0.99993002;stroke-linejoin:round"
+         height="14"
+         width="15"
+         y="1.5"
+         x="0.49996999" />
+      <rect
+         id="rect2779-3"
+         style="opacity:0.2;fill:none;stroke:url(#linearGradient5525);stroke-width:1.00010002"
+         height="12"
+         width="13"
+         y="2.5000999"
+         x="1.5001" />
+      <rect
+         id="rect6287-4"
+         style="fill:url(#linearGradient5522)"
+         height="12.960938"
+         width="14"
+         y="2.0390625"
+         x="1" />
+    </g>
+    <rect
+       style="color:#000000;fill:url(#linearGradient6750);fill-opacity:1;fill-rule:nonzero;stroke:#565853;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect5849"
+       width="11.034"
+       height="3.4488933"
+       x="-128.9994"
+       y="268.51019" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path7076-0"
+       style="opacity:0.3;fill:none;stroke:url(#linearGradient6801);stroke-width:1;stroke-linecap:square;display:inline"
+       d="m -118.96639,270.98043 0.004,-1.46609 -9.03453,0.0166"
+       sodipodi:nodetypes="ccc" />
+    <text
+       xml:space="preserve"
+       style="font-size:4.49727678px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;display:inline;font-family:Bitstream Vera Sans"
+       x="-93.511536"
+       y="255.83347"
+       id="text3638-3-3-2-0-9-84-1-0-7-8-0"><tspan
+         sodipodi:role="line"
+         x="-93.511536"
+         y="255.83347"
+         id="tspan5713-0">%%maximize_graph%%</tspan></text>
+    <rect
+       inkscape:label="#rect3636"
+       y="259.08347"
+       x="-75.261528"
+       height="16"
+       width="16"
+       id="maximize_graph"
+       style="opacity:0;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+    <g
+       style="display:inline"
+       transform="translate(-75.199039,258.45845)"
+       id="g5498-6">
+      <rect
+         id="rect1887-0-5"
+         style="fill:url(#linearGradient5528-8);stroke:#565853;stroke-width:0.99993002;stroke-linejoin:round"
+         height="14"
+         width="15"
+         y="1.5"
+         x="0.49996999" />
+      <rect
+         id="rect2779-3-7"
+         style="opacity:0.2;fill:none;stroke:url(#linearGradient5525-3);stroke-width:1.00010002"
+         height="12"
+         width="13"
+         y="2.5000999"
+         x="1.5001" />
+      <rect
+         id="rect6287-4-9"
+         style="fill:url(#linearGradient5522-9)"
+         height="12.960938"
+         width="14"
+         y="2.0390625"
+         x="1" />
+    </g>
+    <rect
+       style="color:#000000;fill:url(#linearGradient6750-4);fill-opacity:1;fill-rule:nonzero;stroke:#565853;stroke-width:0.99638373;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+       id="rect5849-1"
+       width="11.037974"
+       height="8.9308977"
+       x="-72.785027"
+       y="263.14575" />
+    <path
+       inkscape:connector-curvature="0"
+       id="path7076-0-1"
+       style="opacity:0.3;fill:none;stroke:url(#linearGradient6801-3);stroke-width:1;stroke-linecap:square;display:inline"
+       d="m -62.761059,271.04244 0.004,-6.90262 -9.03453,0.0166"
+       sodipodi:nodetypes="ccc" />
+    <g
+       transform="translate(-261.99974,259.1098)"
+       id="layer1-61">
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1314"
+         style="fill:url(#linearGradient2627);fill-rule:evenodd;stroke:#a2824e;stroke-linecap:round;stroke-linejoin:round"
+         d="m 3.2025,5.8345 c 3.1691,-0.48269 6.3719,-0.40776 9.5949,0 0.38921,0 0.70255,0.34898 0.70255,0.78248 v 7.7986 c 0,0.43349 -0.33356,0.71977 -0.70255,0.78247 -3.3415,0.40417 -6.2065,0.40098 -9.5949,0 -0.4503,-0.146 -0.703,-0.349 -0.703,-0.782 v -7.7986 c 0,-0.43349 0.31334,-0.78248 0.70255,-0.78248 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect6903"
+         style="opacity:0.38000039;fill:none;stroke:url(#linearGradient2624);stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.60109002"
+         d="m 3.8514,6.5 h 8.2972 c 0.194,0 0.351,0.1776 0.351,0.3981 v 6.9306 c 0,0.22057 -0.13915,0.3224 -0.3514,0.39814 -2.713,0.36464 -5.3909,0.3638 -8.2972,0 C 3.65632,14.1511 3.4996,14.04927 3.4996,13.8287 V 6.8981 c 0,-0.2208 0.1567,-0.3984 0.3514,-0.3984 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1460"
+         style="fill:url(#linearGradient2621);fill-rule:evenodd"
+         d="m 3.4871,6.4039 c 3.0086,-0.58976 6.0171,-0.48472 9.0257,0 0.27,0 0.487,0.2895 0.487,0.6491 v 1.1242 c 0,0.35961 -0.21727,0.64911 -0.48715,0.64911 -3.1396,0.27862 -6.0283,0.17919 -9.0257,0 -0.2699,0 -0.4872,-0.2895 -0.4872,-0.6491 v -1.1242 c 0,-0.3596 0.2173,-0.6491 0.4871,-0.6491 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1593"
+         style="opacity:0.6;fill:none;stroke:url(#linearGradient2618);stroke-linecap:round;stroke-linejoin:round"
+         d="m 3.8273,7.5 h 8.3453 c 0.18134,0 0.32733,0.1293 0.32733,0.2899 v 0.17498 c 0,0.1606 -0.14599,0.2899 -0.32733,0.2899 -2.7558,0.31718 -5.5428,0.33659 -8.3453,0 -0.18134,0 -0.32733,-0.1293 -0.32733,-0.2899 V 7.7899 C 3.49997,7.6293 3.64596,7.5 3.8273,7.5 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2086"
+         style="fill:url(#linearGradient2608);fill-rule:evenodd;stroke:#888a85"
+         d="M 4.5,5.9305 V 4.1247 c 0,-2.4782 1.3703,-3.6555 3.4873,-3.6246 2.1285,0.030949 3.5134,1.1172 3.5134,3.6246 v 1.8846 c 0,0.61536 -1.4311,0.69368 -1.4311,0 V 4.7545 c 0,-0.62977 0.14816,-2.6677 -2.0674,-2.6677 -2.1973,0 -2.0372,2.0505 -2.0287,2.6652 V 5.9412 C 5.9735,6.68264 4.5,6.67949 4.5,5.930596 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1345"
+         style="opacity:0.18235001;fill:url(#linearGradient2631);fill-rule:evenodd;filter:url(#filter6251-1)"
+         d="m 34.687,10.837 1.2639,0.125 c 0.92724,2.8227 0.73605,9.5104 0.73605,9.5104 -0.0625,1.125 -2.0312,0.53125 -2,0 V 10.837 z"
+         transform="matrix(0.26064,0,0,0.31489,1.7268,-0.44122)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6332"
+         style="opacity:0.14118;fill:url(#linearGradient2629);fill-rule:evenodd;filter:url(#filter6251-1)"
+         d="m 12.927,11.544 0.37172,0.1692 c 1.7203,1.055 2.1735,9.3778 2.1735,9.3778 -0.0625,1.125 -2.0312,0.53125 -2,0 0,0 0.37822,-6.8706 -0.54525,-9.547 z"
+         transform="matrix(-0.26064,0,0,0.31489,9.3006,-0.63604)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3411"
+         style="opacity:0.62352995;fill:none;stroke:#ffffff;stroke-width:6.59200001;stroke-linecap:round;filter:url(#filter3407)"
+         d="m 31.844,17.125 c -0.003,-2.113 0.006,-4.2261 -0.0047,-6.339 -0.034,-1.6107 -0.543,-3.2452 -1.612,-4.4726 -1.355,-1.5843 -3.379,-2.4626 -5.414,-2.7423 -0.487,-0.0673 -0.978,-0.1013 -1.469,-0.1023 -2.075,0.00558 -4.1949,0.54216 -5.9005,1.7543 -1.1825,0.83615 -2.1108,2.0716 -2.4313,3.4977 -0.22328,0.90342 -0.15731,1.8388 -0.19188,2.7603 -0.03376,1.798 -0.06753,3.5959 -0.10129,5.3939"
+         transform="matrix(0.29233,0,0,0.31489,0.98301,0.31291)" />
+    </g>
+    <g
+       style="display:inline"
+       transform="translate(-228.60957,259.1098)"
+       id="layer1-61-3">
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1314-3"
+         style="fill:url(#linearGradient2627-1);fill-rule:evenodd;stroke:#a2824e;stroke-linecap:round;stroke-linejoin:round"
+         d="m 3.2025,5.8345 c 3.1691,-0.48269 6.3719,-0.40776 9.5949,0 0.38921,0 0.70255,0.34898 0.70255,0.78248 v 7.7986 c 0,0.43349 -0.33356,0.71977 -0.70255,0.78247 -3.3415,0.40417 -6.2065,0.40098 -9.5949,0 -0.4503,-0.146 -0.703,-0.349 -0.703,-0.782 v -7.7986 c 0,-0.43349 0.31334,-0.78248 0.70255,-0.78248 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect6903-0"
+         style="opacity:0.38000039;fill:none;stroke:url(#linearGradient2624-6);stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.60109002"
+         d="m 3.8514,6.5 h 8.2972 c 0.194,0 0.351,0.1776 0.351,0.3981 v 6.9306 c 0,0.22057 -0.13915,0.3224 -0.3514,0.39814 -2.713,0.36464 -5.3909,0.3638 -8.2972,0 C 3.65632,14.1511 3.4996,14.04927 3.4996,13.8287 V 6.8981 c 0,-0.2208 0.1567,-0.3984 0.3514,-0.3984 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1460-4"
+         style="fill:url(#linearGradient2621-2);fill-rule:evenodd"
+         d="m 3.4871,6.4039 c 3.0086,-0.58976 6.0171,-0.48472 9.0257,0 0.27,0 0.487,0.2895 0.487,0.6491 v 1.1242 c 0,0.35961 -0.21727,0.64911 -0.48715,0.64911 -3.1396,0.27862 -6.0283,0.17919 -9.0257,0 -0.2699,0 -0.4872,-0.2895 -0.4872,-0.6491 v -1.1242 c 0,-0.3596 0.2173,-0.6491 0.4871,-0.6491 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1593-4"
+         style="opacity:0.6;fill:none;stroke:url(#linearGradient2618-4);stroke-linecap:round;stroke-linejoin:round"
+         d="m 3.8273,7.5 h 8.3453 c 0.18134,0 0.32733,0.1293 0.32733,0.2899 v 0.17498 c 0,0.1606 -0.14599,0.2899 -0.32733,0.2899 -2.7558,0.31718 -5.5428,0.33659 -8.3453,0 -0.18134,0 -0.32733,-0.1293 -0.32733,-0.2899 V 7.7899 C 3.49997,7.6293 3.64596,7.5 3.8273,7.5 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path2086-2"
+         style="fill:url(#linearGradient2608-4);fill-rule:evenodd;stroke:#888a85"
+         d="M 9.96875,5.9305 V 4.1247 c 0,-2.4782 1.3703,-3.6555 3.4873,-3.6246 2.1285,0.030949 3.5134,1.1172 3.5134,3.6246 v 1.8846 c 0,0.61536 -1.4311,0.69368 -1.4311,0 V 4.7545 c 0,-0.62977 0.14816,-2.6677 -2.0674,-2.6677 -2.1973,0 -2.0372,2.0505 -2.0287,2.6652 v 1.1892 c 0,0.74144 -1.4735,0.73829 -1.4735,-0.010604 z" />
+      <path
+         inkscape:connector-curvature="0"
+         id="rect1345-0"
+         style="opacity:0.18235001;fill:url(#linearGradient2631-3);fill-rule:evenodd;filter:url(#filter6251-1-3)"
+         d="m 34.687,10.837 1.2639,0.125 c 0.92724,2.8227 0.73605,9.5104 0.73605,9.5104 -0.0625,1.125 -2.0312,0.53125 -2,0 V 10.837 z"
+         transform="matrix(0.26064,0,0,0.31489,7.211175,-0.44122)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path6332-9"
+         style="opacity:0.14118;fill:url(#linearGradient2629-8);fill-rule:evenodd;filter:url(#filter6251-1-3)"
+         d="m 12.927,11.544 0.37172,0.1692 c 1.7203,1.055 2.1735,9.3778 2.1735,9.3778 -0.0625,1.125 -2.0312,0.53125 -2,0 0,0 0.37822,-6.8706 -0.54525,-9.547 z"
+         transform="matrix(-0.26064,0,0,0.31489,14.8006,-0.63604)" />
+      <path
+         inkscape:connector-curvature="0"
+         id="path3411-2"
+         style="opacity:0.62352995;fill:none;stroke:#ffffff;stroke-width:6.59200001;stroke-linecap:round;filter:url(#filter3407-0)"
+         d="m 31.844,17.125 c -0.003,-2.113 0.006,-4.2261 -0.0047,-6.339 -0.034,-1.6107 -0.543,-3.2452 -1.612,-4.4726 -1.355,-1.5843 -3.379,-2.4626 -5.414,-2.7423 -0.487,-0.0673 -0.978,-0.1013 -1.469,-0.1023 -2.075,0.00558 -4.1949,0.54216 -5.9005,1.7543 -1.1825,0.83615 -2.1108,2.0716 -2.4313,3.4977 -0.22328,0.90342 -0.15731,1.8388 -0.19188,2.7603 -0.03376,1.798 -0.06753,3.5959 -0.10129,5.3939"
+         transform="matrix(0.29233,0,0,0.31489,6.45176,0.31291)" />
+    </g>
   </g>
 </svg>
Binary file images/release.png has changed