From 374f75938b476a0933cbcbb6488e1e608fc7ae6a Mon Sep 17 00:00:00 2001 From: Colin Eles Date: Wed, 15 Sep 2010 17:47:14 +0000 Subject: [PATCH] undo/redo working better now, still a little bugg y git-svn-id: https://groke.mcmaster.ca/svn/grad/colin/trunk/TableTool@6209 57e6efec-57d4-0310-aeb1-a6c144bb1a8b --- @Cell/pb_call.m | 5 +- @GUI/GUI.m | 3 +- @GUI/init.m | 15 ++-- @GUI/textbox_callback.m | 3 +- @GUI/update_undoredo.m | 20 ++++++ @Grid/pb_delete_call.m | 155 +++++++++++++++++++++++----------------- @Grid/pb_new_call.m | 3 +- 7 files changed, 128 insertions(+), 76 deletions(-) create mode 100644 @GUI/update_undoredo.m diff --git a/@Cell/pb_call.m b/@Cell/pb_call.m index b172610..78c30e0 100644 --- a/@Cell/pb_call.m +++ b/@Cell/pb_call.m @@ -26,7 +26,10 @@ undo_data.subgrid = []; gui.undo_man.new_state(undo_data); - end + end + + gui.update_undoredo + end diff --git a/@GUI/GUI.m b/@GUI/GUI.m index 5edf0df..31d0728 100644 --- a/@GUI/GUI.m +++ b/@GUI/GUI.m @@ -61,7 +61,8 @@ classdef GUI < handle multi_opt_out = []; version = '0.1'; undo_man = []; - + undo_opt = []; + redo_opt = []; end methods diff --git a/@GUI/init.m b/@GUI/init.m index d2be60b..d3b03b8 100644 --- a/@GUI/init.m +++ b/@GUI/init.m @@ -103,6 +103,7 @@ 'FontWeight','bold',... 'FontSize',12,... 'Max',2.0,... + 'KeyPressFcn',@(src,event)textbox_callback(object,src,event),... 'BackgroundColor',[1 1 1]); % input list label @@ -119,6 +120,7 @@ 'FontWeight','bold',... 'Max',2.0,... 'FontSize',12,... + 'KeyPressFcn',@(src,event)textbox_callback(object,src,event),... 'BackgroundColor',[1 1 1]); %object.multi_grp = uibuttongroup(... @@ -163,8 +165,8 @@ uimenu(filemenu,'Label','Save to Block','Separator','on','Accelerator','s','Callback',@(src,event)save_call(object,src,event)); uimenu(filemenu,'Label','Save to M-File','Callback',@(src,event)save_ext_call(object,src,event)); uimenu(filemenu,'Label','Close','Accelerator','w','Separator','on','Callback',@(src,event)close_fig(object,src,event)); - uimenu(editmenu,'Label','Undo','Accelerator','z','Callback',@(src,event)undo_call(object,src,event)); - uimenu(editmenu,'Label','Redo','Accelerator','r','Callback',@(src,event)redo_call(object,src,event)); + object.undo_opt = uimenu(editmenu,'Label','Undo','Accelerator','z','Callback',@(src,event)undo_call(object,src,event)); + object.redo_opt = uimenu(editmenu,'Label','Redo','Accelerator','r','Callback',@(src,event)redo_call(object,src,event)); uimenu(editmenu,'Label','Show edit controls','Checked','on','Separator','on'); uimenu(editmenu,'Label','Ports and Data Manager','Accelerator','p','Callback',@(src,event)input_call(object,src,event)); multi_mode_menu = uimenu(editmenu,'Label','Output Mode'); @@ -193,17 +195,17 @@ end - + object.undo_man = UndoManager(); + object.update_Statusbar; object.update_multi_check_status; - - + object.update_undoredo; + object.PVS = PVS_checker(object.Data); object.EMLGen = EMLGenerator(object.Data); - object.undo_man = UndoManager(); object.initialized = 1; @@ -212,6 +214,7 @@ + end diff --git a/@GUI/textbox_callback.m b/@GUI/textbox_callback.m index 9175505..afec906 100644 --- a/@GUI/textbox_callback.m +++ b/@GUI/textbox_callback.m @@ -50,7 +50,8 @@ %end - + object.update_undoredo + end \ No newline at end of file diff --git a/@GUI/update_undoredo.m b/@GUI/update_undoredo.m new file mode 100644 index 0000000..48d1d43 --- /dev/null +++ b/@GUI/update_undoredo.m @@ -0,0 +1,20 @@ +function [ ] = update_undoredo( object ) +% updates the menu options so that they are either enabled or disabled + +if (object.undo_man.undo_level == 0) + set(object.redo_opt,'Enable','off'); +else + set(object.redo_opt,'Enable','on'); +end + +if (object.undo_man.current_depth == 0) + set(object.undo_opt,'Enable','off'); +else + set(object.undo_opt,'Enable','on'); +end + + + + +end + diff --git a/@Grid/pb_delete_call.m b/@Grid/pb_delete_call.m index 1241ae7..2e916b2 100644 --- a/@Grid/pb_delete_call.m +++ b/@Grid/pb_delete_call.m @@ -1,72 +1,95 @@ - %% pb_delete_call - % callback function for when user clicks on the delete cell - % button. - % inputs: - % object:Grid - current Grid object - % src:double - source of the callback calling - % event:eventdata - event that triggered the callback - % outputs: - % none - function [] = pb_delete_call(object,src,event) - gui = get(src,'userdata'); - gui.save_data; - deleted_cell = object.cells(end); - - if isempty(event) || event ~= 1 - - % create clone of cell -% n_Cell = new_Cell(); -% n_Cell.cond_text = deleted_cell.cond_text; -% if (~isempty(object.cells(i).subgrid)) -% n_Cell.subgrid = Grid(n_Cell.cell_index,n_Cell); -% dest_grid.cells(i).subgrid.set_rGrid(dest_grid.cells(i).parent_grid.rGrid); -% object.cells(i).subgrid.clone(dest_grid.cells(i).subgrid,object.cells(i).subgrid.grid_index,dest_grid.cells(i)) -% else - - - undo_data.action = 3; +%% pb_delete_call +% callback function for when user clicks on the delete cell +% button. +% inputs: +% object:Grid - current Grid object +% src:double - source of the callback calling +% event:eventdata - event that triggered the callback +% outputs: +% none +function [] = pb_delete_call(object,src,event) +gui = get(src,'userdata'); +gui.save_data; +deleted_cell = object.cells(end); + + + +% deleted last cell in grid +if size(object.cells,2) == 1 + if (~isempty(object.parent_cell)) + + + if isempty(event) || event ~= 1 + + undo_data.action = 5; undo_data.grid = object; - undo_data.cell = deleted_cell; + undo_data.cell = object.parent_cell; undo_data.text = []; - undo_data.subgrid = []; - - gui.undo_man.new_state(undo_data); + undo_data.subgrid = deleted_cell; - end - + gui.undo_man.new_state(undo_data); - - % button could be pressed in the left or top grid so we need to - % try to remove the result cell associated with either case. - object.rGrid.delete_g2s(deleted_cell); - object.rGrid.delete_g1s(deleted_cell); - deleted_cell.delete_Cell - object.cells(end) = []; - - % deleted last cell in grid - if size(object.cells,2) == 0 - if (~isempty(object.parent_cell)) - - object.parent_cell.subgrid = []; - object.parent_cell.pb_flag = 1; - delete(object.new_cell_pb); - delete(object.delete_cell_pb); - object.rGrid.refresh; - - - - end - end - if size(object.cells,2) == 1 && isempty(object.parent_cell) - set(object.delete_cell_pb,'Enable','off'); - end - gui.reset_wh(); - gui.draw_allgrids(0); - - - - - end - \ No newline at end of file + end + + +else + if isempty(event) || event ~= 1 + + undo_data.action = 3; + undo_data.grid = object; + undo_data.cell = deleted_cell; + undo_data.text = []; + undo_data.subgrid = []; + + gui.undo_man.new_state(undo_data); + + end + +end + +% button could be pressed in the left or top grid so we need to +% try to remove the result cell associated with either case. +object.rGrid.delete_g2s(deleted_cell); +object.rGrid.delete_g1s(deleted_cell); +deleted_cell.delete_Cell +object.cells(end) = []; + + + +% deleted last cell in grid +if size(object.cells,2) == 0 + if (~isempty(object.parent_cell)) + + + object.parent_cell.subgrid = []; + object.parent_cell.pb_flag = 1; + delete(object.new_cell_pb); + delete(object.delete_cell_pb); + object.rGrid.refresh; + + + end + + + +end + + + + + +if size(object.cells,2) == 1 && isempty(object.parent_cell) + set(object.delete_cell_pb,'Enable','off'); +end +gui.reset_wh(); +gui.draw_allgrids(0); + + +gui.update_undoredo + + + +end + diff --git a/@Grid/pb_new_call.m b/@Grid/pb_new_call.m index 2485061..2a9c4d7 100644 --- a/@Grid/pb_new_call.m +++ b/@Grid/pb_new_call.m @@ -30,7 +30,8 @@ gui.undo_man.new_state(undo_data); end - + gui.update_undoredo + end -- GitLab