1
0
mirror of https://github.com/fadden/6502bench.git synced 2024-12-01 22:50:35 +00:00
Commit Graph

66 Commits

Author SHA1 Message Date
Andy McFadden
be0e6bead1 Minor reshuffling
This was an attempt to add a "loading..." dialog during the initial
open of the project.  This can have some lag because we create a
sandbox (which is currently taking about 300ms) and do a full project
refresh (which can take more than a second on a large 65816 project).

The trick is that we need to do these things on a background thread
while the main thread manages the UI.  We can't manipulate the UI
from the background thread.  For the most part this works, as the
project refresh stuff isn't tied to the UI, but we run into trouble
when generating the line list.  As currently implemented, the line
generator interacts directly with DisplayList, which is acting as an
ItemsSource for the main ListView.

To make this work correctly we'd need to dissociate DisplayList from
LineListGen, e.g. by having DisplayList record but defer changes
until a "go" method is called on the main thread.

The speed is only an issue for large programs, which aren't really
supported yet -- the UI is awkward to use with large files -- so I'm
not going to pursue this further for now.

Also, an unrelated fix: there was an issue where the current ListView
scroll position would be retained if you opened a project while one
was already open.  Harmless but weird.  We now scroll to the top.
2019-07-19 15:24:51 -07:00
Andy McFadden
84f4075ad4 Show a wait cursor when refreshing larger projects
Fiddled with the status bar, but that'll probably require async.
2019-07-19 11:41:18 -07:00
Andy McFadden
1044b9d479 Improve restoration of top position
The ListView control provides a ScrollIntoView() method that ensures
the specified item is on screen, scrolling the ListView if needed.
Unfortunately this method is very slow (50-100 ms) and sometimes
fails entirely on larger lists.  (Yay WPF.)

Because the ListView is scrolling by fixed-height item, it's possible
to use the underlying ScrollViewer to move the list instantaneously
and reliably.  So now we do that.

Also, fixed a bug with select-all, where we weren't clearing the
previous selection before calling SelectAll(), leading to a mismatch
with the secondary data structure that we maintain because WPF
ListViews can't deal with large selections efficiently.  (Yay WPF.)

There's still some weird behavior, e.g. sometimes hitting F5 clears
the current selection and sometimes it doesn't.  I think it's related
to which item has focus and the fact you're hitting a key; using the
debug menu item doesn't cause the behavior.

Also, increased MAX_SEL_COUNT from 2000 to 5000.  That takes about
200ms to restore to a ListView on my 5-year-old system.
2019-07-17 17:59:24 -07:00
Andy McFadden
a0dca6a5be Improve save & restore of top line
Whenever the display list gets regenerated, we need to restore the
code list view scroll position to the previous location in the file.
This gets tricky when multiple lines are appearing or disappearing.
We were saving the file offset of the line, but that works poorly
when there's a multi-line comment associated with that offset,
because we end up scrolling to the top of the comment whenever any
part of the comment is at the top of the screen.

We now track the file offset and the number of lines we were from
the top of that offset's content.  This works well unless we remove
a lot of lines.  If the adjusted line index would put us into a
different file offset, we punt and just scroll to the top of the item.

Also, fix a crasher in Edit Note.

Also, fix behavior when the list shrinks while a line near the end
of the file is selected.

Also, change a few instances of "Color.FromArgb(0,0,0,0)" to use a
common constant.
2019-07-17 14:08:53 -07:00
Andy McFadden
0ff2ebefdf Implement the "configure" button in the asm/gen dialog 2019-07-16 17:16:47 -07:00
Andy McFadden
310ed7649b Save & restore symbols list filter options 2019-07-16 14:52:08 -07:00
Andy McFadden
b42aa80cff Set main window title 2019-07-16 14:36:09 -07:00
Andy McFadden
b93def6560 Implement debug info windows
Show analysis timers, show analyzer output, and show undo/redo
history.

With this change, all main menu items have been ported to WPF.
2019-07-15 17:18:28 -07:00
Andy McFadden
2afdaf4ad3 Implement Extension Script Info debug feature 2019-07-15 16:50:54 -07:00
Andy McFadden
ef4fe35813 Implement simple DEBUG menu items
Refresh, comment ruler toggle, keep-alive toggle.
2019-07-15 15:32:27 -07:00
Andy McFadden
8a483f06c2 Implement Toggle ASCII Chart
While I was at it, I noticed that the ASCII chart and hex dump
viewer windows were always in front of the main app window.  It looks
like child windows are always in front.  The easy fix is to not
set an owner.

This causes a new problem: the windows don't get closed automatically
when the parent window closes, and the app won't exit until all
windows are closed.  So we now explicitly close the hex dump and
ASCII chart windows when the main window is closed, and we now keep
track of all the external-file hex dump windows.  (It always sort of
bothered me that we were creating hex dump windows and not keeping
track of them.  Itch has now been scratched.)

Also, changed the ascch-mode setting to be an enum rather than an
integer.  Renamed the setting to ascch-mode1.
2019-07-14 18:12:03 -07:00
Andy McFadden
131d1a7a63 Fix obscure list traversal issue
If you select a note, delete it, select some nearby lines, and hit
undo, then the next time you hit up/down arrow the list will jump
back to the first line.  The workaround for this appears to be to
set the focus on a selected ListViewItem from an obscure event.

Maybe there's a simpler way that I just missed?  This is absurd.
(Yay WPF.)
2019-07-14 15:11:27 -07:00
Andy McFadden
380c56a4ef Recalculate list indices after adding or removing lines
Minor display list bug that presented itself when a 3-line note
was deleted.
2019-07-14 14:41:46 -07:00
Andy McFadden
12874d32ba Implement three shortcut commands
Added:
  Toggle Single-BYte Format (Ctrl+B)
  Format As Word (Ctrl+W)
  Delete Note/Long Comment (Del)
2019-07-14 13:50:15 -07:00
Andy McFadden
2dd21d433d Implement Edit Project Symbol 2019-07-14 13:18:10 -07:00
Andy McFadden
f8b1fa3d66 Implement Edit Note 2019-07-13 17:04:47 -07:00
Andy McFadden
e49ee6f20b Finish split-address table formatter
A lot of things react to other things in this dialog.  I think I
got everything behaving correctly.
2019-07-13 15:55:32 -07:00
Andy McFadden
c6b63afb3e Layout and basic integration of Format Split Address Table 2019-07-13 13:31:51 -07:00
Andy McFadden
ea3108c564 Implement Tools > Hex Dump 2019-07-12 17:46:37 -07:00
Andy McFadden
acfbfcb642 Implement Show Hex Dump
Because of the way data virtualization works (or doesn't) in WPF,
this was a whole lot different from WinForms.  What I'm doing is
pretty simple, so I avoided the complexity (and quirks) inherent
to more complete data virtualization solutions.  (All I really want
is to not render the entire thing up front.)
2019-07-12 17:08:54 -07:00
Andy McFadden
b1f84864d6 Implement Edit Comment
I still don't know why Windows wants to refer to semicolon as
"Oem1".  Happily it's possible to override the tip string.
2019-07-11 15:55:43 -07:00
Andy McFadden
2f82ff5b46 Implement copy-to-clipboard
Also, add keyboard shortcuts to toolbar tooltips.  This is particularly
useful for navigate forward/backward, as those aren't part of the
menu structure, and have two keyboard shortcuts apiece.
2019-07-11 11:36:07 -07:00
Andy McFadden
300b2a4bca Initial layout of Edit Data Operand dialog 2019-07-08 17:02:25 -07:00
Andy McFadden
d2fe11e82c Implement Edit Instruction Operand
I'm planning to rework the dialog, so I didn't bother WPFing it up.

Also, explicitly recreate the contents of the Symbols window when
applying changes.  This used to happen implicitly via
SymbolTableSubset and the "change serial" in SymbolTable, but that
approach doesn't make sense for a DataGrid.
2019-07-08 15:40:30 -07:00
Andy McFadden
ed4fb0dd66 Fix Edit Label tweak
The change in 779566 missed a step, so the TextChanged method wasn't
getting called.  (When you bind TextBox Text to a string property, the
TextChanged events stop firing.  You need to react to the property
"set" call instead.)

Also, enable UseKeepAliveHack.  I have no reason to believe switching
to WPF will make remoting less flaky.
2019-07-08 13:43:10 -07:00
Andy McFadden
0c5ae78eaf Implement Toggle Data Scan
Had to fiddle with the menu item IsCheckable stuff for a bit, but I
think the approach is reasonable.
2019-07-07 17:17:48 -07:00
Andy McFadden
99b484df4c Implement long-comment editing
We can now Edit Long Comment and Edit Header Comment.

Changing the number of lines in a long comment exposed a bug in the
display list update.  Fixed.

Running the WinForms version trashed the column widths, which exposed
the fact that the default column widths were set too narrow.  Fixed.

On an unrelated note, hitting undo/redo quickly will sometimes leave
you scrolled to the bottom of the code list.  Some sort of command-
handling race in the WPF framework?  (Not fixed.)
2019-07-07 16:18:46 -07:00
Andy McFadden
1685e37c02 Implement "go to" feature 2019-07-07 14:30:38 -07:00
Andy McFadden
779566c236 Implement Find / Find Next
Also, tweaked Edit Label a bit.  I figured out how to make the
TextBox SelectAll+Focus work when the text is bound to a property.
2019-07-07 13:34:47 -07:00
Andy McFadden
741f7ef46a Implement Edit Label
The dialog is pretty straightforward.  This is the first editor that
can cause a partial update -- if you edit a label, only the lines
that refer to that label are regenerated -- so I added the code for
partial display list updates as well.

Also, while working on this I noticed that long comments were getting
ellipsized at a bad place.  The column width for the semi-hidden
column used for notes and long comments wasn't getting set.  After
fiddling with it a bit I determined that it really needed to be set to
the sum of the widths of the rightmost four columns, and updated
whenever column sizes change.  This was easier to do than I expected.
I may actually be getting the hang of WPF.
2019-07-06 17:24:42 -07:00
Andy McFadden
33c4b86b44 Implement "about" dialog 2019-07-06 15:51:57 -07:00
Andy McFadden
83fe70535b Port source generation test harness
I haven't figured out how to make the AppendText(text, color) extension
work right with the WPF version of RichTextBox, but I was able to work
around the issue, and it's not really worth sinking time into.
2019-07-06 14:20:51 -07:00
Andy McFadden
758d95e331 Rough project properties layout 2019-07-01 14:07:30 -07:00
Andy McFadden
c13daa7085 Implemented the first ("Code View") tab of settings
Notable items include the column show/hide buttons, which were
straightforward except for the "determine the default width" part,
and the font picker, which is no longer a standard dialog.  The
latter was complicated by the absence of a good way to detect
whether a font is mono-spaced or not without calling back into code
meant for WinForms font manipulation (with a dash of PInvoke).
Yay WPF.

Also, enabled character ellipsis for code list items.
2019-06-26 17:11:58 -07:00
Andy McFadden
0a96e014e2 Layout for app settings
Multi-tab dialog with tons of controls.

Also, fixed WorkProgress owner, and removed debug delay from source
gen dialog.
2019-06-24 17:32:53 -07:00
Andy McFadden
985eba804b First pass at Generate & Assemble dialog
Got the basic parts laid out and working, but it depends on the
progress dialogs to do actual work.
2019-06-23 17:24:51 -07:00
Andy McFadden
b91124999a Implement "new project"
WPF TreeViews are much different from WinForms.  Unexpectedly, they're
actually simpler and easier to work with.
2019-06-22 17:38:07 -07:00
Andy McFadden
6b29ce98f9 Implement "recents" feature
Add the list of recent projects to File > Recent Projects when the
sub-menu opens.  Make the buttons on the launch panel work correctly.
2019-06-22 14:41:09 -07:00
Andy McFadden
0041584d2e Rework NavStack
Instead of traversing a single dual-element stack, use separate
stacks for forward and backward.

Record whether the jump was from a Note, so we select the right
set of lines when we return to it.

If nothing is selected, push the current top position on, instead
of doing nothing at all.

Correctly handle the case where somebody is trying to jump to the
current position.
2019-06-22 11:36:08 -07:00
Andy McFadden
c87d79ec9e Wire up Open, Save, and Save As
These just needed to have methods added to the command definitions.

Also, added a style to the toolbar buttons so they fade when not
enabled.

Also, fixed the DataFileLoadIssue dialog, which was seriously broken.
2019-06-21 16:27:58 -07:00
Andy McFadden
007bf4e934 Rename ProjWin directory to WpfGui
"ProjWin" didn't really mean anything.  "WpfGui" emphasizes that
the contents are a WPF implementation of the GUI elements.

No substantive changes.
2019-06-21 15:17:04 -07:00
Andy McFadden
fdf53bdb34 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.
2019-06-21 15:06:04 -07:00
Andy McFadden
ea6125ea82 Save and restore grid column widths
Now preserving column widths for the three DataGrids and the main
ListView.  In theory the various grids would conveniently auto-size
to the content, but in practice that doesn't work well with
virtualization.

There is, of course, no simple "the width has changed" event
provided by the control.  On the plus side, you can attach a
property-change event handler to pretty much anything, so once you
know the trick it's possible to make everything work.  Yay WPF.
2019-06-20 15:10:35 -07:00
Andy McFadden
96a92f0335 Load/save app settings
This change pulls in the settings file code, which is mostly
unchanged except when it comes to saving and restoring the window
location and size.

The old system has been replaced with a PInvoke-based version that
calls the underlying Win32 window placement code.  This is more
likely to be correct when multiple displays are in use, and can
record the un-maximized size of a maximized window.  It leaves a
nasty XML string embedded in the config file, but it's not really
meant to be human-readable anyway.

The sub-window dividers all work completely differently from the way
they did in WinForms, and some of the behavior is a bit obscure
(like noticing when a splitter moves due to keyboard input, and
setting the position in a way that doesn't break the auto-sizing).
Yay WPF.

Still need to preserve column widths.
2019-06-19 18:09:55 -07:00
Andy McFadden
f32135e2c7 Set Owner for all modal dialogs
This turns out to be really important.  Otherwise the modal dialog
doesn't stay on top of the application's window stack, which can
make things awkward when ShowInTaskbar is set to false.  The easiest
way to ensure this is getting done is to make it part of the
constructor arguments.

The code now passes the parent window in explicitly.  WPF MessageBox
avoids this by calling UnsafeNativeMethods.GetActiveWindow(), but
that feels weird.  We could assume Application.Current.MainWindow
is the parent, but that seems like it could go quietly and horribly
wrong.
2019-06-16 16:55:40 -07:00
Andy McFadden
61ecb28d60 Add Edit Address
Pretty simple dialog, but it took a while to figure out the best
way to deal with input validation.  Works from the various menus as
well as double-clicking on .ORG and address column entries.

Also, moved some stuff around to places that made more sense.
2019-06-16 16:40:08 -07:00
Andy McFadden
d3230ef0d6 Add addr/label target highlight
When you select a line that references a label within the file, we
highlight the address and label fields of the target offset.
2019-06-16 09:29:54 -07:00
Andy McFadden
1a0a229b9b Wire up sub-window double-click handlers and list nav
Wired up the double-click handlers for References, Notes, and
Symbols.  These jump to the item at the offset that was double-
clicked.  Also hooked up the navigate forward/backward buttons
in the toolbar.

Except for the usual WPF gymnastics required to figure out what you
actually double-clicked on, this went smoothly.
2019-06-15 16:00:31 -07:00
Andy McFadden
0abc7a7587 Populate Notes panel
This was pretty easy to do with DataGrid, even with custom background
colors in some cells.  Score one for WPF.
2019-06-12 15:54:22 -07:00
Andy McFadden
9e525d1428 Populate symbol table, with filtering and sorting
The filtering uses the DataGrid View filtering mechanism.  The
built-in sorting only operates on a single column, and we really
want a secondary sort on label when the type is used as the key,
so we provide a custom sort method.
2019-06-12 15:14:21 -07:00