Yay! Runestone now works with... *Checks notes*... UIKit?? 🤨
In order to prepare for AppKit support, I had to rip the internals of Runestone apart and put it together again. For the first time in 36 hours, Runestone now works with UIKit again.
So I now have an NSWindow with an NSView that receives keystrokes. That's like step 0 in building a text editor, right?
There's such a long way to go still before Runestone is rewritten in AppKit. I hope I'll eventually turn a corner where all my work from UIKit can be reused and I ✨magically✨ have an AppKit implementation.
The AppKit version of Runestone now supports scrolling the content.
This involves a bit more than just wrapping everything in an NSScrollView because Runestone only renders the lines within the viewport.
Baby steps, y'all.
I need to implement all moving within lines myself 😑
In the screenshot I'm logging the selectors that I don't handle but that AppKit expects me to handle. This is something we get (almost) for free in UIKit. Honestly, I really don't want to write this logic.
Got navigation with the arrow keys working in Runestone for AppKit.
I figured out how to reuse some of the code from the UIKit implementation so this turned out to be much easier than anticipated.
Next up is adding support for jumping between words with Option+Left/Right arrow keys.
Baby steps, y'all.
While working on moving between words in Runestone for AppKit I found that the UIKit version had an incorrect behavior when moving between words followed by an emoji. The caret would always jump all the way to the end of the document which isn't correct, obviously. Fortunately, that was easy to fix and the fix works in both UIKit and AppKit.
And yes, it is supposed to jump all the way from the word "emoji" to the word "cool". That's how TextEdit does it too. Baby steps, y'all.
And now Runestone for AppKit supports moving to the line and document boundaries as well as clicking with the mouse to move to the closest location.
Maybe the next step is to support text selection. Or something more fun like line numbers.
Baby steps, y'all.
Line numbers and highlighting the selected line now works in Runestone for AppKit.
This one was a bit tricky because the view hierarchy is different between AppKit and UIKit and there's some important layering going on here to make it look the way I want it to.
On the other hand, disabling line wrapping worked without any changes 😃
Baby steps, y'all.
Taking a break from this thread tonight*. I did a few minor things that aren’t worth showing off but I’ll prioritize playing with the Quest 2 and watching Slow Horses for the rest of the evening. I need a short break 🤗
* Since I’m posting this I guess I’m not really taking a break.
Just tested syntax highlighting in Runestone for AppKit for the first time. Was happy to discover that it just works 😃
Baby steps, y'all.
Mostly got text selection, copy, paste, and cut working in Runestone for AppKit today 😃
There are still a couple of bugs in the text selection that needs to be fixed but it's getting there.
Baby steps, y'all.
Still polishing the text selection in Runestone for AppKit. Getting all keyboard shortcuts working as expected is extremely tricky but I'm getting closer. However, I've just got text selection working with the mouse so that's something 😄
Baby steps, y'all.
In case you would like to start playing around with Runestone for AppKit, you can do so already now. It’s available in the GitHub repository: https://github.com/simonbs/Runestone/tree/mac
I’m still working on this, so bugs should be expected. Don’t waste too much time reporting issues. At this point I likely know they’re there but haven’t gotten around to fixing them yet 😊
And in case you are using Runestone in your project, remember that I have GitHub sponsors setup 🫶 https://github.com/sponsors/simonbs
Got double and triple clicking to select words and lines working in Runestone for AppKit 😃
Notice that it's even possible to double click an opening or closing bracket to select everything within the brackets 🤓
Baby steps, y'all.
Word selection was a prerequisite to support right-clicking to cut, copy, and paste and with word selection in place, it was trivial to the right-click menu 😃
Baby steps, y'all.
And now Runestone for AppKit supports undo and redo too 😃
Text selection, the right-click menu, and undo/redo are things I have missed while working on other features, so it is great to finally have those in place.
Baby steps, y'all.
Hoping to fix this difference between Runestone and UITextView as part of bringing Runestone to the Mac.
TextKit, and as a result UITextView, will remove leading spaces one line fragments when wrapping lines. This ensures that line fragments align vertically.
It's going to be tricky though 🤔
This turned out to be much easier than I anticipated! 😃
Runestone will now remove leading whitespace in line fragments to match the text layout of UITextView and NSTextView much closer.
This difference has been bothering me since the launch of Runestone so it feels great to finally have it addressed.
Here are the changes for anyone interested: https://github.com/simonbs/Runestone/pull/272
The changes in this PR hides the leading whitespace in line fragments to align with TextKit, i.e. UITextView and NSTextView. See the screenshot below for a comparison. The new caretLocation(forLine...
Fixed a bug in Runestone for AppKit where it would reapply the syntax highlighting every time the window was resized, as such, causing the text to "blink”. 😃
Baby steps, y’all.