mirror of
https://github.com/fadden/6502bench.git
synced 2025-08-09 20:25:24 +00:00
Add status flag editing
Getting the layout just right got a little wordy in XAML. There's probably a way to make a Grid do what I want. This'll do for now. Also, fixed the labels on the buttons in DiscardChanges, which were reversed.
This commit is contained in:
@@ -966,7 +966,10 @@ namespace SourceGenWPF {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the project. If it hasn't been saved before, use save-as behavior instead.
|
/// <summary>
|
||||||
|
/// Save the project. If it hasn't been saved before, use save-as behavior instead.
|
||||||
|
/// </summary>
|
||||||
|
/// <returns>True on success, false if the save attempt failed.</returns>
|
||||||
private bool DoSave() {
|
private bool DoSave() {
|
||||||
if (string.IsNullOrEmpty(mProjectPathName)) {
|
if (string.IsNullOrEmpty(mProjectPathName)) {
|
||||||
return DoSaveAs();
|
return DoSaveAs();
|
||||||
@@ -1054,6 +1057,7 @@ namespace SourceGenWPF {
|
|||||||
}
|
}
|
||||||
mDataPathName = null;
|
mDataPathName = null;
|
||||||
mProjectPathName = null;
|
mProjectPathName = null;
|
||||||
|
mTargetHighlightIndex = -1;
|
||||||
#if false
|
#if false
|
||||||
mSymbolSubset = new SymbolTableSubset(new SymbolTable());
|
mSymbolSubset = new SymbolTableSubset(new SymbolTable());
|
||||||
#endif
|
#endif
|
||||||
@@ -1101,11 +1105,9 @@ namespace SourceGenWPF {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case LineListGen.Line.Type.RegWidthDirective:
|
case LineListGen.Line.Type.RegWidthDirective:
|
||||||
#if false
|
if (CanEditStatusFlags()) {
|
||||||
if (overrideStatusFlagsToolStripMenuItem.Enabled) {
|
EditStatusFlags();
|
||||||
EditStatusFlags_Click(sender, e);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case LineListGen.Line.Type.LongComment:
|
case LineListGen.Line.Type.LongComment:
|
||||||
#if false
|
#if false
|
||||||
@@ -1143,11 +1145,9 @@ namespace SourceGenWPF {
|
|||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case ColumnIndex.Flags:
|
case ColumnIndex.Flags:
|
||||||
#if false
|
if (CanEditStatusFlags()) {
|
||||||
if (overrideStatusFlagsToolStripMenuItem.Enabled) {
|
EditStatusFlags();
|
||||||
EditStatusFlags_Click(sender, e);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case ColumnIndex.Attributes:
|
case ColumnIndex.Attributes:
|
||||||
// does nothing
|
// does nothing
|
||||||
@@ -1230,8 +1230,7 @@ namespace SourceGenWPF {
|
|||||||
Anattrib attr = mProject.GetAnattrib(offset);
|
Anattrib attr = mProject.GetAnattrib(offset);
|
||||||
|
|
||||||
EditAddress dlg = new EditAddress(mMainWin, attr.Address, mProject.CpuDef.MaxAddressValue);
|
EditAddress dlg = new EditAddress(mMainWin, attr.Address, mProject.CpuDef.MaxAddressValue);
|
||||||
bool? ok = dlg.ShowDialog();
|
if (dlg.ShowDialog() != true) {
|
||||||
if (ok != true) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1258,6 +1257,34 @@ namespace SourceGenWPF {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public bool CanEditStatusFlags() {
|
||||||
|
if (SelectionAnalysis.mNumItemsSelected != 1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
EntityCounts counts = SelectionAnalysis.mEntityCounts;
|
||||||
|
// Line must be code, or a RegWidth directive.
|
||||||
|
return (SelectionAnalysis.mLineType == LineListGen.Line.Type.Code ||
|
||||||
|
SelectionAnalysis.mLineType == LineListGen.Line.Type.RegWidthDirective);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void EditStatusFlags() {
|
||||||
|
int selIndex = mMainWin.CodeListView_GetFirstSelectedIndex();
|
||||||
|
int offset = CodeLineList[selIndex].FileOffset;
|
||||||
|
|
||||||
|
EditStatusFlags dlg = new EditStatusFlags(mMainWin,
|
||||||
|
mProject.StatusFlagOverrides[offset], mProject.CpuDef.HasEmuFlag);
|
||||||
|
if (dlg.ShowDialog() != true) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (dlg.FlagValue != mProject.StatusFlagOverrides[offset]) {
|
||||||
|
UndoableChange uc = UndoableChange.CreateStatusFlagChange(offset,
|
||||||
|
mProject.StatusFlagOverrides[offset], dlg.FlagValue);
|
||||||
|
ChangeSet cs = new ChangeSet(uc);
|
||||||
|
ApplyUndoableChanges(cs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Moves the view and selection to the specified offset. We want to select stuff
|
/// Moves the view and selection to the specified offset. We want to select stuff
|
||||||
/// differently if we're jumping to a note vs. jumping to an instruction.
|
/// differently if we're jumping to a note vs. jumping to an instruction.
|
||||||
@@ -1318,23 +1345,6 @@ namespace SourceGenWPF {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Scrolls the code list so that the specified label is shown.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="sym">Label symbol.</param>
|
|
||||||
public void GoToLabel(Symbol sym) {
|
|
||||||
if (sym.IsInternalLabel) {
|
|
||||||
int offset = mProject.FindLabelOffsetByName(sym.Label);
|
|
||||||
if (offset >= 0) {
|
|
||||||
GoToOffset(offset, false, true);
|
|
||||||
} else {
|
|
||||||
Debug.WriteLine("DClick symbol: " + sym + ": label not found");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Debug.WriteLine("DClick symbol: " + sym + ": not label");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public bool CanNavigateBackward() {
|
public bool CanNavigateBackward() {
|
||||||
return mNavStack.HasBackward;
|
return mNavStack.HasBackward;
|
||||||
}
|
}
|
||||||
@@ -1353,6 +1363,23 @@ namespace SourceGenWPF {
|
|||||||
GoToOffset(fwdOff, false, false);
|
GoToOffset(fwdOff, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Scrolls the code list so that the specified label is shown.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="sym">Label symbol.</param>
|
||||||
|
public void GoToLabel(Symbol sym) {
|
||||||
|
if (sym.IsInternalLabel) {
|
||||||
|
int offset = mProject.FindLabelOffsetByName(sym.Label);
|
||||||
|
if (offset >= 0) {
|
||||||
|
GoToOffset(offset, false, true);
|
||||||
|
} else {
|
||||||
|
Debug.WriteLine("DClick symbol: " + sym + ": label not found");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Debug.WriteLine("DClick symbol: " + sym + ": not label");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SelectionChanged() {
|
public void SelectionChanged() {
|
||||||
SelectionAnalysis = UpdateSelectionState();
|
SelectionAnalysis = UpdateSelectionState();
|
||||||
|
|
||||||
|
@@ -22,15 +22,20 @@ limitations under the License.
|
|||||||
xmlns:local="clr-namespace:SourceGenWPF.ProjWin"
|
xmlns:local="clr-namespace:SourceGenWPF.ProjWin"
|
||||||
mc:Ignorable="d"
|
mc:Ignorable="d"
|
||||||
Title="Discard Changes?"
|
Title="Discard Changes?"
|
||||||
|
FocusManager.FocusedElement="{Binding ElementName=cancelButton}"
|
||||||
SizeToContent="WidthAndHeight" ResizeMode="NoResize"
|
SizeToContent="WidthAndHeight" ResizeMode="NoResize"
|
||||||
ShowInTaskbar="False" WindowStartupLocation="CenterOwner">
|
ShowInTaskbar="False" WindowStartupLocation="CenterOwner">
|
||||||
|
|
||||||
<StackPanel Margin="8">
|
<StackPanel Margin="8">
|
||||||
<TextBlock Text="You have unsaved changes that will be lost if you continue."/>
|
<TextBlock Text="You have unsaved changes that will be lost if you continue."/>
|
||||||
<TextBlock Margin="0,8,0,0" Text="How do you wish to proceed?"/>
|
<TextBlock Margin="0,8,0,0" Text="How do you wish to proceed?"/>
|
||||||
<StackPanel Margin="0,16,0,0" Orientation="Horizontal">
|
<StackPanel Margin="0,16,0,0" Orientation="Horizontal">
|
||||||
<Button Name="dontSaveButton" Width="120" Content="_Save & Continue" Click="DontSaveButton_Click"/>
|
<Button Name="saveButton" Width="120"
|
||||||
<Button Name="saveButton" Width="120" Margin="8,0,0,0" Content="_Discard & Continue" Click="SaveButton_Click"/>
|
Content="_Save & Continue" Click="SaveButton_Click"/>
|
||||||
<Button Name="cancelButton" Width="120" Margin="8,0,0,0" Content="Cancel" IsCancel="True"/>
|
<Button Name="dontSaveButton" Width="120" Margin="8,0,0,0"
|
||||||
|
Content="_Discard & Continue" Click="DontSaveButton_Click"/>
|
||||||
|
<Button Name="cancelButton" Width="120" Margin="8,0,0,0"
|
||||||
|
Content="Cancel" IsCancel="True"/>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</StackPanel>
|
</StackPanel>
|
||||||
</Window>
|
</Window>
|
||||||
|
@@ -36,10 +36,6 @@ namespace SourceGenWPF.ProjWin {
|
|||||||
Owner = owner;
|
Owner = owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO:
|
|
||||||
// https://stackoverflow.com/questions/817610/wpf-and-initial-focus
|
|
||||||
// FocusManager.FocusedElement={Binding ElementName=cancelButton}"
|
|
||||||
|
|
||||||
private void SaveButton_Click(object sender, RoutedEventArgs e) {
|
private void SaveButton_Click(object sender, RoutedEventArgs e) {
|
||||||
UserChoice = Choice.SaveAndContinue;
|
UserChoice = Choice.SaveAndContinue;
|
||||||
DialogResult = true;
|
DialogResult = true;
|
||||||
|
242
SourceGenWPF/ProjWin/EditStatusFlags.xaml
Normal file
242
SourceGenWPF/ProjWin/EditStatusFlags.xaml
Normal file
@@ -0,0 +1,242 @@
|
|||||||
|
<!--
|
||||||
|
Copyright 2019 faddenSoft
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<Window x:Class="SourceGenWPF.ProjWin.EditStatusFlags"
|
||||||
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||||
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||||
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||||
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||||
|
xmlns:local="clr-namespace:SourceGenWPF.ProjWin"
|
||||||
|
mc:Ignorable="d"
|
||||||
|
Title="Override Status Flags"
|
||||||
|
SizeToContent="WidthAndHeight" ResizeMode="NoResize"
|
||||||
|
ShowInTaskbar="False" WindowStartupLocation="CenterOwner"
|
||||||
|
Loaded="Window_Loaded">
|
||||||
|
|
||||||
|
<Window.Resources>
|
||||||
|
<Thickness x:Key="Spacer" Left="0" Top="1" Right="0" Bottom="0"/>
|
||||||
|
</Window.Resources>
|
||||||
|
|
||||||
|
<StackPanel Margin="8">
|
||||||
|
<TextBlock>Override the processor state values determined by the code analyzer.</TextBlock>
|
||||||
|
|
||||||
|
<StackPanel Orientation="Horizontal" Margin="0,8,0,0" >
|
||||||
|
<StackPanel>
|
||||||
|
<TextBlock FontSize="16" Margin="0,0,0,-1"/>
|
||||||
|
<TextBlock HorizontalAlignment="Right" Margin="{StaticResource Spacer}">Default</TextBlock>
|
||||||
|
<TextBlock HorizontalAlignment="Right" Margin="{StaticResource Spacer}">Zero</TextBlock>
|
||||||
|
<TextBlock HorizontalAlignment="Right" Margin="{StaticResource Spacer}">One</TextBlock>
|
||||||
|
<TextBlock HorizontalAlignment="Right" Margin="{StaticResource Spacer}">Indeterminate</TextBlock>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<!-- RadioButton and TextBlock don't have the same vertical dimensions, so we
|
||||||
|
use a StackPanel with one of each to make the buttons line up with the labels.
|
||||||
|
Unfortunately this foils the automatic grouping. -->
|
||||||
|
<StackPanel Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">N</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioNDefault" GroupName="N" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioNZero" GroupName="N" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioNOne" GroupName="N" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioNIndeterminate" GroupName="N" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">V</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioVDefault" GroupName="V" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioVZero" GroupName="V" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioVOne" GroupName="V" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioVIndeterminate" GroupName="V" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Name="panelM" Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">M</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioMDefault" GroupName="M" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioMZero" GroupName="M" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioMOne" GroupName="M" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioMIndeterminate" GroupName="M" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
|
||||||
|
<StackPanel Name="panelX" Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">X</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioXDefault" GroupName="X" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioXZero" GroupName="X" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioXOne" GroupName="X" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioXIndeterminate" GroupName="X" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">D</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioDDefault" GroupName="D" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioDZero" GroupName="D" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioDOne" GroupName="D" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioDIndeterminate" GroupName="D" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="8,0,0,0">
|
||||||
|
<TextBlock FontSize="16" HorizontalAlignment="Center">I</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioIDefault" GroupName="I" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioIZero" GroupName="I" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioIOne" GroupName="I" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioIIndeterminate" GroupName="I" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">Z</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioZDefault" GroupName="Z" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioZZero" GroupName="Z" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioZOne" GroupName="Z" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioZIndeterminate" GroupName="Z" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Margin="8,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">C</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioCDefault" GroupName="C" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioCZero" GroupName="C" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioCOne" GroupName="C" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioCIndeterminate" GroupName="C" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<StackPanel Name="panelE" Margin="16,0,0,0">
|
||||||
|
<TextBlock HorizontalAlignment="Center" FontSize="16">E</TextBlock>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioEDefault" GroupName="E" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioEZero" GroupName="E" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioEOne" GroupName="E" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
<StackPanel Orientation="Horizontal">
|
||||||
|
<RadioButton Name="radioEIndeterminate" GroupName="E" Margin="{StaticResource Spacer}"/>
|
||||||
|
<TextBlock Margin="{StaticResource Spacer}"/>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</StackPanel>
|
||||||
|
|
||||||
|
<TextBlock Margin="0,8,0,0">Tip: to configure 16-bit wide regs on 65802/65816, set M, X, and E to 0.</TextBlock>
|
||||||
|
|
||||||
|
<DockPanel Margin="0,16,0,0" LastChildFill="False">
|
||||||
|
<Button DockPanel.Dock="Left" Name="resetButton" Content="Reset to Default"
|
||||||
|
Width="120" Click="ResetButton_Click" HorizontalAlignment="Left"/>
|
||||||
|
<Button DockPanel.Dock="Right" Name="cancelButton" Content="Cancel" IsCancel="True"
|
||||||
|
Width="70" Margin="4,0,0,0"/>
|
||||||
|
<Button DockPanel.Dock="Right" Name="okButton" Content="OK" IsDefault="True"
|
||||||
|
Width="70" Click="OkButton_Click"/>
|
||||||
|
|
||||||
|
</DockPanel>
|
||||||
|
</StackPanel>
|
||||||
|
</Window>
|
169
SourceGenWPF/ProjWin/EditStatusFlags.xaml.cs
Normal file
169
SourceGenWPF/ProjWin/EditStatusFlags.xaml.cs
Normal file
@@ -0,0 +1,169 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2019 faddenSoft
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
using System;
|
||||||
|
using System.Windows;
|
||||||
|
using System.Windows.Controls;
|
||||||
|
|
||||||
|
using Asm65;
|
||||||
|
|
||||||
|
namespace SourceGenWPF.ProjWin {
|
||||||
|
/// <summary>
|
||||||
|
/// Edit Status Flags dialog.
|
||||||
|
/// </summary>
|
||||||
|
public partial class EditStatusFlags : Window {
|
||||||
|
/// <summary>
|
||||||
|
/// Edited status flag value.
|
||||||
|
/// </summary>
|
||||||
|
public StatusFlags FlagValue { get; private set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Set this if the CPU has an emulation flag (65802/65816). If this isn't
|
||||||
|
/// set, the M, X, and E flag buttons will be disabled.
|
||||||
|
/// </summary>
|
||||||
|
private bool mHasEmuFlag;
|
||||||
|
|
||||||
|
|
||||||
|
public EditStatusFlags(Window owner, StatusFlags flagValue, bool hasEmuFlag) {
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
FlagValue = flagValue;
|
||||||
|
mHasEmuFlag = hasEmuFlag;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Window_Loaded(object sender, RoutedEventArgs e) {
|
||||||
|
if (!mHasEmuFlag) {
|
||||||
|
panelM.IsEnabled = false;
|
||||||
|
panelX.IsEnabled = false;
|
||||||
|
panelE.IsEnabled = false;
|
||||||
|
|
||||||
|
// I'm not going to force the M/X/E flags to have a particular value based
|
||||||
|
// on the CPU definition. The flags aren't used for non-65802/65816, so
|
||||||
|
// the values are irrelevant. If somebody is switching between CPUs I think
|
||||||
|
// it'd be weird to force the values during editing but leave any non-edited
|
||||||
|
// values alone. If they want to switch to 65816, set M/X/E, and then switch
|
||||||
|
// back, they're welcome to do so.
|
||||||
|
}
|
||||||
|
|
||||||
|
SetCheckedButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OkButton_Click(object sender, RoutedEventArgs e) {
|
||||||
|
StatusFlags flags = new StatusFlags();
|
||||||
|
|
||||||
|
flags.N = GetChecked(radioNDefault, radioNZero, radioNOne, radioNIndeterminate);
|
||||||
|
flags.V = GetChecked(radioVDefault, radioVZero, radioVOne, radioVIndeterminate);
|
||||||
|
flags.M = GetChecked(radioMDefault, radioMZero, radioMOne, radioMIndeterminate);
|
||||||
|
flags.X = GetChecked(radioXDefault, radioXZero, radioXOne, radioXIndeterminate);
|
||||||
|
flags.D = GetChecked(radioDDefault, radioDZero, radioDOne, radioDIndeterminate);
|
||||||
|
flags.I = GetChecked(radioIDefault, radioIZero, radioIOne, radioIIndeterminate);
|
||||||
|
flags.Z = GetChecked(radioZDefault, radioZZero, radioZOne, radioZIndeterminate);
|
||||||
|
flags.C = GetChecked(radioCDefault, radioCZero, radioCOne, radioCIndeterminate);
|
||||||
|
flags.E = GetChecked(radioEDefault, radioEZero, radioEOne, radioEIndeterminate);
|
||||||
|
|
||||||
|
//// If they're setting emulation mode, also set M/X to 1. This is implicitly
|
||||||
|
//// true, but things are a bit clearer if we make it explicit.
|
||||||
|
//if (flags.E == 1) {
|
||||||
|
// flags.M = flags.X = 1;
|
||||||
|
//}
|
||||||
|
|
||||||
|
FlagValue = flags;
|
||||||
|
DialogResult = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ResetButton_Click(object sender, EventArgs e) {
|
||||||
|
FlagValue = new StatusFlags();
|
||||||
|
SetCheckedButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Calls SetChecked() for each flag.
|
||||||
|
/// </summary>
|
||||||
|
private void SetCheckedButtons() {
|
||||||
|
SetChecked(FlagValue.N, radioNDefault, radioNZero, radioNOne, radioNIndeterminate);
|
||||||
|
SetChecked(FlagValue.V, radioVDefault, radioVZero, radioVOne, radioVIndeterminate);
|
||||||
|
SetChecked(FlagValue.M, radioMDefault, radioMZero, radioMOne, radioMIndeterminate);
|
||||||
|
SetChecked(FlagValue.X, radioXDefault, radioXZero, radioXOne, radioXIndeterminate);
|
||||||
|
SetChecked(FlagValue.D, radioDDefault, radioDZero, radioDOne, radioDIndeterminate);
|
||||||
|
SetChecked(FlagValue.I, radioIDefault, radioIZero, radioIOne, radioIIndeterminate);
|
||||||
|
SetChecked(FlagValue.Z, radioZDefault, radioZZero, radioZOne, radioZIndeterminate);
|
||||||
|
SetChecked(FlagValue.C, radioCDefault, radioCZero, radioCOne, radioCIndeterminate);
|
||||||
|
SetChecked(FlagValue.E, radioEDefault, radioEZero, radioEOne, radioEIndeterminate);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sets the "checked" flag on the appropriate radio button.
|
||||||
|
/// </summary>
|
||||||
|
private void SetChecked(int value, RadioButton def, RadioButton zero, RadioButton one,
|
||||||
|
RadioButton indeterminate) {
|
||||||
|
switch (value) {
|
||||||
|
case TriState16.UNSPECIFIED:
|
||||||
|
def.IsChecked = true;
|
||||||
|
break;
|
||||||
|
case TriState16.INDETERMINATE:
|
||||||
|
indeterminate.IsChecked = true;
|
||||||
|
break;
|
||||||
|
case 0:
|
||||||
|
zero.IsChecked = true;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
one.IsChecked = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Exception("Unexpected value " + value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void okButton_Click(object sender, EventArgs e) {
|
||||||
|
StatusFlags flags = new StatusFlags();
|
||||||
|
|
||||||
|
flags.N = GetChecked(radioNDefault, radioNZero, radioNOne, radioNIndeterminate);
|
||||||
|
flags.V = GetChecked(radioVDefault, radioVZero, radioVOne, radioVIndeterminate);
|
||||||
|
flags.M = GetChecked(radioMDefault, radioMZero, radioMOne, radioMIndeterminate);
|
||||||
|
flags.X = GetChecked(radioXDefault, radioXZero, radioXOne, radioXIndeterminate);
|
||||||
|
flags.D = GetChecked(radioDDefault, radioDZero, radioDOne, radioDIndeterminate);
|
||||||
|
flags.I = GetChecked(radioIDefault, radioIZero, radioIOne, radioIIndeterminate);
|
||||||
|
flags.Z = GetChecked(radioZDefault, radioZZero, radioZOne, radioZIndeterminate);
|
||||||
|
flags.C = GetChecked(radioCDefault, radioCZero, radioCOne, radioCIndeterminate);
|
||||||
|
flags.E = GetChecked(radioEDefault, radioEZero, radioEOne, radioEIndeterminate);
|
||||||
|
|
||||||
|
//// If they're setting emulation mode, also set M/X to 1. This is implicitly
|
||||||
|
//// true, but things are a bit clearer if we make it explicit.
|
||||||
|
//if (flags.E == 1) {
|
||||||
|
// flags.M = flags.X = 1;
|
||||||
|
//}
|
||||||
|
|
||||||
|
FlagValue = flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Identifies the checked radio button and returns the appropriate TriState16 value.
|
||||||
|
/// </summary>
|
||||||
|
private int GetChecked(RadioButton def, RadioButton zero, RadioButton one,
|
||||||
|
RadioButton indeterminate) {
|
||||||
|
if (zero.IsChecked == true) {
|
||||||
|
return 0;
|
||||||
|
} else if (one.IsChecked == true) {
|
||||||
|
return 1;
|
||||||
|
} else if (indeterminate.IsChecked == true) {
|
||||||
|
return TriState16.INDETERMINATE;
|
||||||
|
} else if (def.IsChecked == true) {
|
||||||
|
return TriState16.UNSPECIFIED;
|
||||||
|
} else {
|
||||||
|
throw new Exception("No radio button selected");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -54,6 +54,7 @@ limitations under the License.
|
|||||||
</RoutedUICommand>
|
</RoutedUICommand>
|
||||||
<RoutedUICommand x:Key="CloseCmd" Text="Close"/>
|
<RoutedUICommand x:Key="CloseCmd" Text="Close"/>
|
||||||
<RoutedUICommand x:Key="EditAddressCmd" Text="Set Address..."/>
|
<RoutedUICommand x:Key="EditAddressCmd" Text="Set Address..."/>
|
||||||
|
<RoutedUICommand x:Key="EditStatusFlags" Text="Override Status Flags..."/>
|
||||||
<RoutedUICommand x:Key="HintAsCodeEntryPointCmd" Text="Hint As Code Entry Point"/>
|
<RoutedUICommand x:Key="HintAsCodeEntryPointCmd" Text="Hint As Code Entry Point"/>
|
||||||
<RoutedUICommand x:Key="HintAsDataStartCmd" Text="Hint As Data Start"/>
|
<RoutedUICommand x:Key="HintAsDataStartCmd" Text="Hint As Data Start"/>
|
||||||
<RoutedUICommand x:Key="HintAsInlineDataCmd" Text="Hint As Inline Data"/>
|
<RoutedUICommand x:Key="HintAsInlineDataCmd" Text="Hint As Inline Data"/>
|
||||||
@@ -100,6 +101,8 @@ limitations under the License.
|
|||||||
CanExecute="IsProjectOpen" Executed="CloseCmd_Executed"/>
|
CanExecute="IsProjectOpen" Executed="CloseCmd_Executed"/>
|
||||||
<CommandBinding Command="{StaticResource EditAddressCmd}"
|
<CommandBinding Command="{StaticResource EditAddressCmd}"
|
||||||
CanExecute="CanEditAddress" Executed="EditAddressCmd_Executed"/>
|
CanExecute="CanEditAddress" Executed="EditAddressCmd_Executed"/>
|
||||||
|
<CommandBinding Command="{StaticResource EditStatusFlags}"
|
||||||
|
CanExecute="CanEditStatusFlags" Executed="EditStatusFlags_Executed"/>
|
||||||
<CommandBinding Command="Help"
|
<CommandBinding Command="Help"
|
||||||
Executed="HelpCmd_Executed"/>
|
Executed="HelpCmd_Executed"/>
|
||||||
<CommandBinding Command="{StaticResource HintAsCodeEntryPointCmd}"
|
<CommandBinding Command="{StaticResource HintAsCodeEntryPointCmd}"
|
||||||
@@ -161,7 +164,7 @@ limitations under the License.
|
|||||||
</MenuItem>
|
</MenuItem>
|
||||||
<MenuItem Name="ActionsMenu" Header="_Actions">
|
<MenuItem Name="ActionsMenu" Header="_Actions">
|
||||||
<MenuItem Command="{StaticResource EditAddressCmd}"/>
|
<MenuItem Command="{StaticResource EditAddressCmd}"/>
|
||||||
<MenuItem Header="Override Status Flags..."/>
|
<MenuItem Command="{StaticResource EditStatusFlags}"/>
|
||||||
<MenuItem Header="Edit Label..."/>
|
<MenuItem Header="Edit Label..."/>
|
||||||
<MenuItem Header="Edit Operand..."/>
|
<MenuItem Header="Edit Operand..."/>
|
||||||
<MenuItem Header="Edit Comment..."/>
|
<MenuItem Header="Edit Comment..."/>
|
||||||
|
@@ -270,7 +270,9 @@ namespace SourceGenWPF.ProjWin {
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
private void Window_MouseDown(object sender, MouseButtonEventArgs e) {
|
private void Window_MouseDown(object sender, MouseButtonEventArgs e) {
|
||||||
if (e.ChangedButton == MouseButton.XButton1) {
|
if (e.ChangedButton == MouseButton.XButton1) {
|
||||||
Debug.WriteLine("TODO: navigate back");
|
if (mMainCtrl.CanNavigateBackward()) {
|
||||||
|
mMainCtrl.NavigateBackward();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -673,6 +675,14 @@ namespace SourceGenWPF.ProjWin {
|
|||||||
e.CanExecute = mMainCtrl.CanEditAddress();
|
e.CanExecute = mMainCtrl.CanEditAddress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void CanEditStatusFlags(object sender, CanExecuteRoutedEventArgs e) {
|
||||||
|
if (mMainCtrl == null || !mMainCtrl.IsProjectOpen()) {
|
||||||
|
e.CanExecute = false;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
e.CanExecute = mMainCtrl.CanEditStatusFlags();
|
||||||
|
}
|
||||||
|
|
||||||
private void CanHintAsCodeEntryPoint(object sender, CanExecuteRoutedEventArgs e) {
|
private void CanHintAsCodeEntryPoint(object sender, CanExecuteRoutedEventArgs e) {
|
||||||
if (mMainCtrl == null || !mMainCtrl.IsProjectOpen()) {
|
if (mMainCtrl == null || !mMainCtrl.IsProjectOpen()) {
|
||||||
e.CanExecute = false;
|
e.CanExecute = false;
|
||||||
@@ -744,6 +754,10 @@ namespace SourceGenWPF.ProjWin {
|
|||||||
mMainCtrl.EditAddress();
|
mMainCtrl.EditAddress();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void EditStatusFlags_Executed(object sender, ExecutedRoutedEventArgs e) {
|
||||||
|
mMainCtrl.EditStatusFlags();
|
||||||
|
}
|
||||||
|
|
||||||
private void HelpCmd_Executed(object sender, ExecutedRoutedEventArgs e) {
|
private void HelpCmd_Executed(object sender, ExecutedRoutedEventArgs e) {
|
||||||
mMainCtrl.ShowHelp();
|
mMainCtrl.ShowHelp();
|
||||||
}
|
}
|
||||||
|
@@ -84,6 +84,9 @@
|
|||||||
<Compile Include="ProjWin\EditAddress.xaml.cs">
|
<Compile Include="ProjWin\EditAddress.xaml.cs">
|
||||||
<DependentUpon>EditAddress.xaml</DependentUpon>
|
<DependentUpon>EditAddress.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
|
<Compile Include="ProjWin\EditStatusFlags.xaml.cs">
|
||||||
|
<DependentUpon>EditStatusFlags.xaml</DependentUpon>
|
||||||
|
</Compile>
|
||||||
<Compile Include="ProjWin\ProjectLoadIssue.xaml.cs">
|
<Compile Include="ProjWin\ProjectLoadIssue.xaml.cs">
|
||||||
<DependentUpon>ProjectLoadIssue.xaml</DependentUpon>
|
<DependentUpon>ProjectLoadIssue.xaml</DependentUpon>
|
||||||
</Compile>
|
</Compile>
|
||||||
@@ -168,6 +171,10 @@
|
|||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
</Page>
|
</Page>
|
||||||
|
<Page Include="ProjWin\EditStatusFlags.xaml">
|
||||||
|
<SubType>Designer</SubType>
|
||||||
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
</Page>
|
||||||
<Page Include="ProjWin\MainWindow.xaml">
|
<Page Include="ProjWin\MainWindow.xaml">
|
||||||
<SubType>Designer</SubType>
|
<SubType>Designer</SubType>
|
||||||
<Generator>MSBuild:Compile</Generator>
|
<Generator>MSBuild:Compile</Generator>
|
||||||
|
Reference in New Issue
Block a user