ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/deliantra/dclient/src/frontend/client/widgets/inventory_widget.cpp
Revision: 1.3
Committed: Mon Oct 18 14:11:49 2010 UTC (16 years ago) by sf-pippijn
Branch: MAIN
Changes since 1.2: +7 -1 lines
Log Message:
check and log but do not die when ncurses stuff fails

File Contents

# User Rev Content
1 sf-pippijn 1.1 #include "dclient/widgets/inventory.h"
2     #include "dclient/render_glyph.h"
3    
4     #include "deliantra/data/constants.h"
5     #include "deliantra/data/glyph.h"
6     #include "deliantra/data/item.h"
7 sf-pippijn 1.2 #include "deliantra/data/inventory.h"
8 sf-pippijn 1.1
9     #include "adt/slice.h"
10    
11     #include <ndk++/pen.hh>
12    
13 sf-pippijn 1.3 #include <ncurses/assert.hh>
14    
15 sf-pippijn 1.1 #include <algorithm>
16     #include <cassert>
17     #include <cstring>
18    
19     static char const indices[] = " 123456789abcdefghijklmnopqrstuvwxyz";
20     static __attribute__ ((__const__)) int maxidx () { return sizeof indices - 2; }
21    
22     inventory_widget::inventory_widget (ndk::panel *parent)
23     : frame ("inventory", parent)
24     , inv (nullptr)
25     , at (0)
26     {
27     events ()->on_keyboard (slot (&inventory_widget::at_keyboard, this));
28     }
29    
30     int __attribute__ ((__pure__))
31     inventory_widget::maxinv () const
32     {
33     return std::min (height () - 2, maxidx ());
34     }
35    
36     void
37 sf-pippijn 1.2 inventory_widget::update (data::inventory const &inv, std::string const &title)
38 sf-pippijn 1.1 {
39 sf-pippijn 1.2 this->inv = &inv;
40 sf-pippijn 1.1 set_title (title);
41    
42 sf-pippijn 1.2 int const inv_size = this->inv->size ();
43 sf-pippijn 1.1 if (at > inv_size - 2)
44     at = std::max (inv_size - 2, 0);
45 sf-pippijn 1.2
46     visualize ();
47 sf-pippijn 1.1 }
48    
49     void
50     inventory_widget::draw ()
51     {
52     frame::draw ();
53    
54     if (!inv || inv->empty ())
55     return;
56    
57     ndk::pen pen (*this);
58    
59     int i = 0;
60 sf-pippijn 1.2 foreach (data::item const &item, slice (*inv, at))
61 sf-pippijn 1.1 {
62     ++i;
63 sf-pippijn 1.3 return_unless (pen.move (1, i));
64 sf-pippijn 1.1
65     // previous page
66     if (at > 0 && i == 1)
67     {
68     pen.write ("%c: more…", indices[i]);
69     continue;
70     }
71    
72     // next page
73     if (i >= maxinv ())
74     {
75     pen.write ("%c: more…", indices[i]);
76     break;
77     }
78    
79     pen.write ("%c: [", indices[i]);
80     write (pen, data::glyphs[item.face]);
81     pen.write ("] ");
82    
83     if (item.nrof < 2)
84     pen.write (item.singular);
85     else
86     pen.write ("%d %s", item.nrof, item.plural.c_str ());
87    
88     if (item.flags & F_OPEN) pen.write (" (open)");
89     if (item.flags & F_APPLIED) pen.write (" (applied)");
90     if (item.flags & F_UNPAID) pen.write (" (unpaid)");
91     if (item.flags & F_MAGIC) pen.write (" (magic)");
92     if (item.flags & F_CURSED) pen.write (" (cursed)");
93     if (item.flags & F_DAMNED) pen.write (" (damned)");
94     if (item.flags & F_LOCKED) pen.write (" *");
95     }
96     }
97    
98     ndk::event::result
99     inventory_widget::at_keyboard (ndk::keyboard const &ev)
100     {
101     if (!inv)
102     return ndk::event::ignored;
103    
104     int const inv_size = inv->size ();
105    
106     switch (ev.code ())
107     {
108     case ndk::key::up:
109     if (at > 0)
110     --at;
111 sf-pippijn 1.3 else
112     return ndk::event::ignored;
113 sf-pippijn 1.1 break;
114    
115     case ndk::key::down:
116     if (at < inv_size - 2)
117     ++at;
118 sf-pippijn 1.3 else
119     return ndk::event::ignored;
120 sf-pippijn 1.1 break;
121    
122     case ndk::key::pg_up:
123     up: at -= std::min (maxinv () - 2, int (at));
124     break;
125    
126     case ndk::key::pg_dn:
127     down: at += std::min (maxinv () - 2, inv_size - at - 2);
128     break;
129    
130     default:
131     if (char const *const iptr = std::strchr (indices, int (ev.code ())))
132     {
133     int const index = iptr - indices;
134     if (index > maxinv () || at + index > inv_size)
135     return ndk::event::ignored;
136    
137     if (index == 1)
138     goto up;
139    
140     if (index == maxinv ())
141     goto down;
142     }
143     return ndk::event::ignored;
144     }
145    
146     draw ();
147    
148     return ndk::event::accepted;
149     }