diff options
-rw-r--r-- | src/ui/documentwidget.c | 3 | ||||
-rw-r--r-- | src/ui/sidebarwidget.c | 46 |
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 | ||
140 | static 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 | |||
145 | static 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 | |||
140 | static size_t itemIndex_SidebarWidget_(const iSidebarWidget *d, iInt2 pos) { | 151 | static 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 | ||
172 | static 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 | |||
161 | static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) { | 184 | static 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 | } |