1
- using System ;
1
+ using parq . Display . Models ;
2
+ using System ;
2
3
using System . Collections . Generic ;
3
4
using System . Linq ;
4
5
5
6
namespace parq . Display . Views
6
7
{
8
+ /// <summary>
9
+ /// Displays to the Console window a navigatable (2D) data set
10
+ /// </summary>
7
11
public class ConsoleView
8
12
{
9
13
private const string verticalSeparator = "|" ;
10
14
private const string horizontalSeparator = "-" ;
11
15
private Stack < ConsoleSheet > unreadSheets ;
12
16
private Stack < ConsoleSheet > readSheets = new Stack < ConsoleSheet > ( ) ;
13
- private ConsoleSheet currentSheet ;
17
+ private Stack < ConsoleFold > unreadFolds ;
18
+ private Stack < ConsoleFold > readFolds = new Stack < ConsoleFold > ( ) ;
14
19
15
20
public void Draw ( ViewModel viewModel )
16
21
{
17
22
Console . Clear ( ) ;
18
23
var viewPort = new ViewPort ( ) ;
19
24
20
25
unreadSheets = GenerateSheets ( viewPort , viewModel . Columns ) ;
26
+ unreadFolds = GenerateFolds ( viewPort , viewModel . Rows ) ;
21
27
22
- currentSheet = unreadSheets . Pop ( ) ;
23
- DrawSheet ( viewModel , currentSheet ) ;
28
+ var currentSheet = unreadSheets . Pop ( ) ;
29
+ var currentFold = unreadFolds . Pop ( ) ;
30
+ DrawSheet ( viewModel , currentSheet , currentFold , viewPort ) ;
24
31
25
32
}
26
33
27
- private void DrawSheet ( ViewModel viewModel , ConsoleSheet currentSheet )
34
+ private Stack < ConsoleFold > GenerateFolds ( ViewPort viewPort , List < object [ ] > rows )
28
35
{
36
+ var foldLength = viewPort . Height - 7 ;
37
+
38
+ var folds = new Stack < ConsoleFold > ( ) ;
39
+ var firstFoldPoint = ( rows . Count > foldLength ) ? foldLength : rows . Count ;
40
+ var runningTotal = firstFoldPoint ;
41
+ var firstFold = rows . Take ( firstFoldPoint ) ;
42
+
43
+ folds . Push ( new ConsoleFold { Rows = firstFold , IndexStart = 0 , IndexEnd = firstFold . Count ( ) } ) ;
44
+
45
+ while ( runningTotal != rows . Count )
46
+ {
47
+ var nextFoldPoint = ( rows . Count > runningTotal + foldLength ) ? foldLength : rows . Count - runningTotal ;
48
+ var nextFold = rows . Skip ( runningTotal ) . Take ( nextFoldPoint ) ;
49
+ folds . Push ( new ConsoleFold { Rows = nextFold , IndexStart = runningTotal , IndexEnd = runningTotal + nextFold . Count ( ) } ) ;
50
+ runningTotal += nextFold . Count ( ) ;
51
+ }
52
+
53
+ var originalFoldCount = folds . Count ;
54
+ var unReadFolds = new Stack < ConsoleFold > ( ) ;
55
+ for ( int i = 0 ; i < originalFoldCount ; i ++ )
56
+ {
57
+ unReadFolds . Push ( folds . Pop ( ) ) ;
58
+ }
59
+ return unReadFolds ;
60
+ }
61
+
62
+ private void DrawSheet ( ViewModel viewModel , ConsoleSheet currentSheet , ConsoleFold currentFold , ViewPort viewPort )
63
+ {
64
+ Console . Clear ( ) ;
29
65
DrawLine ( currentSheet ) ;
30
66
WriteHeaderLine ( currentSheet ) ;
31
67
DrawLine ( currentSheet ) ;
32
- WriteValues ( viewModel , currentSheet ) ;
68
+ WriteValues ( viewModel , currentSheet , currentFold ) ;
33
69
DrawLine ( currentSheet ) ;
34
- WriteSummary ( viewModel , currentSheet ) ;
70
+ WriteSummary ( viewModel , currentSheet , currentFold ) ;
35
71
36
72
var input = AwaitInput ( ) ;
37
73
switch ( input )
38
74
{
39
75
case Input . NoOp :
40
- DrawSheet ( viewModel , currentSheet ) ;
76
+ DrawSheet ( viewModel , currentSheet , currentFold , viewPort ) ;
41
77
break ;
42
78
case Input . Quit :
43
79
break ;
44
- case Input . NextPage :
80
+ case Input . NextSheet :
45
81
if ( unreadSheets . Any ( ) )
46
82
{
47
83
readSheets . Push ( currentSheet ) ;
48
84
var nextPage = unreadSheets . Pop ( ) ;
49
- DrawSheet ( viewModel , nextPage ) ;
85
+ DrawSheet ( viewModel , nextPage , currentFold , viewPort ) ;
50
86
}
51
87
else
52
88
{
53
- DrawSheet ( viewModel , currentSheet ) ;
89
+ DrawSheet ( viewModel , currentSheet , currentFold , viewPort ) ;
54
90
}
55
91
break ;
56
- case Input . PrevPage :
92
+ case Input . PrevSheet :
57
93
if ( readSheets . Any ( ) )
58
94
{
59
95
unreadSheets . Push ( currentSheet ) ;
60
96
var lastPage = readSheets . Pop ( ) ;
61
- DrawSheet ( viewModel , lastPage ) ;
97
+ DrawSheet ( viewModel , lastPage , currentFold , viewPort ) ;
98
+ }
99
+ else
100
+ {
101
+ DrawSheet ( viewModel , currentSheet , currentFold , viewPort ) ;
102
+ }
103
+ break ;
104
+ case Input . NextFold :
105
+ if ( unreadFolds . Any ( ) )
106
+ {
107
+ readFolds . Push ( currentFold ) ;
108
+ var nextFold = unreadFolds . Pop ( ) ;
109
+ DrawSheet ( viewModel , currentSheet , nextFold , viewPort ) ;
110
+ }
111
+ else
112
+ {
113
+ DrawSheet ( viewModel , currentSheet , currentFold , viewPort ) ;
114
+ }
115
+ break ;
116
+ case Input . PrevFold :
117
+ if ( readFolds . Any ( ) )
118
+ {
119
+ unreadFolds . Push ( currentFold ) ;
120
+ var lastFold = readFolds . Pop ( ) ;
121
+ DrawSheet ( viewModel , currentSheet , lastFold , viewPort ) ;
62
122
}
63
123
else
64
124
{
65
- DrawSheet ( viewModel , currentSheet ) ;
125
+ DrawSheet ( viewModel , currentSheet , currentFold , viewPort ) ;
66
126
}
67
127
break ;
68
128
}
@@ -98,16 +158,24 @@ private Input AwaitInput()
98
158
var key = Console . ReadKey ( ) ;
99
159
if ( key . Key == ConsoleKey . RightArrow )
100
160
{
101
- return Input . NextPage ;
161
+ return Input . NextSheet ;
102
162
}
103
163
else if ( key . Key == ConsoleKey . LeftArrow )
104
164
{
105
- return Input . PrevPage ;
165
+ return Input . PrevSheet ;
106
166
}
107
167
else if ( key . Key == ConsoleKey . Enter )
108
168
{
109
169
return Input . Quit ;
110
170
}
171
+ else if ( key . Key == ConsoleKey . DownArrow )
172
+ {
173
+ return Input . NextFold ;
174
+ }
175
+ else if ( key . Key == ConsoleKey . UpArrow )
176
+ {
177
+ return Input . PrevFold ;
178
+ }
111
179
112
180
return Input . NoOp ;
113
181
}
@@ -136,10 +204,10 @@ private IEnumerable<ColumnDetails> FitColumns(ViewPort viewPort, IEnumerable<Col
136
204
return columns ;
137
205
}
138
206
139
- private void WriteSummary ( ViewModel viewModel , ConsoleSheet currentSheet )
207
+ private void WriteSummary ( ViewModel viewModel , ConsoleSheet currentSheet , ConsoleFold currentFold )
140
208
{
141
- Console . WriteLine ( "Showing {0} to {1} of {2} Columns. Press <- or -> to navigate ." , currentSheet . IndexStart , currentSheet . IndexEnd , viewModel . Columns . Count ( ) ) ;
142
- Console . WriteLine ( "{0} Rows Affected . Press ENTER to quit;" , viewModel . RowCount ) ;
209
+ Console . WriteLine ( "Showing {0} to {1} of {2} Columns. Use Arrow Keys to Navigate ." , currentSheet . IndexStart , currentSheet . IndexEnd , viewModel . Columns . Count ( ) ) ;
210
+ Console . WriteLine ( "Showing {0} to {1} of {2} Rows Total . Press ENTER to quit;" , currentFold . IndexStart , currentFold . IndexEnd , viewModel . RowCount ) ;
143
211
}
144
212
private void WriteHeaderLine ( ConsoleSheet columnDetails )
145
213
{
@@ -159,11 +227,11 @@ private void WriteHeaderLine(ConsoleSheet columnDetails)
159
227
Console . Write ( Environment . NewLine ) ;
160
228
}
161
229
162
- private void WriteValues ( ViewModel viewModel , ConsoleSheet columnsFitToScreen )
230
+ private void WriteValues ( ViewModel viewModel , ConsoleSheet columnsFitToScreen , ConsoleFold foldedRows )
163
231
{
164
- for ( int i = 0 ; i < viewModel . Rows . Count ; i ++ )
232
+ for ( int i = 0 ; i < foldedRows . Rows . Count ( ) ; i ++ )
165
233
{
166
- var row = viewModel . Rows [ i ] ;
234
+ var row = foldedRows . Rows . ElementAt ( i ) ;
167
235
Console . Write ( verticalSeparator ) ;
168
236
for ( int j = 0 ; j < row . Length ; j ++ )
169
237
{
0 commit comments