In my previous blog post, I had begun working on a text box, and I had discussed a lot of issues. I used the text box myself and ended up hating it. So I started from scratch.
Again, it wasn’t easy and I had to go through multiple iterations.
Google. Stackoverflow? Someone? Help! Ooh a random forum.
Something similar happened.
For making a dynamic multi line text box, I stored a number which describes the number of current lines. If this number is exceeded by
(length of the text) / (number of characters in a line)
I simply add a newline character to the text variable and increase the current number of lines.
For hiding overflows, I kept a variable for archive text and dynamically updated it.
This was complicated, the code couldn’t be clean with this method. Debugging corner cases would have been difficult. So, Cmd+A, Delete.
While I stuck to the same OS, I had this idea of using a window.
An intermediate text looks like (the |’s are the window boundaries. The input field size is 1x5)
When a character is added
When a character is removed
When a character is further added
Adding one more
Yep, the window moves. Cool, right? So now the visibility of the text is controlled by this so called window. The caret plays nicely into this window. I simply use a caret position as 0 initially and keep adding or removing one as I add or remove characters. The 0 is always the left window position and the caret moves relative to it. Similarly change the caret position when left/right keys are pressed.
Say this is now the intermediate text
this is som|e text|
My caret is currently before e (the 0 for the window) and I press the left key. Here’s what happens.
this is so|me tex|t
Similarly, I shift the window right when required.
Next, I wrote down all the possible cases (corner cases at the boundaries, for example) and coded them all up.
I thought my work was done, until — bugs!
And I proceeded to rewrite everything once again.
The method didn’t change much from above, except that the caret position was now absolute - the 0 is the 0 of the text always and the window moves relatively.
I grouped similar code together into functions and ended up with a clean (and hopefully bug free) implementation of a text box. I’ll write an independent blog post on it soon.
Here’s what it looks like currently:
A better text box.
Building a UI can be tougher than it sounds. When we use something like HTML and simply include a text box using a simple tag, we never think what went behind its making. The method I currently use seems efficient (every operation is O(1)), but I am sure there must be several implementations (maybe even better and cleaner) out there. I shall incorporate a better method if I find any.
Next, I’ll get started on a slider element. I don’t know how to do it right now, so this week would probably be spent on exploring ways and means to do it.