summaryrefslogtreecommitdiff
path: root/src/ui
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2020-08-11 19:39:20 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2020-08-11 19:39:20 +0300
commit647e0be85a1b9b76e338452c5b531995ac972c57 (patch)
treee4527e60039d426097146d823f47036e4af535fa /src/ui
parentdea66025b91832df59c435afd9b72966ef1e61b1 (diff)
SidebarWidget: Scrolling
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/documentwidget.c3
-rw-r--r--src/ui/sidebarwidget.c46
2 files changed, 41 insertions, 8 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index de2abf0d..0ba1e6b0 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -111,6 +111,7 @@ void init_DocumentWidget(iDocumentWidget *d) {
111 iWidget *w = as_Widget(d); 111 iWidget *w = as_Widget(d);
112 init_Widget(w); 112 init_Widget(w);
113 setId_Widget(w, "document000"); 113 setId_Widget(w, "document000");
114 setFlags_Widget(w, hover_WidgetFlag, iTrue);
114 iZap(d->certExpiry); 115 iZap(d->certExpiry);
115 d->history = new_History(); 116 d->history = new_History();
116 d->state = blank_DocumentState; 117 d->state = blank_DocumentState;
@@ -1040,7 +1041,7 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e
1040#endif 1041#endif
1041 } 1042 }
1042 } 1043 }
1043 else if (ev->type == SDL_MOUSEWHEEL) { 1044 else if (ev->type == SDL_MOUSEWHEEL && isHover_Widget(w)) {
1044#if defined (iPlatformApple) 1045#if defined (iPlatformApple)
1045 /* Momentum scrolling. */ 1046 /* Momentum scrolling. */
1046 scroll_DocumentWidget_(d, -ev->wheel.y * get_Window()->pixelRatio); 1047 scroll_DocumentWidget_(d, -ev->wheel.y * get_Window()->pixelRatio);
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c
index 46b36434..872d3f4a 100644
--- a/src/ui/sidebarwidget.c
+++ b/src/ui/sidebarwidget.c
@@ -137,9 +137,20 @@ static iRect contentBounds_SidebarWidget_(const iSidebarWidget *d) {
137 return bounds; 137 return bounds;
138} 138}
139 139
140static int visCount_SidebarWidget_(const iSidebarWidget *d) {
141 return iMin(height_Rect(bounds_Widget(constAs_Widget(d))) / d->itemHeight,
142 (int) size_Array(&d->items));
143}
144
145static iRanges visRange_SidebarWidget_(const iSidebarWidget *d) {
146 iRanges vis = { d->scrollY / d->itemHeight, 0 };
147 vis.end = iMin(size_Array(&d->items), vis.start + visCount_SidebarWidget_(d));
148 return vis;
149}
150
140static size_t itemIndex_SidebarWidget_(const iSidebarWidget *d, iInt2 pos) { 151static size_t itemIndex_SidebarWidget_(const iSidebarWidget *d, iInt2 pos) {
141 const iRect bounds = contentBounds_SidebarWidget_(d); 152 const iRect bounds = contentBounds_SidebarWidget_(d);
142 pos.y -= top_Rect(bounds); 153 pos.y -= top_Rect(bounds) - d->scrollY;
143 if (pos.y < 0) return iInvalidPos; 154 if (pos.y < 0) return iInvalidPos;
144 size_t index = pos.y / d->itemHeight; 155 size_t index = pos.y / d->itemHeight;
145 if (index >= size_Array(&d->items)) return iInvalidPos; 156 if (index >= size_Array(&d->items)) return iInvalidPos;
@@ -158,6 +169,18 @@ static void itemClicked_SidebarWidget_(iSidebarWidget *d, size_t index) {
158 } 169 }
159} 170}
160 171
172static void scroll_SidebarWidget_(iSidebarWidget *d, int offset) {
173 d->scrollY += offset;
174 if (d->scrollY < 0) {
175 d->scrollY = 0;
176 }
177 const int scrollMax = iMax(0,
178 (int) size_Array(&d->items) * d->itemHeight -
179 height_Rect(contentBounds_SidebarWidget_(d)));
180 d->scrollY = iMin(d->scrollY, scrollMax);
181 refresh_Widget(as_Widget(d));
182}
183
161static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) { 184static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) {
162 iWidget *w = as_Widget(d); 185 iWidget *w = as_Widget(d);
163 /* Handle commands. */ 186 /* Handle commands. */
@@ -177,13 +200,21 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
177 size_t hover = iInvalidPos; 200 size_t hover = iInvalidPos;
178 if (contains_Widget(w, mouse)) { 201 if (contains_Widget(w, mouse)) {
179 hover = itemIndex_SidebarWidget_(d, mouse); 202 hover = itemIndex_SidebarWidget_(d, mouse);
180
181 } 203 }
182 if (hover != d->hoverItem) { 204 if (hover != d->hoverItem) {
183 d->hoverItem = hover; 205 d->hoverItem = hover;
184 refresh_Widget(w); 206 refresh_Widget(w);
185 } 207 }
186 } 208 }
209 if (ev->type == SDL_MOUSEWHEEL && isHover_Widget(w)) {
210#if defined (iPlatformApple)
211 /* Momentum scrolling. */
212 scroll_SidebarWidget_(d, -ev->wheel.y * get_Window()->pixelRatio);
213#endif
214 d->hoverItem = iInvalidPos;
215 refresh_Widget(w);
216 return iTrue;
217 }
187 switch (processEvent_Click(&d->click, ev)) { 218 switch (processEvent_Click(&d->click, ev)) {
188 case started_ClickResult: 219 case started_ClickResult:
189 refresh_Widget(w); 220 refresh_Widget(w);
@@ -191,7 +222,6 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev)
191 case finished_ClickResult: 222 case finished_ClickResult:
192 if (contains_Rect(contentBounds_SidebarWidget_(d), pos_Click(&d->click)) && 223 if (contains_Rect(contentBounds_SidebarWidget_(d), pos_Click(&d->click)) &&
193 d->hoverItem != iInvalidSize) { 224 d->hoverItem != iInvalidSize) {
194 //printf("click:%zu\n", d->hoverItem); fflush(stdout);
195 itemClicked_SidebarWidget_(d, d->hoverItem); 225 itemClicked_SidebarWidget_(d, d->hoverItem);
196 } 226 }
197 refresh_Widget(w); 227 refresh_Widget(w);
@@ -209,12 +239,14 @@ static void draw_SidebarWidget_(const iSidebarWidget *d) {
209 iPaint p; 239 iPaint p;
210 init_Paint(&p); 240 init_Paint(&p);
211 /* Draw the items. */ { 241 /* Draw the items. */ {
212 iInt2 pos = topLeft_Rect(bounds);
213 const int font = default_FontId; 242 const int font = default_FontId;
214 iConstForEach(Array, i, &d->items) { 243// /iConstForEach(Array, i, &d->items) {
215 const iSidebarItem *item = i.value; 244 const iRanges visRange = visRange_SidebarWidget_(d);
245 iInt2 pos = addY_I2(topLeft_Rect(bounds), -(d->scrollY % d->itemHeight));
246 for (size_t i = visRange.start; i < visRange.end; i++) {
247 const iSidebarItem *item = constAt_Array(&d->items, i);
216 const iRect itemRect = { pos, init_I2(width_Rect(bounds), d->itemHeight) }; 248 const iRect itemRect = { pos, init_I2(width_Rect(bounds), d->itemHeight) };
217 const iBool isHover = (d->hoverItem == index_ArrayConstIterator(&i)); 249 const iBool isHover = (d->hoverItem == i);
218 if (isHover) { 250 if (isHover) {
219 fillRect_Paint(&p, itemRect, isPressing ? orange_ColorId : teal_ColorId); 251 fillRect_Paint(&p, itemRect, isPressing ? orange_ColorId : teal_ColorId);
220 } 252 }