mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-17 15:46:05 +02:00
Minor IDE changes
This commit is contained in:
parent
be3c968e2b
commit
2ea5d31c37
15 changed files with 373 additions and 87 deletions
|
@ -1383,6 +1383,9 @@ namespace IDE.ui
|
|||
|
||||
void ShowRightClickMenu(WatchListViewItem listViewItem, float x, float y)
|
||||
{
|
||||
if (mOrigEvalString.StartsWith(":"))
|
||||
return;
|
||||
|
||||
float clickX = x;
|
||||
float clickY = DarkTheme.sDarkTheme.mSmallFont.GetLineSpacing() + GS!(1);
|
||||
listViewItem.SelfToOtherTranslate(listViewItem.mListView.GetRoot(), clickX, clickY, var aX, var aY);
|
||||
|
|
|
@ -395,6 +395,7 @@ namespace IDE.ui
|
|||
String editVal = subItem.mLabel;
|
||||
mEditWidget.SetText(editVal);
|
||||
mEditWidget.Content.SelectAll();
|
||||
mEditSubmitting = true; // Default to submitting on lost focus
|
||||
|
||||
mEditingItem = item;
|
||||
mEditingRepType = repType;
|
||||
|
@ -479,6 +480,7 @@ namespace IDE.ui
|
|||
String editText = scope String();
|
||||
mEditWidget.GetText(editText);
|
||||
String expr = scope String();
|
||||
editText.Append(", d");
|
||||
if (!MemoryPanel.EvalExpression(editText, expr))
|
||||
expr = editText;
|
||||
|
||||
|
@ -593,6 +595,7 @@ namespace IDE.ui
|
|||
|
||||
void HandleRenameCancel(EditEvent theEvent)
|
||||
{
|
||||
mEditSubmitting = false;
|
||||
HandleEditLostFocus((EditWidget)theEvent.mSender);
|
||||
}
|
||||
|
||||
|
|
|
@ -4,6 +4,7 @@ using Beefy.widgets;
|
|||
using Beefy.theme;
|
||||
using System.IO;
|
||||
using Beefy.utils;
|
||||
using Beefy.gfx;
|
||||
|
||||
namespace IDE.ui
|
||||
{
|
||||
|
@ -65,6 +66,17 @@ namespace IDE.ui
|
|||
mModulesDirty = true;
|
||||
}
|
||||
|
||||
public void GetFileNameFrom(ListViewItem item, String filePath)
|
||||
{
|
||||
var pathItem = item.GetSubItem(1);
|
||||
StringView label = pathItem.Label;
|
||||
int parenPos = label.IndexOf('(');
|
||||
if (parenPos != -1)
|
||||
label.RemoveToEnd(parenPos);
|
||||
label.Trim();
|
||||
filePath.Append(label);
|
||||
}
|
||||
|
||||
protected override void ShowRightClickMenu(Widget relWidget, float x, float y)
|
||||
{
|
||||
base.ShowRightClickMenu(relWidget, x, y);
|
||||
|
@ -76,15 +88,54 @@ namespace IDE.ui
|
|||
{
|
||||
Menu menu = new Menu();
|
||||
Menu anItem;
|
||||
anItem = menu.AddItem("Load Symbols...");
|
||||
anItem = menu.AddItem("Load Image...");
|
||||
anItem.mOnMenuItemSelected.Add(new (item) =>
|
||||
{
|
||||
listView.GetRoot().WithSelectedItems(scope (item) =>
|
||||
{
|
||||
String filePath = scope .();
|
||||
GetFileNameFrom(item, filePath);
|
||||
|
||||
String dir = scope String();
|
||||
Path.GetDirectoryPath(filePath, dir);
|
||||
IDEUtils.FixFilePath(dir);
|
||||
|
||||
String fileName = scope String();
|
||||
Path.GetFileName(filePath, fileName);
|
||||
|
||||
String extName = scope String();
|
||||
Path.GetExtension(filePath, extName);
|
||||
extName.ToLower();
|
||||
|
||||
var fileDialog = scope System.IO.OpenFileDialog();
|
||||
fileDialog.ShowReadOnly = false;
|
||||
fileDialog.Title = "Select Image File";
|
||||
fileDialog.Multiselect = false;
|
||||
if (!dir.IsEmpty)
|
||||
fileDialog.InitialDirectory = dir;
|
||||
fileDialog.ValidateNames = true;
|
||||
fileDialog.DefaultExt = ".exe";
|
||||
fileDialog.FileName = fileName;
|
||||
fileDialog.SetFilter(scope String()..AppendF("{0}|{0}|File (*{1})|*{1}|All files (*.*)|*.*", fileName, extName));
|
||||
mWidgetWindow.PreModalChild();
|
||||
if (fileDialog.ShowDialog(gApp.GetActiveWindow()).GetValueOrDefault() == .OK)
|
||||
{
|
||||
var fileNames = fileDialog.FileNames;
|
||||
gApp.mDebugger.LoadImageForModule(filePath, fileNames[0]);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
anItem = menu.AddItem("Load Debug Info...");
|
||||
anItem.mOnMenuItemSelected.Add(new (item) =>
|
||||
{
|
||||
listView.GetRoot().WithSelectedItems(scope (item) =>
|
||||
{
|
||||
var pathItem = item.GetSubItem(1);
|
||||
String filePath = scope .();
|
||||
GetFileNameFrom(item, filePath);
|
||||
|
||||
String dir = scope String();
|
||||
Path.GetDirectoryPath(pathItem.Label, dir);
|
||||
Path.GetDirectoryPath(filePath, dir);
|
||||
IDEUtils.FixFilePath(dir);
|
||||
|
||||
var fileDialog = scope System.IO.OpenFileDialog();
|
||||
|
@ -95,14 +146,14 @@ namespace IDE.ui
|
|||
fileDialog.InitialDirectory = dir;
|
||||
fileDialog.ValidateNames = true;
|
||||
fileDialog.DefaultExt = ".exe";
|
||||
fileDialog.SetFilter("PDB Debug Unfo (*.pdb)|*.pdb|All files (*.*)|*.*");
|
||||
fileDialog.SetFilter("PDB Debug Info (*.pdb)|*.pdb|All files (*.*)|*.*");
|
||||
mWidgetWindow.PreModalChild();
|
||||
if (fileDialog.ShowDialog(gApp.GetActiveWindow()).GetValueOrDefault() == .OK)
|
||||
{
|
||||
var fileNames = fileDialog.FileNames;
|
||||
if (gApp.mDebugger.mIsRunning)
|
||||
{
|
||||
gApp.mDebugger.LoadDebugInfoForModule(scope String(pathItem.Label), fileNames[0]);
|
||||
gApp.mDebugger.LoadDebugInfoForModule(filePath, fileNames[0]);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
@ -126,20 +177,22 @@ namespace IDE.ui
|
|||
if (moduleInfoStr.IsEmpty)
|
||||
continue;
|
||||
|
||||
ListViewItem lvItem;
|
||||
|
||||
if (idx < mListView.GetRoot().GetChildCount())
|
||||
{
|
||||
let lvItem = mListView.GetRoot().GetChildAtIndex(idx);
|
||||
lvItem = mListView.GetRoot().GetChildAtIndex(idx);
|
||||
int subIdx = 0;
|
||||
for (let moduleStr in moduleInfoStr.Split('\t'))
|
||||
{
|
||||
let subLVItem = (subIdx == 0) ? lvItem : lvItem.GetSubItem(subIdx);
|
||||
subLVItem.Label = moduleStr;
|
||||
let subLVItem = (DarkListViewItem)((subIdx == 0) ? lvItem : lvItem.GetSubItem(subIdx));
|
||||
subLVItem.Label = moduleStr;
|
||||
subIdx++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
let lvItem = mListView.GetRoot().CreateChildItem();
|
||||
lvItem = mListView.GetRoot().CreateChildItem();
|
||||
int subIdx = 0;
|
||||
for (let moduleStr in moduleInfoStr.Split('\t'))
|
||||
{
|
||||
|
@ -149,6 +202,17 @@ namespace IDE.ui
|
|||
}
|
||||
}
|
||||
|
||||
DarkListViewItem subLVItem = (DarkListViewItem)lvItem.GetSubItem(1);
|
||||
if (subLVItem.mLabel.StartsWith("!"))
|
||||
{
|
||||
subLVItem.mTextColor = 0xFFFF8080;
|
||||
subLVItem.mLabel.Remove(0, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
subLVItem.mTextColor = 0xFFFFFFFF;
|
||||
}
|
||||
|
||||
++idx;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,13 @@ namespace IDE.ui
|
|||
{
|
||||
public class PanelHeader : Widget
|
||||
{
|
||||
public enum Kind
|
||||
{
|
||||
None,
|
||||
WrongHash
|
||||
}
|
||||
|
||||
public Kind mKind;
|
||||
public List<DarkButton> mButtons = new List<DarkButton>() ~ delete _;
|
||||
public String mLabel ~ delete _;
|
||||
public String mTooltipText ~ delete _;
|
||||
|
|
|
@ -2232,6 +2232,15 @@ namespace IDE.ui
|
|||
}
|
||||
}
|
||||
|
||||
SourceElementType prevElementType = SourceElementType.Normal;
|
||||
char8 prevChar = 0;
|
||||
int cursorTextPos = CursorTextPos;
|
||||
if (cursorTextPos != 0)
|
||||
{
|
||||
prevElementType = (SourceElementType)mData.mText[cursorTextPos - 1].mDisplayTypeId;
|
||||
prevChar = mData.mText[cursorTextPos - 1].mChar;
|
||||
}
|
||||
|
||||
if (((theChar == '\n') || (theChar == '\r')) && (mIsMultiline) && (!CheckReadOnly()))
|
||||
{
|
||||
UndoBatchStart undoBatchStart = new UndoBatchStart("newline");
|
||||
|
@ -2333,6 +2342,17 @@ namespace IDE.ui
|
|||
|
||||
mData.mUndoManager.Add(undoBatchStart.mBatchEnd);
|
||||
|
||||
if ((prevElementType == .Normal) &&
|
||||
((prevChar == '.') || (prevChar == '(')))
|
||||
{
|
||||
// Leave it be
|
||||
}
|
||||
else
|
||||
{
|
||||
if (mAutoComplete != null)
|
||||
mAutoComplete.CloseListWindow();
|
||||
}
|
||||
|
||||
mAutoComplete?.UpdateAsyncInfo();
|
||||
|
||||
return;
|
||||
|
@ -2343,15 +2363,6 @@ namespace IDE.ui
|
|||
return;
|
||||
}
|
||||
|
||||
SourceElementType prevElementType = SourceElementType.Normal;
|
||||
char8 prevChar = 0;
|
||||
int cursorTextPos = CursorTextPos;
|
||||
if (cursorTextPos != 0)
|
||||
{
|
||||
prevElementType = (SourceElementType)mData.mText[cursorTextPos - 1].mDisplayTypeId;
|
||||
prevChar = mData.mText[cursorTextPos - 1].mChar;
|
||||
}
|
||||
|
||||
if (prevElementType == SourceElementType.Comment)
|
||||
{
|
||||
if ((cursorTextPos < mData.mTextLength - 1) && (mData.mText[cursorTextPos - 1].mChar == '\n'))
|
||||
|
@ -2565,7 +2576,7 @@ namespace IDE.ui
|
|||
mIsInKeyChar = false;
|
||||
}
|
||||
|
||||
if ((theChar == '\b') || (theChar >= (char8)32))
|
||||
if ((theChar == '\b') || (theChar == '\r') || (theChar >= (char8)32))
|
||||
{
|
||||
bool isHighPri = (theChar == '(') || (theChar == '.');
|
||||
bool needsFreshAutoComplete = ((isHighPri) /*|| (!mAsyncAutocomplete)*/ || (mAutoComplete == null) || (mAutoComplete.mAutoCompleteListWidget == null));
|
||||
|
@ -2720,7 +2731,7 @@ namespace IDE.ui
|
|||
/// param.isRepeat = "Whether the key is repeated"
|
||||
public override void KeyDown(KeyCode keyCode, bool isRepeat)
|
||||
{
|
||||
mIgnoreKeyChar = false;
|
||||
mIgnoreKeyChar = false;
|
||||
|
||||
if (((keyCode == .Up) || (keyCode == .Down)) &&
|
||||
(mAutoComplete != null) && (mAutoComplete.IsShowing()) && (mAutoComplete.mListWindow != null) &&
|
||||
|
@ -3022,12 +3033,34 @@ namespace IDE.ui
|
|||
Menu menu = new Menu();
|
||||
if (!DoSpellingPopup(menu))
|
||||
{
|
||||
bool hasText = false;
|
||||
bool hasSelection = HasSelection();
|
||||
if (hasSelection)
|
||||
hasText = true;
|
||||
else if ((GetLineCharAtCoord(x, y, var line, var lineChar, var overflowX)) || (overflowX < 2))
|
||||
{
|
||||
int textIdx = GetTextIdx(line, lineChar);
|
||||
for (int checkIdx = textIdx; checkIdx < Math.Min(textIdx + 1, mData.mTextLength); checkIdx++)
|
||||
{
|
||||
if (mData.mText[checkIdx].mDisplayTypeId != (uint8)BfSourceElementType.Comment)
|
||||
{
|
||||
char8 c = mData.mText[checkIdx].mChar;
|
||||
if (!c.IsWhiteSpace)
|
||||
hasText = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mSourceViewPanel.mIsSourceCode)
|
||||
{
|
||||
var menuItem = menu.AddItem("Go to Definition");
|
||||
Menu menuItem;
|
||||
|
||||
menuItem = menu.AddItem("Go to Definition");
|
||||
menuItem.SetDisabled(!hasText);
|
||||
menuItem.mOnMenuItemSelected.Add(new (evt) => IDEApp.sApp.GoToDefinition());
|
||||
|
||||
menuItem = menu.AddItem("Add Watch");
|
||||
menuItem.SetDisabled(!hasText);
|
||||
menuItem.mOnMenuItemSelected.Add(new (evt) =>
|
||||
{
|
||||
int line, lineChar;
|
||||
|
@ -3046,7 +3079,6 @@ namespace IDE.ui
|
|||
(textIdx >= mSelection.Value.MinPos) &&
|
||||
(textIdx < mSelection.Value.MaxPos))
|
||||
{
|
||||
//CDH TODO this doesn't actually get hit right now because right-click context menus lose the selection
|
||||
GetSelectionText(debugExpr);
|
||||
}
|
||||
else if (bfSystem != null)
|
||||
|
@ -3077,15 +3109,87 @@ namespace IDE.ui
|
|||
}
|
||||
});
|
||||
|
||||
var debugger = IDEApp.sApp.mDebugger;
|
||||
if (debugger.IsPaused())
|
||||
// Fixits
|
||||
{
|
||||
menuItem = menu.AddItem("Show Disassembly");
|
||||
menuItem.mOnMenuItemSelected.Add(new (evt) => IDEApp.sApp.ShowDisassemblyAtCursor());
|
||||
ResolveParams resolveParams = scope .();
|
||||
mSourceViewPanel.DoClassify(ResolveType.GetFixits, resolveParams, true);
|
||||
menuItem = menu.AddItem("Fixit");
|
||||
|
||||
if (resolveParams.mNavigationData != null)
|
||||
{
|
||||
int32 fixitIdx = 0;
|
||||
for (let str in resolveParams.mNavigationData.Split('\n'))
|
||||
{
|
||||
var strItr = str.Split('\t');
|
||||
let cmd = strItr.GetNext().Value;
|
||||
if (cmd != "fixit")
|
||||
continue;
|
||||
let arg = strItr.GetNext().Value;
|
||||
var fixitItem = menuItem.AddItem(arg);
|
||||
|
||||
var stepIntoSpecificMenu = menu.AddItem("Step into Specific");
|
||||
var stepFilterMenu = menu.AddItem("Step Filter");
|
||||
var infoCopy = new String(resolveParams.mNavigationData);
|
||||
fixitItem.mOnMenuItemSelected.Add(new (menu) =>
|
||||
{
|
||||
mAutoComplete?.Close();
|
||||
var autoComplete = new AutoComplete(mEditWidget);
|
||||
autoComplete.SetInfo(infoCopy);
|
||||
autoComplete.mAutoCompleteListWidget.mSelectIdx = fixitIdx;
|
||||
autoComplete.InsertSelection(0);
|
||||
autoComplete.Close();
|
||||
}
|
||||
~
|
||||
{
|
||||
delete infoCopy;
|
||||
});
|
||||
fixitIdx++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!menuItem.IsParent)
|
||||
{
|
||||
menuItem.IsParent = true;
|
||||
menuItem.SetDisabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
menu.AddItem();
|
||||
menuItem = menu.AddItem("Cut|Ctrl+X");
|
||||
menuItem.mOnMenuItemSelected.Add(new (menu) =>
|
||||
{
|
||||
CutText();
|
||||
});
|
||||
menuItem.SetDisabled(!hasSelection);
|
||||
|
||||
menuItem = menu.AddItem("Copy|Ctrl+C");
|
||||
menuItem.mOnMenuItemSelected.Add(new (menu) =>
|
||||
{
|
||||
CopyText();
|
||||
});
|
||||
menuItem.SetDisabled(!hasSelection);
|
||||
|
||||
menuItem = menu.AddItem("Paste|Ctrl+V");
|
||||
menuItem.mOnMenuItemSelected.Add(new (menu) =>
|
||||
{
|
||||
PasteText();
|
||||
});
|
||||
|
||||
// Debugger options
|
||||
menu.AddItem();
|
||||
var debugger = IDEApp.sApp.mDebugger;
|
||||
bool isPaused = debugger.IsPaused();
|
||||
menuItem = menu.AddItem("Show Disassembly");
|
||||
menuItem.SetDisabled(!isPaused);
|
||||
menuItem.mOnMenuItemSelected.Add(new (evt) => IDEApp.sApp.ShowDisassemblyAtCursor());
|
||||
|
||||
var stepIntoSpecificMenu = menu.AddItem("Step into Specific");
|
||||
stepIntoSpecificMenu.SetDisabled(isPaused);
|
||||
stepIntoSpecificMenu.IsParent = true;
|
||||
var stepFilterMenu = menu.AddItem("Step Filter");
|
||||
stepFilterMenu.SetDisabled(isPaused);
|
||||
stepFilterMenu.IsParent = true;
|
||||
|
||||
if (isPaused)
|
||||
{
|
||||
int addr;
|
||||
String file = scope String();
|
||||
String stackFrameInfo = scope String();
|
||||
|
@ -3186,11 +3290,11 @@ namespace IDE.ui
|
|||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stepIntoSpecificMenu.mDisabled = stepIntoSpecificMenu.mItems.Count == 0;
|
||||
stepFilterMenu.mDisabled = stepFilterMenu.mItems.Count == 0;
|
||||
}
|
||||
stepIntoSpecificMenu.mDisabled |= stepIntoSpecificMenu.mItems.Count == 0;
|
||||
stepFilterMenu.mDisabled |= stepFilterMenu.mItems.Count == 0;
|
||||
}
|
||||
else // (!mSourceViewPanel.mIsSourceCode)
|
||||
{
|
||||
|
|
|
@ -933,7 +933,7 @@ namespace IDE.ui
|
|||
|
||||
public bool Classify(ResolveType resolveType, ResolveParams resolveParams = null)
|
||||
{
|
||||
if (resolveType == .Autocomplete)
|
||||
if (resolveType == .GetFixits)
|
||||
{
|
||||
NOP!();
|
||||
}
|
||||
|
@ -1605,7 +1605,11 @@ namespace IDE.ui
|
|||
}
|
||||
else if ((resolveType == .Autocomplete) || (resolveType == .GetFixits))
|
||||
{
|
||||
if ((resolveParams == null) || (!resolveParams.mCancelled))
|
||||
if ((resolveParams != null) && (resolveType == .GetFixits))
|
||||
{
|
||||
resolveParams.mNavigationData = new String(autocompleteInfo);
|
||||
}
|
||||
else if ((resolveParams == null) || (!resolveParams.mCancelled))
|
||||
{
|
||||
bool changedAfterInfo = (resolveParams != null) && (resolveParams.mTextVersion != Content.mData.mCurTextVersionId);
|
||||
|
||||
|
@ -3113,6 +3117,7 @@ namespace IDE.ui
|
|||
CloseHeader();
|
||||
|
||||
mPanelHeader = new PanelHeader();
|
||||
mPanelHeader.mKind = .WrongHash;
|
||||
String fileName = scope String();
|
||||
Path.GetFileName(mFilePath, fileName);
|
||||
String headerStr = scope String();
|
||||
|
@ -5345,6 +5350,18 @@ namespace IDE.ui
|
|||
|
||||
EnsureReady();
|
||||
|
||||
if (mPanelHeader != null)
|
||||
{
|
||||
if (mPanelHeader.mKind == .WrongHash)
|
||||
{
|
||||
if (!gApp.mDebugger.mIsRunning)
|
||||
{
|
||||
// No longer makes sense if we're not even running
|
||||
CloseHeader();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mProjectSource == null)
|
||||
{
|
||||
if (mEditData != null)
|
||||
|
|
|
@ -2670,6 +2670,8 @@ namespace IDE.ui
|
|||
|
||||
if (listViewItem != null)
|
||||
{
|
||||
var clickedHoverItem = listViewItem.GetSubItem(0) as HoverWatch.HoverListViewItem;
|
||||
|
||||
var watchEntry = listViewItem.mWatchEntry;
|
||||
if (listViewItem.mParentItem != listView.GetRoot())
|
||||
{
|
||||
|
@ -2750,13 +2752,20 @@ namespace IDE.ui
|
|||
}
|
||||
}
|
||||
|
||||
void WithSelected(Action<ListViewItem> func)
|
||||
{
|
||||
var root = listView.GetRoot();
|
||||
root.WithSelectedItems(func);
|
||||
|
||||
if (clickedHoverItem != null)
|
||||
func(clickedHoverItem);
|
||||
}
|
||||
|
||||
anItem = menu.AddItem("Copy Value");
|
||||
anItem.mOnMenuItemSelected.Add(new (evt) =>
|
||||
{
|
||||
String selectedText = scope String();
|
||||
|
||||
var root = listView.GetRoot();
|
||||
root.WithSelectedItems(scope (listViewItem) =>
|
||||
WithSelected(scope (listViewItem) =>
|
||||
{
|
||||
if (!selectedText.IsEmpty)
|
||||
{
|
||||
|
@ -2772,9 +2781,7 @@ namespace IDE.ui
|
|||
anItem.mOnMenuItemSelected.Add(new (evt) =>
|
||||
{
|
||||
String selectedText = scope String();
|
||||
|
||||
var root = listView.GetRoot();
|
||||
root.WithSelectedItems(scope (listViewItem) =>
|
||||
WithSelected(scope (listViewItem) =>
|
||||
{
|
||||
String evalStr = scope String();
|
||||
CompactChildExpression((WatchListViewItem)listViewItem, evalStr);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue