TASEdit - Cut, Copy, Paste
This commit is contained in:
parent
ca6f2be5f8
commit
32f0231910
|
@ -228,9 +228,9 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
MENUITEM "&Select All", ID_EDIT_SELECTALL
|
MENUITEM "&Select All", ID_EDIT_SELECTALL
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Cu&t\tCtrl+X", ID_TASEDIT_CUT, INACTIVE
|
MENUITEM "Cu&t\tCtrl+X", ID_TASEDIT_CUT
|
||||||
MENUITEM "&Copy\tCtrl+C", ID_TASEDIT_COPY, INACTIVE
|
MENUITEM "&Copy\tCtrl+C", ID_TASEDIT_COPY
|
||||||
MENUITEM "&Paste\tCtrl+V", ID_TASEDIT_PASTE, INACTIVE
|
MENUITEM "&Paste\tCtrl+V", ID_TASEDIT_PASTE
|
||||||
MENUITEM "Paste to &New\tCtrl+Shift+V", ID_TASEDIT_PASTETONEW, INACTIVE
|
MENUITEM "Paste to &New\tCtrl+Shift+V", ID_TASEDIT_PASTETONEW, INACTIVE
|
||||||
MENUITEM "&Delete\tCtrl+Delete", ID_TASEDIT_DELETE
|
MENUITEM "&Delete\tCtrl+Delete", ID_TASEDIT_DELETE
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
|
|
|
@ -81,7 +81,7 @@ static void GetDispInfo(NMLVDISPINFO* nmlvDispInfo)
|
||||||
item.pszText[0] = MovieRecord::mnemonics[bit];
|
item.pszText[0] = MovieRecord::mnemonics[bit];
|
||||||
item.pszText[1] = 0;
|
item.pszText[1] = 0;
|
||||||
} else
|
} else
|
||||||
item.pszText[1] = 0;
|
item.pszText[0] = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -284,11 +284,9 @@ bool JumpToFrame(int index)
|
||||||
// Simply do a reset.
|
// Simply do a reset.
|
||||||
if (index==0)
|
if (index==0)
|
||||||
{
|
{
|
||||||
extern int disableBatteryLoading;
|
poweron(false);
|
||||||
disableBatteryLoading = 1;
|
|
||||||
PowerNES();
|
|
||||||
disableBatteryLoading = 0;
|
|
||||||
currFrameCounter=0;
|
currFrameCounter=0;
|
||||||
|
MovieData::dumpSavestateTo(&currMovieData.records[0].savestate,0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -355,19 +353,9 @@ void DoubleClick(LPNMITEMACTIVATE info)
|
||||||
static void ClearSelection()
|
static void ClearSelection()
|
||||||
{
|
{
|
||||||
int frameCount = ListView_GetItemCount(hwndList);
|
int frameCount = ListView_GetItemCount(hwndList);
|
||||||
//LVITEM lvi;
|
|
||||||
//lvi.mask = LVIF_STATE;
|
|
||||||
//lvi.state = 0;
|
|
||||||
//lvi.stateMask = LVIS_SELECTED;
|
|
||||||
|
|
||||||
ListView_SetItemState(hwndList,-1,0, LVIS_SELECTED);
|
ListView_SetItemState(hwndList,-1,0, LVIS_SELECTED);
|
||||||
|
|
||||||
//for(int i=0;i<frameCount;i++)
|
|
||||||
//{
|
|
||||||
// lvi.iItem = i;
|
|
||||||
// ListView_SetItem(hwndList,&lvi);
|
|
||||||
//}
|
|
||||||
|
|
||||||
selectionFrames.clear();
|
selectionFrames.clear();
|
||||||
lastCursor=-1;
|
lastCursor=-1;
|
||||||
}
|
}
|
||||||
|
@ -480,26 +468,178 @@ static void ColumnSet(int column)
|
||||||
static void SelectAll()
|
static void SelectAll()
|
||||||
{
|
{
|
||||||
ClearSelection();
|
ClearSelection();
|
||||||
for(int i=0;i<currMovieData.records.size();i++)
|
for(unsigned int i=0;i<currMovieData.records.size();i++)
|
||||||
selectionFrames.insert(i);
|
selectionFrames.insert(i);
|
||||||
|
|
||||||
UpdateTasEdit();
|
UpdateTasEdit();
|
||||||
RedrawList();
|
RedrawList();
|
||||||
}
|
}
|
||||||
|
|
||||||
//cuts the current selection and copies to the clipboard
|
//copies the current selection to the clipboard
|
||||||
static void Cut()
|
static bool Copy()
|
||||||
{
|
{
|
||||||
|
if (selectionFrames.size()==0) return false;
|
||||||
|
|
||||||
|
int cframe=*selectionFrames.begin()-1;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int range = *selectionFrames.rbegin() - *selectionFrames.begin()+1;
|
||||||
|
//std::string outbuf clipString("TAS");
|
||||||
|
|
||||||
|
std::stringstream clipString;
|
||||||
|
clipString << "TAS " << range << std::endl;
|
||||||
|
|
||||||
|
for(TSelectionFrames::iterator it(selectionFrames.begin()); it != selectionFrames.end(); it++)
|
||||||
|
{
|
||||||
|
if (*it>cframe+1)
|
||||||
|
{
|
||||||
|
clipString << '+' << (*it-cframe) << '|';
|
||||||
|
}
|
||||||
|
cframe=*it;
|
||||||
|
|
||||||
|
int cjoy=0;
|
||||||
|
for (int joy=0; joy<2; ++joy)
|
||||||
|
{
|
||||||
|
while (currMovieData.records[*it].joysticks[joy] && cjoy<joy)
|
||||||
|
{
|
||||||
|
clipString << '|';
|
||||||
|
++cjoy;
|
||||||
|
}
|
||||||
|
for (int bit=0; bit<8; ++bit)
|
||||||
|
{
|
||||||
|
if (currMovieData.records[*it].joysticks[joy] & (1<<bit))
|
||||||
|
{
|
||||||
|
clipString << MovieRecord::mnemonics[bit];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clipString << std::endl;
|
||||||
|
|
||||||
|
if (!OpenClipboard(hwndTasEdit))
|
||||||
|
return false;
|
||||||
|
EmptyClipboard();
|
||||||
|
|
||||||
|
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, clipString.str().size()+1);
|
||||||
|
|
||||||
|
if (hGlobal==INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
CloseClipboard();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
char *pGlobal = (char*)GlobalLock(hGlobal);
|
||||||
|
strcpy(pGlobal, clipString.str().c_str());
|
||||||
|
GlobalUnlock(hGlobal);
|
||||||
|
SetClipboardData(CF_TEXT, hGlobal);
|
||||||
|
|
||||||
|
CloseClipboard();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
catch (std::bad_alloc e)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//copies the current selection to the clipboard
|
//cuts the current selection, copying it to the clipboard
|
||||||
static void Copy()
|
static void Cut()
|
||||||
{
|
{
|
||||||
|
if (Copy())
|
||||||
|
{
|
||||||
|
DeleteFrames();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//pastes the current clipboard selection into current inputlog
|
//pastes the current clipboard selection into current inputlog
|
||||||
static void Paste()
|
static bool Paste()
|
||||||
{
|
{
|
||||||
|
bool result = false;
|
||||||
|
if (selectionFrames.size()==0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
int pos = *selectionFrames.begin();
|
||||||
|
|
||||||
|
if (!OpenClipboard(hwndTasEdit))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
HANDLE hGlobal = GetClipboardData(CF_TEXT);
|
||||||
|
if (hGlobal)
|
||||||
|
{
|
||||||
|
char *pGlobal = (char*)GlobalLock((HGLOBAL)hGlobal);
|
||||||
|
|
||||||
|
// TAS recording info starts with "TAS ".
|
||||||
|
if (pGlobal[0]=='T' && pGlobal[1]=='A' && pGlobal[2]=='S')
|
||||||
|
{
|
||||||
|
int range;
|
||||||
|
|
||||||
|
// Extract number of frames
|
||||||
|
sscanf (pGlobal+3, "%d", &range);
|
||||||
|
if (currMovieData.records.size()<pos+range)
|
||||||
|
{
|
||||||
|
currMovieData.insertEmpty(currMovieData.records.size(),pos+range-currMovieData.records.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
pGlobal = strchr(pGlobal, '\n');
|
||||||
|
int joy=0;
|
||||||
|
--pos;
|
||||||
|
|
||||||
|
while (pGlobal++ && *pGlobal!='\0')
|
||||||
|
{
|
||||||
|
char *frame = pGlobal;
|
||||||
|
|
||||||
|
// Detect skipped frames in paste.
|
||||||
|
if (frame[0]=='+')
|
||||||
|
{
|
||||||
|
pos += atoi(frame+1);
|
||||||
|
while (*frame && *frame != '\n' && *frame!='|')
|
||||||
|
++frame;
|
||||||
|
if (*frame=='|') ++frame;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
currMovieData.records[pos].joysticks[0]=0;
|
||||||
|
currMovieData.records[pos].joysticks[1]=0;
|
||||||
|
int joy=0;
|
||||||
|
|
||||||
|
while (*frame && *frame != '\n' && *frame !='\r')
|
||||||
|
{
|
||||||
|
switch (*frame)
|
||||||
|
{
|
||||||
|
case '|': // Joystick marker
|
||||||
|
++joy;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
for (int bit=0; bit<8; ++bit)
|
||||||
|
{
|
||||||
|
if (*frame==MovieRecord::mnemonics[bit])
|
||||||
|
{
|
||||||
|
currMovieData.records[pos].joysticks[joy]|=(1<<bit);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
++frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
pGlobal = strchr(pGlobal, '\n');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalidate and redraw.
|
||||||
|
InvalidateGreenZone(*selectionFrames.begin());
|
||||||
|
RedrawList();
|
||||||
|
result=true;
|
||||||
|
}
|
||||||
|
|
||||||
|
GlobalUnlock(hGlobal);
|
||||||
|
}
|
||||||
|
|
||||||
|
CloseClipboard();
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
//pastes the current clipboard selection into a new inputlog
|
//pastes the current clipboard selection into a new inputlog
|
||||||
|
@ -675,7 +815,7 @@ static void OpenProject()
|
||||||
memset(&ofn,0,sizeof(ofn)); //Set aside some memory
|
memset(&ofn,0,sizeof(ofn)); //Set aside some memory
|
||||||
ofn.lStructSize=sizeof(ofn); //Various parameters
|
ofn.lStructSize=sizeof(ofn); //Various parameters
|
||||||
ofn.hInstance=fceu_hInstance;
|
ofn.hInstance=fceu_hInstance;
|
||||||
ofn.lpstrTitle="Save TASEdit Project As...";
|
ofn.lpstrTitle="Open TASEdit Project...";
|
||||||
ofn.lpstrFilter=TPfilter;
|
ofn.lpstrFilter=TPfilter;
|
||||||
|
|
||||||
char nameo[2048]; //File name
|
char nameo[2048]; //File name
|
||||||
|
@ -942,14 +1082,17 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
SelectAll();
|
SelectAll();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACCEL_CTRL_X:
|
||||||
case ID_TASEDIT_CUT:
|
case ID_TASEDIT_CUT:
|
||||||
Cut();
|
Cut();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACCEL_CTRL_C:
|
||||||
case ID_TASEDIT_COPY:
|
case ID_TASEDIT_COPY:
|
||||||
Copy();
|
Copy();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case ACCEL_CTRL_V:
|
||||||
case ID_TASEDIT_PASTE:
|
case ID_TASEDIT_PASTE:
|
||||||
Paste();
|
Paste();
|
||||||
break;
|
break;
|
||||||
|
@ -1029,7 +1172,8 @@ BOOL CALLBACK WndprocTasEdit(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lPar
|
||||||
|
|
||||||
case TASEDIT_REWIND:
|
case TASEDIT_REWIND:
|
||||||
//rewinds 1 frame
|
//rewinds 1 frame
|
||||||
JumpToFrame(currFrameCounter-1);
|
if (currFrameCounter>0)
|
||||||
|
JumpToFrame(currFrameCounter-1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TASEDIT_REWIND_FULL:
|
case TASEDIT_REWIND_FULL:
|
||||||
|
|
Loading…
Reference in New Issue