613 #CANVAS_HIGHLIGHT_TYPES |
613 #CANVAS_HIGHLIGHT_TYPES |
614 [HIGHLIGHT_NONE, |
614 [HIGHLIGHT_NONE, |
615 HIGHLIGHT_BEFORE, |
615 HIGHLIGHT_BEFORE, |
616 HIGHLIGHT_AFTER, |
616 HIGHLIGHT_AFTER, |
617 HIGHLIGHT_LEFT, |
617 HIGHLIGHT_LEFT, |
618 HIGHLIGHT_RIGHT] = range(5) |
618 HIGHLIGHT_RIGHT, |
619 |
619 HIGHLIGHT_RESIZE] = range(6) |
620 HIGHLIGHT_PEN = wx.Pen(wx.Colour(0, 128, 255)) |
620 |
621 HIGHLIGHT_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128)) |
621 HIGHLIGHT_DROP_PEN = wx.Pen(wx.Colour(0, 128, 255)) |
|
622 HIGHLIGHT_DROP_BRUSH = wx.Brush(wx.Colour(0, 128, 255, 128)) |
|
623 HIGHLIGHT_RESIZE_PEN = wx.Pen(wx.Colour(200, 200, 200)) |
|
624 HIGHLIGHT_RESIZE_BRUSH = wx.Brush(wx.Colour(200, 200, 200)) |
622 |
625 |
623 #CANVAS_SIZE_TYPES |
626 #CANVAS_SIZE_TYPES |
624 [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200] |
627 [SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI] = [0, 100, 200] |
625 |
628 |
626 DEFAULT_CANVAS_HEIGHT = 200. |
629 DEFAULT_CANVAS_HEIGHT = 200. |
644 return self.Bitmap.GetSize() |
648 return self.Bitmap.GetSize() |
645 |
649 |
646 def SetPosition(self, x, y): |
650 def SetPosition(self, x, y): |
647 self.Position = wx.Point(x, y) |
651 self.Position = wx.Point(x, y) |
648 |
652 |
649 def SetBitmap(self, bitmap): |
|
650 self.Bitmap = bitmap |
|
651 |
|
652 def SetCallback(self, callback): |
|
653 self.Callback = callback |
|
654 |
|
655 def Show(self): |
653 def Show(self): |
656 self.Shown = True |
654 self.Shown = True |
657 |
655 |
658 def Hide(self): |
656 def Hide(self): |
659 self.Shown = False |
657 self.Shown = False |
660 |
658 |
|
659 def IsShown(self): |
|
660 return self.Shown |
|
661 |
|
662 def Enable(self): |
|
663 self.Enabled = True |
|
664 |
|
665 def Disable(self): |
|
666 self.Enabled = False |
|
667 |
|
668 def IsEnabled(self): |
|
669 return self.Enabled |
|
670 |
661 def HitTest(self, x, y): |
671 def HitTest(self, x, y): |
662 if self.Shown: |
672 if self.Shown and self.Enabled: |
663 w, h = self.Bitmap.GetSize() |
673 w, h = self.Bitmap.GetSize() |
664 rect = wx.Rect(self.Position.x, self.Position.y, w, h) |
674 rect = wx.Rect(self.Position.x, self.Position.y, w, h) |
665 if rect.InsideXY(x, y): |
675 if rect.InsideXY(x, y): |
666 return True |
676 return True |
667 return False |
677 return False |
669 def ProcessCallback(self): |
679 def ProcessCallback(self): |
670 if self.Callback is not None: |
680 if self.Callback is not None: |
671 wx.CallAfter(self.Callback) |
681 wx.CallAfter(self.Callback) |
672 |
682 |
673 def Draw(self, dc): |
683 def Draw(self, dc): |
674 if self.Shown: |
684 if self.Shown and self.Enabled: |
675 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True) |
685 dc.DrawBitmap(self.Bitmap, self.Position.x, self.Position.y, True) |
676 |
686 |
677 class DraggingFigureCanvas(FigureCanvas): |
687 class DraggingFigureCanvas(FigureCanvas): |
678 |
688 |
679 def __init__(self, parent, window, *args, **kwargs): |
689 def __init__(self, parent, window, *args, **kwargs): |
686 self.ParentWindow = window |
696 self.ParentWindow = window |
687 self.Highlight = HIGHLIGHT_NONE |
697 self.Highlight = HIGHLIGHT_NONE |
688 self.CanvasSize = SIZE_MAXI |
698 self.CanvasSize = SIZE_MAXI |
689 |
699 |
690 self.Buttons = [] |
700 self.Buttons = [] |
691 self.SizeButtonsParams = dict( |
|
692 [(size, (GetBitmap(bitmap), self.GetOnChangeSizeButton(size))) |
|
693 for size, bitmap in zip([SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI], |
|
694 ["minimize_graph", "middle_graph", "maximize_graph"])]) |
|
695 self.ContextualButtons = [] |
701 self.ContextualButtons = [] |
696 self.ContextualButtonsItem = None |
702 self.ContextualButtonsItem = None |
697 |
703 |
698 for size in [SIZE_MINI, SIZE_MIDDLE]: |
704 for size, bitmap in zip([SIZE_MINI, SIZE_MIDDLE, SIZE_MAXI], |
699 self.Buttons.append(GraphButton(0, 0, *self.SizeButtonsParams[size])) |
705 ["minimize_graph", "middle_graph", "maximize_graph"]): |
|
706 self.Buttons.append(GraphButton(0, 0, GetBitmap(bitmap), self.GetOnChangeSizeButton(size))) |
700 self.Buttons.append( |
707 self.Buttons.append( |
701 GraphButton(0, 0, GetBitmap("export_graph_mini"), self.OnExportGraphButton)) |
708 GraphButton(0, 0, GetBitmap("export_graph_mini"), self.OnExportGraphButton)) |
702 self.Buttons.append( |
709 self.Buttons.append( |
703 GraphButton(0, 0, GetBitmap("delete_graph"), self.OnCloseButton)) |
710 GraphButton(0, 0, GetBitmap("delete_graph"), self.OnCloseButton)) |
704 |
711 |
728 destDC.SelectObject(self.bitmap) |
735 destDC.SelectObject(self.bitmap) |
729 |
736 |
730 destGC = wx.GCDC(destDC) |
737 destGC = wx.GCDC(destDC) |
731 |
738 |
732 destGC.BeginDrawing() |
739 destGC.BeginDrawing() |
733 destGC.SetPen(HIGHLIGHT_PEN) |
740 if self.Highlight == HIGHLIGHT_RESIZE: |
734 destGC.SetBrush(HIGHLIGHT_BRUSH) |
741 destGC.SetPen(HIGHLIGHT_RESIZE_PEN) |
735 if self.Highlight in [HIGHLIGHT_BEFORE]: |
742 destGC.SetBrush(HIGHLIGHT_RESIZE_BRUSH) |
736 destGC.DrawLine(0, 1, width - 1, 1) |
743 destGC.DrawRectangle(0, height - 5, width, 5) |
737 elif self.Highlight in [HIGHLIGHT_AFTER]: |
744 else: |
738 destGC.DrawLine(0, height - 1, width - 1, height - 1) |
745 destGC.SetPen(HIGHLIGHT_DROP_PEN) |
739 elif self.Highlight == HIGHLIGHT_LEFT: |
746 destGC.SetBrush(HIGHLIGHT_DROP_BRUSH) |
740 destGC.DrawRectangle(bbox.x, bbox.y, |
747 if self.Highlight in [HIGHLIGHT_BEFORE]: |
741 bbox.width / 2, bbox.height) |
748 destGC.DrawLine(0, 1, width - 1, 1) |
742 elif self.Highlight == HIGHLIGHT_RIGHT: |
749 elif self.Highlight in [HIGHLIGHT_AFTER]: |
743 destGC.DrawRectangle(bbox.x + bbox.width / 2, bbox.y, |
750 destGC.DrawLine(0, height - 1, width - 1, height - 1) |
744 bbox.width / 2, bbox.height) |
751 elif self.Highlight == HIGHLIGHT_LEFT: |
|
752 destGC.DrawRectangle(bbox.x, bbox.y, |
|
753 bbox.width / 2, bbox.height) |
|
754 elif self.Highlight == HIGHLIGHT_RIGHT: |
|
755 destGC.DrawRectangle(bbox.x + bbox.width / 2, bbox.y, |
|
756 bbox.width / 2, bbox.height) |
745 |
757 |
746 for button in self.Buttons + self.ContextualButtons: |
758 for button in self.Buttons + self.ContextualButtons: |
747 button.Draw(destGC) |
759 button.Draw(destGC) |
748 |
760 |
749 if self.ParentWindow.IsDragging(): |
761 if self.ParentWindow.IsDragging(): |
838 for button in self.ContextualButtons: |
850 for button in self.ContextualButtons: |
839 if button.HitTest(x, y): |
851 if button.HitTest(x, y): |
840 return True |
852 return True |
841 return False |
853 return False |
842 |
854 |
|
855 def SetMinSize(self, size): |
|
856 wx.Window.SetMinSize(self, size) |
|
857 wx.CallAfter(self.RefreshButtonsState) |
|
858 |
843 def ShowButtons(self, show): |
859 def ShowButtons(self, show): |
844 for button in self.Buttons: |
860 for button in self.Buttons: |
845 if show: |
861 if show: |
846 button.Show() |
862 button.Show() |
847 else: |
863 else: |
848 button.Hide() |
864 button.Hide() |
|
865 self.RefreshButtonsState() |
849 self.ParentWindow.ForceRefresh() |
866 self.ParentWindow.ForceRefresh() |
850 |
867 |
851 def OnEnterWindow(self, event): |
868 def OnEnterWindow(self, event): |
852 self.ShowButtons(True) |
869 self.ShowButtons(True) |
853 event.Skip() |
870 event.Skip() |
854 |
871 |
855 def OnLeaveWindow(self, event): |
872 def OnLeaveWindow(self, event): |
856 x, y = event.GetPosition() |
873 if self.Highlight != HIGHLIGHT_RESIZE or self.Parent.CanvasStartSize is None: |
857 width, height = self.GetSize() |
874 x, y = event.GetPosition() |
858 if (x <= 0 or x >= width - 1 or |
875 width, height = self.GetSize() |
859 y <= 0 or y >= height - 1): |
876 if (x <= 0 or x >= width - 1 or |
860 self.ShowButtons(False) |
877 y <= 0 or y >= height - 1): |
|
878 self.ShowButtons(False) |
861 event.Skip() |
879 event.Skip() |
862 |
880 |
863 def GetOnChangeSizeButton(self, size): |
881 def GetOnChangeSizeButton(self, size): |
864 def OnChangeSizeButton(): |
882 def OnChangeSizeButton(): |
865 self.CanvasSize = size |
883 self.CanvasSize = size |
866 self.Parent.SetCanvasSize(200, self.CanvasSize) |
884 self.Parent.SetCanvasSize(200, self.CanvasSize) |
867 params = [] |
|
868 if self.CanvasSize != SIZE_MINI: |
|
869 params.append(self.SizeButtonsParams[SIZE_MINI]) |
|
870 else: |
|
871 params.append(self.SizeButtonsParams[SIZE_MIDDLE]) |
|
872 if self.CanvasSize != SIZE_MAXI: |
|
873 params.append(self.SizeButtonsParams[SIZE_MAXI]) |
|
874 else: |
|
875 params.append(self.SizeButtonsParams[SIZE_MIDDLE]) |
|
876 for button, (bitmap, callback) in zip(self.Buttons, params): |
|
877 button.SetBitmap(bitmap) |
|
878 button.SetCallback(callback) |
|
879 return OnChangeSizeButton |
885 return OnChangeSizeButton |
880 |
886 |
881 def OnExportGraphButton(self): |
887 def OnExportGraphButton(self): |
882 self.Parent.ExportGraph() |
888 self.Parent.ExportGraph() |
883 |
889 |
902 def OnRemoveItemButton(self): |
908 def OnRemoveItemButton(self): |
903 wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent, |
909 wx.CallAfter(self.ParentWindow.DeleteValue, self.Parent, |
904 self.ContextualButtonsItem) |
910 self.ContextualButtonsItem) |
905 self.DismissContextualButtons() |
911 self.DismissContextualButtons() |
906 |
912 |
|
913 def RefreshButtonsState(self, refresh_positions=False): |
|
914 width, height = self.GetSize() |
|
915 min_width, min_height = self.Parent.GetCanvasMinSize() |
|
916 for button, size in zip(self.Buttons, |
|
917 [min_height, SIZE_MIDDLE, SIZE_MAXI]): |
|
918 if size == height and button.IsEnabled(): |
|
919 button.Disable() |
|
920 refresh_positions = True |
|
921 elif not button.IsEnabled(): |
|
922 button.Enable() |
|
923 refresh_positions = True |
|
924 if refresh_positions: |
|
925 offset = 0 |
|
926 buttons = self.Buttons[:] |
|
927 buttons.reverse() |
|
928 for button in buttons: |
|
929 if button.IsShown() and button.IsEnabled(): |
|
930 w, h = button.GetSize() |
|
931 button.SetPosition(width - 5 - w - offset, 5) |
|
932 offset += w + 2 |
|
933 self.ParentWindow.ForceRefresh() |
|
934 |
907 def OnResizeWindow(self, event): |
935 def OnResizeWindow(self, event): |
908 width, height = self.GetSize() |
936 wx.CallAfter(self.RefreshButtonsState, True) |
909 offset = 0 |
|
910 buttons = self.Buttons[:] |
|
911 buttons.reverse() |
|
912 for button in buttons: |
|
913 w, h = button.GetSize() |
|
914 button.SetPosition(width - 5 - w - offset, 5) |
|
915 offset += w + 2 |
|
916 event.Skip() |
937 event.Skip() |
917 |
938 |
918 class DebugVariableGraphic(DebugVariableViewer): |
939 class DebugVariableGraphic(DebugVariableViewer): |
919 |
940 |
920 def __init__(self, parent, window, items, graph_type): |
941 def __init__(self, parent, window, items, graph_type): |
935 self.Canvas.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self)) |
957 self.Canvas.SetDropTarget(DebugVariableDropTarget(self.ParentWindow, self)) |
936 self.Canvas.mpl_connect('button_press_event', self.OnCanvasButtonPressed) |
958 self.Canvas.mpl_connect('button_press_event', self.OnCanvasButtonPressed) |
937 self.Canvas.mpl_connect('motion_notify_event', self.OnCanvasMotion) |
959 self.Canvas.mpl_connect('motion_notify_event', self.OnCanvasMotion) |
938 self.Canvas.mpl_connect('button_release_event', self.OnCanvasButtonReleased) |
960 self.Canvas.mpl_connect('button_release_event', self.OnCanvasButtonReleased) |
939 self.Canvas.mpl_connect('scroll_event', self.OnCanvasScroll) |
961 self.Canvas.mpl_connect('scroll_event', self.OnCanvasScroll) |
|
962 self.Canvas.Bind(wx.EVT_LEAVE_WINDOW, self.OnCanvasLeave) |
940 |
963 |
941 main_sizer.AddWindow(self.Canvas, 1, flag=wx.GROW) |
964 main_sizer.AddWindow(self.Canvas, 1, flag=wx.GROW) |
942 self.SetSizer(main_sizer) |
965 self.SetSizer(main_sizer) |
943 |
966 |
944 self.ResetGraphics() |
967 self.ResetGraphics() |
969 self.AxesLabels[1].set_position((0.05, 2 * CANVAS_PADDING * graph_ratio)) |
992 self.AxesLabels[1].set_position((0.05, 2 * CANVAS_PADDING * graph_ratio)) |
970 self.Labels[1].set_position((0.05, 1.0 - CANVAS_PADDING * graph_ratio)) |
993 self.Labels[1].set_position((0.05, 1.0 - CANVAS_PADDING * graph_ratio)) |
971 |
994 |
972 self.Figure.subplots_adjust() |
995 self.Figure.subplots_adjust() |
973 |
996 |
|
997 def GetCanvasMinSize(self): |
|
998 return wx.Size(200, |
|
999 CANVAS_BORDER[0] + CANVAS_BORDER[1] + |
|
1000 2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items)) |
|
1001 |
974 def SetCanvasSize(self, width, height): |
1002 def SetCanvasSize(self, width, height): |
975 height = max(height, |
1003 height = max(height, self.GetCanvasMinSize()[1]) |
976 CANVAS_BORDER[0] + CANVAS_BORDER[1] + |
|
977 2 * CANVAS_PADDING + VALUE_LABEL_HEIGHT * len(self.Items)) |
|
978 self.Canvas.SetMinSize(wx.Size(width, height)) |
1004 self.Canvas.SetMinSize(wx.Size(width, height)) |
979 self.RefreshLabelsPosition(height) |
1005 self.RefreshLabelsPosition(height) |
980 self.ParentWindow.RefreshGraphicsSizer() |
1006 self.ParentWindow.RefreshGraphicsSizer() |
981 |
1007 |
982 def GetAxesBoundingBox(self, absolute=False): |
1008 def GetAxesBoundingBox(self, absolute=False): |
988 return bbox |
1014 return bbox |
989 |
1015 |
990 def OnCanvasButtonPressed(self, event): |
1016 def OnCanvasButtonPressed(self, event): |
991 width, height = self.Canvas.GetSize() |
1017 width, height = self.Canvas.GetSize() |
992 x, y = event.x, height - event.y |
1018 x, y = event.x, height - event.y |
993 if not self.Canvas.IsOverButton(x, y) and not self.Is3DCanvas(): |
1019 if not self.Canvas.IsOverButton(x, y): |
994 rect = self.GetAxesBoundingBox() |
1020 if event.inaxes == self.Axes and not self.Is3DCanvas(): |
995 if rect.InsideXY(x, y): |
|
996 self.MouseStartPos = wx.Point(x, y) |
1021 self.MouseStartPos = wx.Point(x, y) |
997 item_idx = None |
1022 item_idx = None |
998 for i, t in ([pair for pair in enumerate(self.AxesLabels)] + |
1023 for i, t in ([pair for pair in enumerate(self.AxesLabels)] + |
999 [pair for pair in enumerate(self.Labels)]): |
1024 [pair for pair in enumerate(self.Labels)]): |
1000 (x0, y0), (x1, y1) = t.get_window_extent().get_points() |
1025 (x0, y0), (x1, y1) = t.get_window_extent().get_points() |
1001 rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0) |
1026 rect = wx.Rect(x0, height - y1, x1 - x0, y1 - y0) |
1002 if rect.InsideXY(x, y): |
1027 if rect.InsideXY(x, y): |
1003 item_idx = i |
1028 item_idx = i |
1004 break |
1029 break |
1005 if item_idx is not None: |
1030 if item_idx is not None: |
1006 self.Canvas.ShowButtons(False) |
1031 self.Canvas.ShowButtons(False) |
1007 self.Canvas.DismissContextualButtons() |
1032 self.Canvas.DismissContextualButtons() |
1008 xw, yw = self.GetPosition() |
1033 xw, yw = self.GetPosition() |
1009 self.ParentWindow.StartDragNDrop(self, |
1034 self.ParentWindow.StartDragNDrop(self, |
1010 self.Items[item_idx], x + xw, y + yw, x + xw, y + yw) |
1035 self.Items[item_idx], x + xw, y + yw, x + xw, y + yw) |
1011 elif event.button == 1 and event.inaxes == self.Axes: |
1036 elif event.button == 1 and event.inaxes == self.Axes: |
1012 self.StartCursorTick = self.CursorTick |
1037 self.StartCursorTick = self.CursorTick |
1013 self.HandleCursorMove(event) |
1038 self.HandleCursorMove(event) |
1014 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: |
1039 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: |
1015 width, height = self.Canvas.GetSize() |
1040 width, height = self.Canvas.GetSize() |
1016 start_tick, end_tick = self.ParentWindow.GetRange() |
1041 start_tick, end_tick = self.ParentWindow.GetRange() |
|
1042 self.StartCursorTick = start_tick |
|
1043 |
|
1044 elif event.button == 1 and event.y <= 5: |
1017 self.MouseStartPos = wx.Point(x, y) |
1045 self.MouseStartPos = wx.Point(x, y) |
1018 self.StartCursorTick = start_tick |
1046 self.CanvasStartSize = self.Canvas.GetSize() |
1019 |
1047 |
1020 def OnCanvasButtonReleased(self, event): |
1048 def OnCanvasButtonReleased(self, event): |
1021 if self.ParentWindow.IsDragging(): |
1049 if self.ParentWindow.IsDragging(): |
1022 width, height = self.Canvas.GetSize() |
1050 width, height = self.Canvas.GetSize() |
1023 xw, yw = self.GetPosition() |
1051 xw, yw = self.GetPosition() |
1026 xw + event.x, |
1054 xw + event.x, |
1027 yw + height - event.y) |
1055 yw + height - event.y) |
1028 else: |
1056 else: |
1029 self.MouseStartPos = None |
1057 self.MouseStartPos = None |
1030 self.StartCursorTick = None |
1058 self.StartCursorTick = None |
|
1059 self.CanvasStartSize = None |
1031 width, height = self.Canvas.GetSize() |
1060 width, height = self.Canvas.GetSize() |
1032 self.Canvas.HandleButtons(event.x, height - event.y) |
1061 self.Canvas.HandleButtons(event.x, height - event.y) |
|
1062 if event.y > 5 and self.Canvas.SetHighlight(HIGHLIGHT_NONE): |
|
1063 self.Canvas.SetCursor(wx.NullCursor) |
|
1064 self.ParentWindow.ForceRefresh() |
1033 |
1065 |
1034 def OnCanvasMotion(self, event): |
1066 def OnCanvasMotion(self, event): |
1035 width, height = self.Canvas.GetSize() |
1067 width, height = self.Canvas.GetSize() |
1036 if self.ParentWindow.IsDragging(): |
1068 if self.ParentWindow.IsDragging(): |
1037 xw, yw = self.GetPosition() |
1069 xw, yw = self.GetPosition() |
1038 self.ParentWindow.MoveDragNDrop( |
1070 self.ParentWindow.MoveDragNDrop( |
1039 xw + event.x, |
1071 xw + event.x, |
1040 yw + height - event.y) |
1072 yw + height - event.y) |
1041 elif not self.Is3DCanvas(): |
1073 else: |
1042 if event.button == 1: |
1074 if not self.Is3DCanvas(): |
1043 if event.inaxes == self.Axes: |
1075 if event.button == 1 and self.CanvasStartSize is None: |
1044 if self.MouseStartPos is not None: |
1076 if event.inaxes == self.Axes: |
1045 self.HandleCursorMove(event) |
1077 if self.MouseStartPos is not None: |
1046 elif self.MouseStartPos is not None and len(self.Items) == 1: |
1078 self.HandleCursorMove(event) |
1047 xw, yw = self.GetPosition() |
1079 elif self.MouseStartPos is not None and len(self.Items) == 1: |
1048 self.ParentWindow.SetCursorTick(self.StartCursorTick) |
1080 xw, yw = self.GetPosition() |
1049 self.ParentWindow.StartDragNDrop(self, |
1081 self.ParentWindow.SetCursorTick(self.StartCursorTick) |
1050 self.Items[0], |
1082 self.ParentWindow.StartDragNDrop(self, |
1051 event.x + xw, height - event.y + yw, |
1083 self.Items[0], |
1052 self.MouseStartPos.x + xw, self.MouseStartPos.y + yw) |
1084 event.x + xw, height - event.y + yw, |
1053 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: |
1085 self.MouseStartPos.x + xw, self.MouseStartPos.y + yw) |
1054 start_tick, end_tick = self.ParentWindow.GetRange() |
1086 elif event.button == 2 and self.GraphType == GRAPH_PARALLEL: |
1055 rect = self.GetAxesBoundingBox() |
1087 start_tick, end_tick = self.ParentWindow.GetRange() |
1056 self.ParentWindow.SetCanvasPosition( |
1088 rect = self.GetAxesBoundingBox() |
1057 self.StartCursorTick + (self.MouseStartPos.x - event.x) * |
1089 self.ParentWindow.SetCanvasPosition( |
1058 (end_tick - start_tick) / rect.width) |
1090 self.StartCursorTick + (self.MouseStartPos.x - event.x) * |
|
1091 (end_tick - start_tick) / rect.width) |
|
1092 |
|
1093 if event.button == 1 and self.CanvasStartSize is not None: |
|
1094 width, height = self.Canvas.GetSize() |
|
1095 self.SetCanvasSize(width, |
|
1096 self.CanvasStartSize.height + height - event.y - self.MouseStartPos.y) |
|
1097 |
1059 elif event.button in [None, "up", "down"]: |
1098 elif event.button in [None, "up", "down"]: |
1060 if self.GraphType == GRAPH_PARALLEL: |
1099 if self.GraphType == GRAPH_PARALLEL: |
1061 orientation = [wx.RIGHT] * len(self.AxesLabels) + [wx.LEFT] * len(self.Labels) |
1100 orientation = [wx.RIGHT] * len(self.AxesLabels) + [wx.LEFT] * len(self.Labels) |
1062 elif len(self.AxesLabels) > 0: |
1101 elif len(self.AxesLabels) > 0: |
1063 orientation = [wx.RIGHT, wx.TOP, wx.LEFT, wx.BOTTOM] |
1102 orientation = [wx.RIGHT, wx.TOP, wx.LEFT, wx.BOTTOM] |
1064 item_idx = None |
1103 item_idx = None |
1065 item_style = None |
1104 item_style = None |
1066 for (i, t), style in zip([pair for pair in enumerate(self.AxesLabels)] + |
1105 for (i, t), style in zip([pair for pair in enumerate(self.AxesLabels)] + |
1075 if item_idx is not None: |
1114 if item_idx is not None: |
1076 self.Canvas.PopupContextualButtons(self.Items[item_idx], rect, item_style) |
1115 self.Canvas.PopupContextualButtons(self.Items[item_idx], rect, item_style) |
1077 return |
1116 return |
1078 if not self.Canvas.IsOverContextualButton(event.x, height - event.y): |
1117 if not self.Canvas.IsOverContextualButton(event.x, height - event.y): |
1079 self.Canvas.DismissContextualButtons() |
1118 self.Canvas.DismissContextualButtons() |
|
1119 |
|
1120 if event.y <= 5: |
|
1121 if self.Canvas.SetHighlight(HIGHLIGHT_RESIZE): |
|
1122 self.Canvas.SetCursor(wx.StockCursor(wx.CURSOR_SIZENS)) |
|
1123 self.ParentWindow.ForceRefresh() |
|
1124 else: |
|
1125 if self.Canvas.SetHighlight(HIGHLIGHT_NONE): |
|
1126 self.Canvas.SetCursor(wx.NullCursor) |
|
1127 self.ParentWindow.ForceRefresh() |
1080 |
1128 |
1081 def OnCanvasMouseDragging(self, x, y): |
1129 def OnCanvasMouseDragging(self, x, y): |
1082 xw, yw = self.GetPosition() |
1130 xw, yw = self.GetPosition() |
1083 self.ParentWindow.RefreshHighlight(x + xw, y + yw) |
1131 self.ParentWindow.RefreshHighlight(x + xw, y + yw) |
1084 |
1132 |
1106 start_tick, end_tick = self.ParentWindow.GetRange() |
1154 start_tick, end_tick = self.ParentWindow.GetRange() |
1107 tick = (start_tick + end_tick) / 2. |
1155 tick = (start_tick + end_tick) / 2. |
1108 else: |
1156 else: |
1109 tick = event.xdata |
1157 tick = event.xdata |
1110 self.ParentWindow.ChangeRange(int(-event.step) / 3, tick) |
1158 self.ParentWindow.ChangeRange(int(-event.step) / 3, tick) |
|
1159 |
|
1160 def OnCanvasLeave(self, event): |
|
1161 if self.CanvasStartSize is None and self.Canvas.SetHighlight(HIGHLIGHT_NONE): |
|
1162 self.Canvas.SetCursor(wx.NullCursor) |
|
1163 self.ParentWindow.ForceRefresh() |
|
1164 event.Skip() |
1111 |
1165 |
1112 def HighlightCanvas(self, highlight): |
1166 def HighlightCanvas(self, highlight): |
1113 self.Canvas.SetHighlight(highlight) |
1167 self.Canvas.SetHighlight(highlight) |
1114 |
1168 |
1115 def HandleCursorMove(self, event): |
1169 def HandleCursorMove(self, event): |