X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=src%2Fclient%2Fmain.c;h=1f38f7ed9ebd13b972eaf6520794ece034fb7426;hb=99cf95b138082d1c02705682ad0dfd8b67a27ac4;hp=5f5f1c85a2e33ce099e7e86a9f2b1b8bf4763e64;hpb=a7c0580c1592fe19ef18ce5b86b0088c835be030;p=tpg%2Fopendispense2.git diff --git a/src/client/main.c b/src/client/main.c index 5f5f1c8..1f38f7e 100644 --- a/src/client/main.c +++ b/src/client/main.c @@ -32,6 +32,7 @@ typedef struct sItem { // === PROTOTYPES === int ShowNCursesUI(void); +void PrintAlign(int Row, int Col, int Width, const char *Left, char Pad1, const char *Mid, char Pad2, const char *Right, ...); int sendf(int Socket, const char *Format, ...); int OpenConnection(const char *Host, int Port); @@ -231,6 +232,25 @@ int main(int argc, char *argv[]) return 0; } +void ShowItemAt(int Row, int Col, int Width, int Index) +{ + int _x, _y, times; + + move( Row, Col ); + + if( Index < 0 || Index >= giNumItems ) { + printw("%02i OOR", Index); + return ; + } + printw("%02i %s", Index, gaItems[Index].Desc); + + getyx(stdscr, _y, _x); + // Assumes max 4 digit prices + times = Width - 4 - (_x - Col); // TODO: Better handling for large prices + while(times--) addch(' '); + printw("%4i", gaItems[Index].Price); +} + /** */ int ShowNCursesUI(void) @@ -241,7 +261,6 @@ int ShowNCursesUI(void) const int displayMinWidth = 34; const int displayMinItems = 8; char *titleString = "Dispense"; - int titleStringLen = strlen(titleString); int itemCount = displayMinItems; int itemBase = 0; @@ -258,21 +277,11 @@ int ShowNCursesUI(void) for( ;; ) { // Header - move( yBase, xBase ); - addch('/'); - times = width/2 - titleStringLen/2 - 2; - while(times --) addch('-'); - addch(' '); - addstr(titleString); - addch(' '); - times = width/2 - titleStringLen/2 - 2; - while(times --) addch('-'); - addch('\\'); + PrintAlign(yBase, xBase, width, "/", '-', titleString, '-', "\\"); // Items for( i = 0; i < itemCount; i ++ ) { - int _x, _y; move( yBase + 1 + i, xBase ); addch('|'); addch(' '); @@ -290,16 +299,8 @@ int ShowNCursesUI(void) } // Show an item else { - if( itemBase + i < 0 || itemBase + i >= giNumItems ) { - printw("%02i %i OOR", itemBase + i, i); - continue ; - } - printw("%02i %s", itemBase + i, gaItems[itemBase + i].Desc); - - getyx(stdscr, _y, _x); - times = width - 6 - (_x - xBase); // TODO: Better handling for large prices - while(times--) addch(' '); - printw("%4i ", gaItems[itemBase + i].Price); + ShowItemAt( yBase + 1 + i, xBase + 2, width - 4, itemBase + i); + addch(' '); } // Scrollbar (if needed) @@ -326,30 +327,9 @@ int ShowNCursesUI(void) } // Footer - move( yBase + 1 + itemCount, xBase ); - addch('\\'); - times = width/2 - titleStringLen/2 - 2; - while(times --) addch('-'); - addch(' '); - addstr(titleString); - addch(' '); - times = width/2 - titleStringLen/2 - 2; - while(times --) addch('-'); - addch('/'); - - move( yBase + 1 + itemCount + 1, xBase ); - { - int count = itemCount-2; - int ofs = itemBase; - if( itemBase == 0 ) count ++; - else ofs ++; - if( itemBase == giNumItems-itemCount) { - count ++; - ofs ++; - } - printw("%i - %i / %i items", itemBase, itemBase+count, giNumItems); - } + PrintAlign(yBase+height-2, xBase, width, "\\", '-', "", '-', "/"); + // Get input ch = getch(); if( ch == '\x1B' ) { @@ -385,6 +365,55 @@ int ShowNCursesUI(void) return -1; } +void PrintAlign(int Row, int Col, int Width, const char *Left, char Pad1, const char *Mid, char Pad2, const char *Right, ...) +{ + int lLen, mLen, rLen; + int times; + + va_list args; + + // Get the length of the strings + va_start(args, Right); + lLen = vsnprintf(NULL, 0, Left, args); + mLen = vsnprintf(NULL, 0, Mid, args); + rLen = vsnprintf(NULL, 0, Right, args); + va_end(args); + + // Sanity check + if( lLen + mLen/2 > Width/2 || mLen/2 + rLen > Width/2 ) { + return ; // TODO: What to do? + } + + move(Row, Col); + + // Render strings + va_start(args, Right); + // - Left + { + char tmp[lLen+1]; + vsnprintf(tmp, lLen+1, Left, args); + addstr(tmp); + } + // - Left padding + times = Width/2 - mLen/2 - lLen; + while(times--) addch(Pad1); + // - Middle + { + char tmp[mLen+1]; + vsnprintf(tmp, mLen+1, Mid, args); + addstr(tmp); + } + // - Right Padding + times = Width/2 - mLen/2 - rLen; + while(times--) addch(Pad2); + // - Right + { + char tmp[rLen+1]; + vsnprintf(tmp, rLen+1, Right, args); + addstr(tmp); + } +} + // === HELPERS === int sendf(int Socket, const char *Format, ...) {