aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/app.d109
-rw-r--r--source/spots.d25
2 files changed, 37 insertions, 97 deletions
diff --git a/source/app.d b/source/app.d
index 52074b1..1d04fc9 100644
--- a/source/app.d
+++ b/source/app.d
@@ -78,12 +78,11 @@ void main()
file.writefln!"%s %s"(disp.y, disp.x);
file.writefln!"%d"(rocks);
overlay.save(file);
+ disp.print();
}
catch (Exception e)
{
- // TODO: log the error in a user-visible way
}
- disp.print();
break;
case 'l':
auto filename = stdscr.readquery("Load:");
@@ -114,81 +113,6 @@ void main()
}
}
-import std.range.interfaces : InputRange;
-
-class Reader : InputRange!char
-{
-
- private int _front;
- private bool _empty;
- // Might could be implemented with a larger getnstr
-
- this()
- {
- _front = getch();
- }
-
- char moveFront()
- in
- {
- assert(!_empty);
- }
- do
- {
- auto ret = front();
- popFront();
- return ret;
- }
-
- @property char front()
- in
- {
- assert(!_empty);
- }
- do
- {
- return cast(char) _front;
- }
-
- void popFront()
- in
- {
- assert(!_empty);
- }
- do
- {
- _front = getch();
- if (_front == -1)
- _empty = true;
- }
-
- @property bool empty()
- {
- return _empty;
- }
-
- int opApply(scope int delegate(char) run)
- {
- for (; !_empty; popFront())
- {
- if (run(front()))
- return 1;
- }
-
- return 0;
- }
-
- int opApply(scope int delegate(size_t, char) run)
- {
- for (size_t i = 0; !_empty; popFront(), i++)
- {
- if (run(i, front()))
- return 1;
- }
- return 0;
- }
-}
-
string readquery(WINDOW* stdscr, string query)
{
import std.range : replicate;
@@ -202,19 +126,32 @@ string readquery(WINDOW* stdscr, string query)
mvprintw(height, 0, toStringz(query ~ " ".replicate(width - query.length)));
move(height, cast(int) query.length + 1);
- echo();
scrollok(stdscr, false);
- auto build = appender!string;
+ auto build = appender!(char[]);
- auto reader = new Reader();
-
- while (!reader.empty && reader.front != '\r')
+ int p = cast(int) query.length + 1;
+ while (auto ch = getch())
{
- build ~= reader.front;
- reader.popFront;
+ if (ch == '\r' || ch == EOF)
+ break;
+ if (ch == '\b' || ch == KEY_BACKSPACE || ch == 127)
+ {
+ if (build[].length > 0)
+ {
+ p--;
+ mvaddch(height, p, ' ');
+ build.shrinkTo(build[].length - 1);
+ move(height, p);
+ }
+ }
+ else
+ {
+ build ~= cast(char) ch;
+ addch(ch);
+ p++;
+ }
}
- noecho();
scrollok(stdscr, true);
- return build.data;
+ return cast(string) build[];
}
diff --git a/source/spots.d b/source/spots.d
index f57ba8f..49b9c85 100644
--- a/source/spots.d
+++ b/source/spots.d
@@ -28,16 +28,17 @@ struct Spot
_contents = c;
}
+ import std.format : format, formattedRead;
+
string toString()
{
- import std.format : format;
- return format("'%c'", _contents);
+ return format!`'%c'`(_contents);
}
- void fromString(S)(S s) if (isSomeString!S)
+ void fromString(Range)(auto ref Range s)
{
- _contents = cast(char) s[1];
+ s.formattedRead!`'%c'`(_contents);
}
@property contents()
@@ -165,7 +166,7 @@ class OverlaySource : SpotSource
_base.save(f);
foreach (coord; _overlay.keys())
{
- f.writefln!"%s, %s: %s"(coord[0], coord[1], _overlay[coord]);
+ f.writefln!"%s %s: %s"(coord[0], coord[1], _overlay[coord]);
}
f.write(terminator);
}
@@ -173,21 +174,23 @@ class OverlaySource : SpotSource
void load(File f)
{
import std.conv : to;
- import std.algorithm.iteration;
+ import std.algorithm;
+ //_overlay = _overlay.init;
_base.load(f);
foreach (char[] line; f.lines)
{
if (line == terminator)
break;
- auto trim = line.filter!(a => a == ' ' || a == '\r' || a == '\n').array;
- auto parts = trim.splitter(':');
- auto ints = parts.moveFront.splitter(',').map!(to!BigInt);
+
+ auto ints = line.until(':').array.splitter(' ').map!(to!BigInt);
BigInt[2] coord;
- coord[0] = ints.moveFront;
+ coord[0] = ints.front;
+ ints.popFront;
coord[1] = ints.front;
+
auto s = new Spot();
- (*s).fromString(parts.front);
+ (*s).fromString(line.find(':').find('\''));
_overlay[coord] = *s;
}
}