* Tasedit: fixed selection bugs in Set Marker, SelectMidMarkers and DeleteFrames

* Tasedit: Edit->Clone Frame(s) (Shift-Insert)
* Tasedit: 7 digits in Frame#
* utils\xstring.cpp: new U32ToDecStr
This commit is contained in:
ansstuff 2011-10-03 17:29:33 +00:00
parent 485c3f57df
commit ec37ecd417
8 changed files with 178 additions and 67 deletions

View File

@ -232,7 +232,7 @@ BEGIN
END END
POPUP "&Edit" POPUP "&Edit"
BEGIN BEGIN
MENUITEM "&Select All", ID_EDIT_SELECTALL MENUITEM "Select &All", ID_EDIT_SELECTALL
MENUITEM "Select mid &Markers\tCtrl+A", ID_EDIT_SELECTMIDMARKERS MENUITEM "Select mid &Markers\tCtrl+A", ID_EDIT_SELECTMIDMARKERS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "Cu&t\tCtrl+X", ID_TASEDIT_CUT MENUITEM "Cu&t\tCtrl+X", ID_TASEDIT_CUT
@ -241,8 +241,9 @@ BEGIN
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "C&lear\tDelete", ID_EDIT_CLEAR MENUITEM "C&lear\tDelete", ID_EDIT_CLEAR
MENUITEM "&Delete\tCtrl+Del", ID_TASEDIT_DELETE MENUITEM "&Delete\tCtrl+Del", ID_TASEDIT_DELETE
MENUITEM "&Insert Frames\tCtrl+Ins", ID_EDIT_INSERTFRAMES MENUITEM "&Insert\tCtrl+Ins", ID_EDIT_INSERTFRAMES
MENUITEM "Insert # of Frames\tInsert", ID_EDIT_INSERT MENUITEM "Insert # of Frames\tInsert", ID_EDIT_INSERT
MENUITEM "Cl&one\tShift+Ins", ID_EDIT_CLONEFRAMES
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "T&runcate movie\tCtrl+T", ID_EDIT_TRUNCATE MENUITEM "T&runcate movie\tCtrl+T", ID_EDIT_TRUNCATE
END END
@ -346,10 +347,11 @@ BEGIN
BEGIN BEGIN
MENUITEM "Select mid &Markers", ID_SELECTED_SELECTMIDMARKERS MENUITEM "Select mid &Markers", ID_SELECTED_SELECTMIDMARKERS
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "&Insert Frame(s)", ID_CONTEXT_SELECTED_INSERTFRAMES MENUITEM "C&lear", ID_CONTEXT_SELECTED_CLEARFRAMES
MENUITEM "&Delete", ID_CONTEXT_SELECTED_DELETEFRAMES
MENUITEM "&Insert", ID_CONTEXT_SELECTED_INSERTFRAMES
MENUITEM "Insert # of Frames", ID_CONTEXT_SELECTED_INSERTFRAMES2 MENUITEM "Insert # of Frames", ID_CONTEXT_SELECTED_INSERTFRAMES2
MENUITEM "&Delete Frame(s)", ID_CONTEXT_SELECTED_DELETEFRAMES MENUITEM "Cl&one", ID_SELECTED_CLONE
MENUITEM "C&lear Frame(s)", ID_CONTEXT_SELECTED_CLEARFRAMES
MENUITEM SEPARATOR MENUITEM SEPARATOR
MENUITEM "T&runcate movie", ID_CONTEXT_SELECTED_TRUNCATE MENUITEM "T&runcate movie", ID_CONTEXT_SELECTED_TRUNCATE
END END
@ -1340,38 +1342,38 @@ BEGIN
EDITTEXT IDC_LABEL_NEWPPUUSED,76,166,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP EDITTEXT IDC_LABEL_NEWPPUUSED,76,166,155,12,ES_READONLY | NOT WS_BORDER | NOT WS_TABSTOP
END END
TASEDIT DIALOGEX 0, 0, 445, 381 TASEDIT DIALOGEX 0, 0, 433, 381
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "TAS Editor" CAPTION "TAS Editor"
MENU TASEDITMENU MENU TASEDITMENU
FONT 8, "MS Shell Dlg", 400, 0, 0x1 FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN BEGIN
CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | LVS_NOSORTHEADER | WS_BORDER,7,5,310,370 CONTROL "",IDC_LIST1,"SysListView32",LVS_REPORT | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_OWNERDATA | LVS_NOSORTHEADER | WS_BORDER,6,5,298,370
GROUPBOX "Playback control",IDC_STATIC,322,5,118,62,BS_CENTER,WS_EX_RIGHT GROUPBOX "Playback control",IDC_STATIC,310,5,118,62,BS_CENTER,WS_EX_RIGHT
PUSHBUTTON "<<",TASEDIT_REWIND_FULL,326,14,22,14,NOT WS_TABSTOP PUSHBUTTON "<<",TASEDIT_REWIND_FULL,314,14,22,14,NOT WS_TABSTOP
PUSHBUTTON "<",TASEDIT_REWIND,348,14,22,14,NOT WS_TABSTOP PUSHBUTTON "<",TASEDIT_REWIND,336,14,22,14,NOT WS_TABSTOP
PUSHBUTTON "||",TASEDIT_PLAYSTOP,370,14,22,14,NOT WS_TABSTOP PUSHBUTTON "||",TASEDIT_PLAYSTOP,358,14,22,14,NOT WS_TABSTOP
PUSHBUTTON ">",TASEDIT_FORWARD,392,14,22,14,NOT WS_TABSTOP PUSHBUTTON ">",TASEDIT_FORWARD,380,14,22,14,NOT WS_TABSTOP
PUSHBUTTON ">>",TASEDIT_FORWARD_FULL,414,14,22,14,NOT WS_TABSTOP PUSHBUTTON ">>",TASEDIT_FORWARD_FULL,402,14,22,14,NOT WS_TABSTOP
CONTROL "",IDC_PROGRESS_BUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,326,42,110,10 CONTROL "",IDC_PROGRESS_BUTTON,"Button",BS_OWNERDRAW | WS_TABSTOP,314,42,110,10
CONTROL "",IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER,326,44,110,6 CONTROL "",IDC_PROGRESS1,"msctls_progress32",PBS_SMOOTH | WS_BORDER,314,44,110,6
CONTROL " Follow cursor",CHECK_FOLLOW_CURSOR,"Button",BS_AUTOCHECKBOX,327,30,105,12 CONTROL " Follow cursor",CHECK_FOLLOW_CURSOR,"Button",BS_AUTOCHECKBOX,315,30,105,12
CONTROL " Auto-restore last position",CHECK_AUTORESTORE_PLAYBACK, CONTROL " Auto-restore last position",CHECK_AUTORESTORE_PLAYBACK,
"Button",BS_AUTOCHECKBOX,327,53,105,12 "Button",BS_AUTOCHECKBOX,315,53,105,12
GROUPBOX "Recording input",IDC_STATIC,322,68,118,48,BS_CENTER,WS_EX_RIGHT GROUPBOX "Recording input",IDC_STATIC,310,68,118,48,BS_CENTER,WS_EX_RIGHT
GROUPBOX "Editing",IDC_STATIC,322,118,118,29,BS_CENTER,WS_EX_RIGHT GROUPBOX "Editing",IDC_STATIC,310,118,118,29,BS_CENTER,WS_EX_RIGHT
GROUPBOX "Bookmarks",IDC_STATIC,322,148,118,103,BS_CENTER,WS_EX_RIGHT GROUPBOX "Bookmarks",IDC_STATIC,310,148,118,103,BS_CENTER,WS_EX_RIGHT
CONTROL "",IDC_LIST3,"SysListView32",LVS_LIST | LVS_ALIGNLEFT | LVS_OWNERDATA | LVS_NOSCROLL | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER,327,159,108,88 CONTROL "",IDC_LIST3,"SysListView32",LVS_LIST | LVS_ALIGNLEFT | LVS_OWNERDATA | LVS_NOSCROLL | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER,315,159,108,88
GROUPBOX "Project Input Logs",IDC_STATIC,322,252,118,123,BS_CENTER,WS_EX_RIGHT GROUPBOX "Project Input Logs",IDC_STATIC,310,252,118,123,BS_CENTER,WS_EX_RIGHT
CONTROL "",IDC_LIST2,"SysListView32",LVS_LIST | LVS_ALIGNLEFT | LVS_OWNERDATA | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER,327,263,108,108,WS_EX_LEFTSCROLLBAR CONTROL "",IDC_LIST2,"SysListView32",LVS_LIST | LVS_ALIGNLEFT | LVS_OWNERDATA | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER,315,263,108,108,WS_EX_LEFTSCROLLBAR
CONTROL " OFF",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,328,78,29,10 CONTROL " OFF",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,316,78,29,10
CONTROL " ON",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,328,91,29,10 CONTROL " ON",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,316,91,29,10
CONTROL " 1P",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,380,78,25,10 CONTROL " 1P",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,368,78,25,10
CONTROL " 2P",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,409,78,23,10 CONTROL " 2P",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,397,78,23,10
CONTROL " 3P",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,380,91,25,10 CONTROL " 3P",IDC_RADIO5,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,368,91,25,10
CONTROL " 4P",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,409,91,23,10 CONTROL " 4P",IDC_RADIO6,"Button",BS_AUTORADIOBUTTON | WS_DISABLED,397,91,23,10
CONTROL " Superimpose",IDC_SUPERIMPOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,328,104,55,10 CONTROL " Superimpose",IDC_SUPERIMPOSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,316,104,55,10
CONTROL " Omit blank",IDC_OMITBLANK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,387,104,49,10 CONTROL " Omit blank",IDC_OMITBLANK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,375,104,49,10
END END
ASSEMBLER DIALOGEX 0, 0, 202, 135 ASSEMBLER DIALOGEX 0, 0, 202, 135
@ -2014,6 +2016,7 @@ END
IDR_ACCELERATOR1 ACCELERATORS IDR_ACCELERATOR1 ACCELERATORS
BEGIN BEGIN
"A", ACCEL_CTRL_A, VIRTKEY, CONTROL, NOINVERT
"C", ACCEL_CTRL_C, VIRTKEY, CONTROL, NOINVERT "C", ACCEL_CTRL_C, VIRTKEY, CONTROL, NOINVERT
VK_DELETE, ACCEL_CTRL_DELETE, VIRTKEY, CONTROL, NOINVERT VK_DELETE, ACCEL_CTRL_DELETE, VIRTKEY, CONTROL, NOINVERT
"F", ACCEL_CTRL_F, VIRTKEY, CONTROL, NOINVERT "F", ACCEL_CTRL_F, VIRTKEY, CONTROL, NOINVERT
@ -2025,7 +2028,7 @@ BEGIN
"X", ACCEL_CTRL_X, VIRTKEY, CONTROL, NOINVERT "X", ACCEL_CTRL_X, VIRTKEY, CONTROL, NOINVERT
VK_DELETE, ACCEL_DEL, VIRTKEY, NOINVERT VK_DELETE, ACCEL_DEL, VIRTKEY, NOINVERT
VK_INSERT, ACCEL_INS, VIRTKEY, NOINVERT VK_INSERT, ACCEL_INS, VIRTKEY, NOINVERT
"A", ACCEL_CTRL_A, VIRTKEY, CONTROL, NOINVERT VK_INSERT, ACCEL_SHIFT_INS, VIRTKEY, SHIFT, NOINVERT
END END
IDR_RWACCELERATOR ACCELERATORS IDR_RWACCELERATOR ACCELERATORS

View File

@ -847,6 +847,10 @@
#define ACCEL_CTRL_A 40455 #define ACCEL_CTRL_A 40455
#define ID_EDIT_SELECTMIDMARKERS 40457 #define ID_EDIT_SELECTMIDMARKERS 40457
#define ID_SELECTED_SELECTMIDMARKERS 40458 #define ID_SELECTED_SELECTMIDMARKERS 40458
#define ID_EDIT_CLONEFRAME 40459
#define ID_EDIT_CLONEFRAMES 40460
#define ACCEL_SHIFT_INS 40461
#define ID_SELECTED_CLONE 40463
#define IDC_DEBUGGER_ICONTRAY 55535 #define IDC_DEBUGGER_ICONTRAY 55535
#define MW_ValueLabel2 65423 #define MW_ValueLabel2 65423
#define MW_ValueLabel1 65426 #define MW_ValueLabel1 65426
@ -856,7 +860,7 @@
#ifdef APSTUDIO_INVOKED #ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS #ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 160 #define _APS_NEXT_RESOURCE_VALUE 160
#define _APS_NEXT_COMMAND_VALUE 40459 #define _APS_NEXT_COMMAND_VALUE 40464
#define _APS_NEXT_CONTROL_VALUE 1263 #define _APS_NEXT_CONTROL_VALUE 1263
#define _APS_NEXT_SYMED_VALUE 101 #define _APS_NEXT_SYMED_VALUE 101
#endif #endif

View File

@ -35,6 +35,7 @@ bool old_forward_button_state, forward_button_state;
int button_hold_time; int button_hold_time;
int seeking_start_frame = 0; int seeking_start_frame = 0;
bool TASEdit_focus = false; bool TASEdit_focus = false;
int listItems; // number of items in list
// saved FCEU config // saved FCEU config
int saved_eoptions; int saved_eoptions;
int saved_EnableAutosave; int saved_EnableAutosave;
@ -91,8 +92,10 @@ static void GetDispInfo(NMLVDISPINFO* nmlvDispInfo)
break; break;
case COLUMN_FRAMENUM: case COLUMN_FRAMENUM:
case COLUMN_FRAMENUM2: case COLUMN_FRAMENUM2:
U32ToDecStr(item.pszText,item.iItem); {
break; U32ToDecStr(item.pszText,item.iItem,DIGITS_IN_FRAMENUM);
break;
}
case COLUMN_JOYPAD1_A: case COLUMN_JOYPAD1_B: case COLUMN_JOYPAD1_S: case COLUMN_JOYPAD1_T: case COLUMN_JOYPAD1_A: case COLUMN_JOYPAD1_B: case COLUMN_JOYPAD1_S: case COLUMN_JOYPAD1_T:
case COLUMN_JOYPAD1_U: case COLUMN_JOYPAD1_D: case COLUMN_JOYPAD1_L: case COLUMN_JOYPAD1_R: case COLUMN_JOYPAD1_U: case COLUMN_JOYPAD1_D: case COLUMN_JOYPAD1_L: case COLUMN_JOYPAD1_R:
case COLUMN_JOYPAD2_A: case COLUMN_JOYPAD2_B: case COLUMN_JOYPAD2_S: case COLUMN_JOYPAD2_T: case COLUMN_JOYPAD2_A: case COLUMN_JOYPAD2_B: case COLUMN_JOYPAD2_S: case COLUMN_JOYPAD2_T:
@ -586,7 +589,8 @@ void SingleClick(LPNMITEMACTIVATE info)
else else
currMovieData.frames_flags[row_index] |= MARKER_FLAG_BIT; currMovieData.frames_flags[row_index] |= MARKER_FLAG_BIT;
MarkersChanged(); MarkersChanged();
RedrawList(); // just to flicker-indicate that something has changed ListView_SetItemState(hwndList,row_index,0,LVIS_SELECTED);
//RedrawList();
} }
} }
else if(column_index >= COLUMN_JOYPAD1_A && column_index <= COLUMN_JOYPAD4_R) else if(column_index >= COLUMN_JOYPAD1_A && column_index <= COLUMN_JOYPAD4_R)
@ -613,8 +617,34 @@ void DoubleClick(LPNMITEMACTIVATE info)
} }
} }
//insert frames at the currently selected positions. void CloneFrames()
static void InsertFrames() {
int frames = selectionFrames.size();
currMovieData.records.reserve(currMovieData.records.size()+frames);
currMovieData.frames_flags.reserve(currMovieData.frames_flags.size()+frames);
//insert frames before each selection, but consecutive selection lines are accounted as single region
frames = 1;
TSelectionFrames::reverse_iterator next_it;
for(TSelectionFrames::reverse_iterator it(selectionFrames.rbegin()); it != selectionFrames.rend(); it++)
{
next_it = it;
next_it++;
if (next_it == selectionFrames.rend() || (int)*next_it < ((int)*it - 1))
{
// end of current region
currMovieData.cloneRegion(*it,frames);
frames = 1;
} else frames++;
}
UpdateList();
InputChanged();
InvalidateGreenZone(*selectionFrames.begin());
}
void InsertFrames()
{ {
int frames = selectionFrames.size(); int frames = selectionFrames.size();
@ -644,7 +674,7 @@ static void InsertFrames()
InvalidateGreenZone(*selectionFrames.begin()); InvalidateGreenZone(*selectionFrames.begin());
} }
static void DeleteFrames() void DeleteFrames()
{ {
//delete frames on each selection, going backwards //delete frames on each selection, going backwards
for(TSelectionFrames::reverse_iterator it(selectionFrames.rbegin()); it != selectionFrames.rend(); it++) for(TSelectionFrames::reverse_iterator it(selectionFrames.rbegin()); it != selectionFrames.rend(); it++)
@ -671,7 +701,6 @@ static void DeleteFrames()
if (!selectionFrames.size()) break; if (!selectionFrames.size()) break;
} }
// reduce greenzone // reduce greenzone
if (index>0) index--;
InvalidateGreenZone(index); InvalidateGreenZone(index);
} }
@ -716,7 +745,8 @@ static void ColumnSet(int column)
currMovieData.frames_flags[*it] &= ~MARKER_FLAG_BIT; currMovieData.frames_flags[*it] &= ~MARKER_FLAG_BIT;
} }
MarkersChanged(); MarkersChanged();
RedrawList(); // just to flicker-indicate that something has changed ClearSelection();
RedrawList();
} else } else
{ {
// buttons column // buttons column
@ -743,20 +773,16 @@ static void ColumnSet(int column)
void ClearSelection() void ClearSelection()
{ {
ListView_SetItemState(hwndList,-1,0, LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,-1,0, LVIS_SELECTED);
} }
void ClearRowSelection(int index) void ClearRowSelection(int index)
{ {
ListView_SetItemState(hwndList,index,0, LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,index,0, LVIS_SELECTED);
} }
void SelectAll() void SelectAll()
{ {
ListView_SetItemState(hwndList,-1,LVIS_FOCUSED|LVIS_SELECTED, LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,-1,LVIS_SELECTED, LVIS_SELECTED);
for(int i = 0; i < currMovieData.records.size(); i++)
{
selectionFrames.insert(i);
}
RedrawList(); RedrawList();
} }
void SelectMidMarkers() void SelectMidMarkers()
@ -771,7 +797,6 @@ void SelectMidMarkers()
upper_border = center = *selectionFrames.begin(); upper_border = center = *selectionFrames.begin();
lower_border = *selectionFrames.rbegin(); lower_border = *selectionFrames.rbegin();
} else lower_border = upper_border = center = currFrameCounter; } else lower_border = upper_border = center = currFrameCounter;
ClearSelection();
// find markers // find markers
// searching up starting from center-0 // searching up starting from center-0
@ -786,13 +811,15 @@ void SelectMidMarkers()
SelectAll(); SelectAll();
return; return;
} }
ClearSelection();
// selecting circle: // selecting circle:
if (upper_border > upper_marker+1 || lower_border < lower_marker-1 || lower_border > lower_marker) if (upper_border > upper_marker+1 || lower_border < lower_marker-1 || lower_border > lower_marker)
{ {
// default: select all between markers // default: select all between markers
for (int i = upper_marker+1; i < lower_marker; ++i) for (int i = upper_marker+1; i < lower_marker; ++i)
{ {
ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,i,LVIS_SELECTED,LVIS_SELECTED);
} }
} else if (upper_border == upper_marker+1 && lower_border == lower_marker-1) } else if (upper_border == upper_marker+1 && lower_border == lower_marker-1)
{ {
@ -801,32 +828,32 @@ void SelectMidMarkers()
if (lower_marker >= movie_size) lower_marker >= movie_size - 1; if (lower_marker >= movie_size) lower_marker >= movie_size - 1;
for (int i = upper_marker; i <= lower_marker; ++i) for (int i = upper_marker; i <= lower_marker; ++i)
{ {
ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,i,LVIS_SELECTED,LVIS_SELECTED);
} }
} else if (upper_border <= upper_marker && lower_border >= lower_marker) } else if (upper_border <= upper_marker && lower_border >= lower_marker)
{ {
// selected all between markers and both markers selected too - now deselect lower marker // selected all between markers and both markers selected too - now deselect lower marker
ListView_SetItemState(hwndList,lower_marker,0,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,lower_marker,0,LVIS_SELECTED);
for (int i = upper_marker; i < lower_marker; ++i) for (int i = upper_marker; i < lower_marker; ++i)
{ {
ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,i,LVIS_SELECTED,LVIS_SELECTED);
} }
} else if (upper_border == upper_marker && lower_border == lower_marker-1) } else if (upper_border == upper_marker && lower_border == lower_marker-1)
{ {
// selected all between markers and upper marker selected too - now deselect upper marker and (if lower marker < movie_size) reselect lower marker // selected all between markers and upper marker selected too - now deselect upper marker and (if lower marker < movie_size) reselect lower marker
ListView_SetItemState(hwndList,upper_marker,0,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,upper_marker,0,LVIS_SELECTED);
if (lower_marker >= movie_size) lower_marker >= movie_size - 1; if (lower_marker >= movie_size) lower_marker >= movie_size - 1;
for (int i = upper_marker+1; i <= lower_marker; ++i) for (int i = upper_marker+1; i <= lower_marker; ++i)
{ {
ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,i,LVIS_SELECTED,LVIS_SELECTED);
} }
} else if (upper_border == upper_marker+1 && lower_border == lower_marker) } else if (upper_border == upper_marker+1 && lower_border == lower_marker)
{ {
// selected all between markers and lower marker selected too - now deselect lower marker (return to "selected all between markers") // selected all between markers and lower marker selected too - now deselect lower marker (return to "selected all between markers")
ListView_SetItemState(hwndList,lower_marker,0,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,lower_marker,0,LVIS_SELECTED);
for (int i = upper_marker + 1; i < lower_marker; ++i) for (int i = upper_marker + 1; i < lower_marker; ++i)
{ {
ListView_SetItemState(hwndList,i,LVIS_FOCUSED|LVIS_SELECTED,LVIS_FOCUSED|LVIS_SELECTED); ListView_SetItemState(hwndList,i,LVIS_SELECTED,LVIS_SELECTED);
} }
} }
} }
@ -1030,6 +1057,8 @@ static LRESULT APIENTRY ListWndProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lPar
{ {
case WM_CHAR: case WM_CHAR:
return 0; return 0;
case WM_KILLFOCUS:
return 0;
case WM_NOTIFY: case WM_NOTIFY:
{ {
switch (((LPNMHDR)lParam)->code) switch (((LPNMHDR)lParam)->code)
@ -1080,7 +1109,7 @@ static void InitDialog()
// frame number column // frame number column
lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_FMT; lvc.mask = LVCF_WIDTH | LVCF_TEXT | LVCF_FMT;
lvc.fmt = LVCFMT_CENTER; lvc.fmt = LVCFMT_CENTER;
lvc.cx = 92; lvc.cx = 75;
lvc.pszText = "Frame#"; lvc.pszText = "Frame#";
ListView_InsertColumn(hwndList, colidx++, &lvc); ListView_InsertColumn(hwndList, colidx++, &lvc);
// pads columns // pads columns
@ -1118,7 +1147,7 @@ void AddFourscore()
} }
} }
// frame number column again // frame number column again
lvc.cx = 92; lvc.cx = 75;
lvc.pszText = "Frame#"; lvc.pszText = "Frame#";
ListView_InsertColumn(hwndList, colidx++, &lvc); ListView_InsertColumn(hwndList, colidx++, &lvc);
// enable radiobuttons for 3P/4P multitracking // enable radiobuttons for 3P/4P multitracking
@ -1405,10 +1434,16 @@ static void ItemChanged(NMLISTVIEW* info)
{ {
if(OFF) if(OFF)
{ {
// clear all
selectionFrames.clear(); selectionFrames.clear();
} else if (ON)
{
// select all
for(int i = 0; i < currMovieData.records.size(); i++)
{
selectionFrames.insert(i);
}
} }
else
FCEUD_PrintError("Unexpected condition in TasEdit ItemChanged. Please report.");
} }
else else
{ {
@ -1433,6 +1468,9 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
SetWindowPos(hwndDlg,0,TasEdit_wndx,TasEdit_wndy,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER); SetWindowPos(hwndDlg,0,TasEdit_wndx,TasEdit_wndy,0,0,SWP_NOSIZE|SWP_NOZORDER|SWP_NOOWNERZORDER);
// save references to dialog items // save references to dialog items
hwndList = GetDlgItem(hwndDlg, IDC_LIST1); hwndList = GetDlgItem(hwndDlg, IDC_LIST1);
listItems = ListView_GetCountPerPage(hwndList);
FCEU_printf("listItems = %d\n\n",listItems);
hwndProgressbar = GetDlgItem(hwndDlg, IDC_PROGRESS1); hwndProgressbar = GetDlgItem(hwndDlg, IDC_PROGRESS1);
SendMessage(hwndProgressbar, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSBAR_WIDTH)); SendMessage(hwndProgressbar, PBM_SETRANGE, 0, MAKELPARAM(0, PROGRESSBAR_WIDTH));
hwndRewind = GetDlgItem(hwndDlg, TASEDIT_REWIND); hwndRewind = GetDlgItem(hwndDlg, TASEDIT_REWIND);
@ -1488,6 +1526,16 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
case LVN_ODSTATECHANGED: case LVN_ODSTATECHANGED:
ItemRangeChanged((LPNMLVODSTATECHANGE) lParam); ItemRangeChanged((LPNMLVODSTATECHANGE) lParam);
break; break;
/*
case LVN_ENDSCROLL:
// redraw upper and lower list rows (fix for known WinXP bug)
int start = ListView_GetTopIndex(hwndList);
ListView_RedrawItems(hwndList,start,start);
int end = start + listItems - 1;
ListView_RedrawItems(hwndList,end,end);
break;
*/
} }
break; break;
case TASEDIT_PLAYSTOP: case TASEDIT_PLAYSTOP:
@ -1720,6 +1768,11 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
case ID_SELECTED_SELECTMIDMARKERS: case ID_SELECTED_SELECTMIDMARKERS:
SelectMidMarkers(); SelectMidMarkers();
break; break;
case ACCEL_SHIFT_INS:
case ID_EDIT_CLONEFRAMES:
case ID_SELECTED_CLONE:
if (selectionFrames.size()) CloneFrames();
break;
} }
break; break;

View File

@ -51,7 +51,7 @@
#define COLUMN_JOYPAD4_L 32 #define COLUMN_JOYPAD4_L 32
#define COLUMN_JOYPAD4_R 33 #define COLUMN_JOYPAD4_R 33
#define COLUMN_FRAMENUM2 34 #define COLUMN_FRAMENUM2 34
#define DIGITS_IN_FRAMENUM 7
// listview colors // listview colors
#define NORMAL_FRAMENUM_COLOR 0xFFFFFF #define NORMAL_FRAMENUM_COLOR 0xFFFFFF
#define MARKED_FRAMENUM_COLOR 0xC0FCFF #define MARKED_FRAMENUM_COLOR 0xC0FCFF
@ -105,4 +105,6 @@ bool SaveProjectAs();
bool AskSaveProject(); bool AskSaveProject();
void SelectAll(); void SelectAll();
void SelectMidMarkers(); void SelectMidMarkers();
void CloneFrames();
void InsertFrames();
void DeleteFrames();

View File

@ -140,6 +140,20 @@ void MovieData::insertEmpty(int at, int frames)
} }
} }
void MovieData::cloneRegion(int at, int frames)
{
if(at == -1) return;
records.insert(records.begin()+at,frames,MovieRecord());
#ifdef WIN32
if (TASEdit_bind_markers)
#endif
frames_flags.insert(frames_flags.begin()+at,frames,0);
for(int i = 0; i < frames; i++)
records[i+at].Clone(records[i+at+frames]);
}
void MovieData::TryDumpIncremental() void MovieData::TryDumpIncremental()
{ {
if(movieMode == MOVIEMODE_TASEDIT) if(movieMode == MOVIEMODE_TASEDIT)
@ -225,9 +239,6 @@ bool MovieRecord::Compare(MovieRecord& compareRec)
if (this->joysticks != compareRec.joysticks) if (this->joysticks != compareRec.joysticks)
return false; return false;
//if (this->commands != compareRec.commands)
// return false;
//if new commands are ever recordable, they need to be added here if we go with this method //if new commands are ever recordable, they need to be added here if we go with this method
if(this->command_reset() != compareRec.command_reset()) return false; if(this->command_reset() != compareRec.command_reset()) return false;
@ -247,9 +258,29 @@ bool MovieRecord::Compare(MovieRecord& compareRec)
if (this->zappers[1].b != compareRec.zappers[1].b) return false; if (this->zappers[1].b != compareRec.zappers[1].b) return false;
if (this->zappers[1].bogo != compareRec.zappers[1].bogo) return false; if (this->zappers[1].bogo != compareRec.zappers[1].bogo) return false;
return true; return true;
} }
void MovieRecord::Clone(MovieRecord& sourceRec)
{
this->joysticks[0] = sourceRec.joysticks[0];
this->joysticks[1] = sourceRec.joysticks[1];
this->joysticks[2] = sourceRec.joysticks[2];
this->joysticks[3] = sourceRec.joysticks[3];
this->zappers[0].x = sourceRec.zappers[0].x;
this->zappers[0].y = sourceRec.zappers[0].y;
this->zappers[0].zaphit = sourceRec.zappers[0].zaphit;
this->zappers[0].b = sourceRec.zappers[0].b;
this->zappers[0].bogo = sourceRec.zappers[0].bogo;
this->zappers[1].x = sourceRec.zappers[1].x;
this->zappers[1].y = sourceRec.zappers[1].y;
this->zappers[1].zaphit = sourceRec.zappers[1].zaphit;
this->zappers[1].b = sourceRec.zappers[1].b;
this->zappers[1].bogo = sourceRec.zappers[1].bogo;
this->commands = sourceRec.commands;
}
const char MovieRecord::mnemonics[8] = {'A','B','S','T','U','D','L','R'}; const char MovieRecord::mnemonics[8] = {'A','B','S','T','U','D','L','R'};
void MovieRecord::dumpJoy(EMUFILE* os, uint8 joystate) void MovieRecord::dumpJoy(EMUFILE* os, uint8 joystate)

View File

@ -147,6 +147,7 @@ public:
} }
bool Compare(MovieRecord& compareRec); bool Compare(MovieRecord& compareRec);
void Clone(MovieRecord& sourceRec);
void clear(); void clear();
void parse(MovieData* md, EMUFILE* is); void parse(MovieData* md, EMUFILE* is);
@ -240,6 +241,7 @@ public:
void clearRecordRange(int start, int len); void clearRecordRange(int start, int len);
void insertEmpty(int at, int frames); void insertEmpty(int at, int frames);
void cloneRegion(int at, int frames);
static bool loadSavestateFrom(std::vector<uint8>* buf); static bool loadSavestateFrom(std::vector<uint8>* buf);
static void dumpSavestateTo(std::vector<uint8>* buf, int compressionLevel); static void dumpSavestateTo(std::vector<uint8>* buf, int compressionLevel);

View File

@ -526,6 +526,21 @@ char *U32ToDecStr(uint32 a)
{ {
return U32ToDecStr(TempArray,a); return U32ToDecStr(TempArray,a);
} }
char *U32ToDecStr(char* buf, uint32 a, int digits)
{
if (digits < 1)
digits = 1;
else if (digits > 10)
digits = 10;
for (int i = 1; i <= digits; ++i)
{
buf[digits - i] = '0' + (a % 10);
a /= 10;
}
buf[digits] = 0;
return buf;
}
char *U16ToHexStr(uint16 a) char *U16ToHexStr(uint16 a)
{ {

View File

@ -57,6 +57,7 @@ uint16 FastStrToU16(char* s, bool& valid);
char *U16ToDecStr(uint16 a); char *U16ToDecStr(uint16 a);
char *U32ToDecStr(uint32 a); char *U32ToDecStr(uint32 a);
char *U32ToDecStr(char* buf, uint32 a); char *U32ToDecStr(char* buf, uint32 a);
char *U32ToDecStr(char* buf, uint32 a, int digits);
char *U8ToDecStr(uint8 a); char *U8ToDecStr(uint8 a);
char *U8ToHexStr(uint8 a); char *U8ToHexStr(uint8 a);
char *U16ToHexStr(uint16 a); char *U16ToHexStr(uint16 a);