diff options
Diffstat (limited to 'src/ui/sidebarwidget.c')
-rw-r--r-- | src/ui/sidebarwidget.c | 58 |
1 files changed, 56 insertions, 2 deletions
diff --git a/src/ui/sidebarwidget.c b/src/ui/sidebarwidget.c index fa550176..c5e7d05f 100644 --- a/src/ui/sidebarwidget.c +++ b/src/ui/sidebarwidget.c | |||
@@ -9,6 +9,7 @@ | |||
9 | #include "app.h" | 9 | #include "app.h" |
10 | 10 | ||
11 | #include <the_Foundation/array.h> | 11 | #include <the_Foundation/array.h> |
12 | #include <SDL_mouse.h> | ||
12 | 13 | ||
13 | iDeclareType(SidebarItem) | 14 | iDeclareType(SidebarItem) |
14 | 15 | ||
@@ -50,10 +51,16 @@ struct Impl_SidebarWidget { | |||
50 | iArray items; | 51 | iArray items; |
51 | size_t hoverItem; | 52 | size_t hoverItem; |
52 | iClick click; | 53 | iClick click; |
54 | iWidget *resizer; | ||
55 | SDL_Cursor *resizeCursor; | ||
53 | }; | 56 | }; |
54 | 57 | ||
55 | iDefineObjectConstruction(SidebarWidget) | 58 | iDefineObjectConstruction(SidebarWidget) |
56 | 59 | ||
60 | static iBool isResizing_SidebarWidget_(const iSidebarWidget *d) { | ||
61 | return (flags_Widget(d->resizer) & pressed_WidgetFlag) != 0; | ||
62 | } | ||
63 | |||
57 | static void clearItems_SidebarWidget_(iSidebarWidget *d) { | 64 | static void clearItems_SidebarWidget_(iSidebarWidget *d) { |
58 | iForEach(Array, i, &d->items) { | 65 | iForEach(Array, i, &d->items) { |
59 | deinit_SidebarItem(i.value); | 66 | deinit_SidebarItem(i.value); |
@@ -150,9 +157,19 @@ void init_SidebarWidget(iSidebarWidget *d) { | |||
150 | addChild_Widget(w, iClob(d->scroll = new_ScrollWidget())); | 157 | addChild_Widget(w, iClob(d->scroll = new_ScrollWidget())); |
151 | setThumb_ScrollWidget(d->scroll, 0, 0); | 158 | setThumb_ScrollWidget(d->scroll, 0, 0); |
152 | setMode_SidebarWidget(d, documentOutline_SidebarMode); | 159 | setMode_SidebarWidget(d, documentOutline_SidebarMode); |
160 | d->resizer = addChildFlags_Widget( | ||
161 | w, | ||
162 | iClob(new_Widget()), | ||
163 | hover_WidgetFlag | commandOnClick_WidgetFlag | fixedWidth_WidgetFlag | | ||
164 | resizeToParentHeight_WidgetFlag | moveToParentRightEdge_WidgetFlag); | ||
165 | setId_Widget(d->resizer, "sidebar.grab"); | ||
166 | d->resizer->rect.size.x = gap_UI; | ||
167 | setBackgroundColor_Widget(d->resizer, red_ColorId); | ||
168 | d->resizeCursor = SDL_CreateSystemCursor(SDL_SYSTEM_CURSOR_SIZEWE); | ||
153 | } | 169 | } |
154 | 170 | ||
155 | void deinit_SidebarWidget(iSidebarWidget *d) { | 171 | void deinit_SidebarWidget(iSidebarWidget *d) { |
172 | SDL_FreeCursor(d->resizeCursor); | ||
156 | clearItems_SidebarWidget_(d); | 173 | clearItems_SidebarWidget_(d); |
157 | deinit_Array(&d->items); | 174 | deinit_Array(&d->items); |
158 | } | 175 | } |
@@ -206,6 +223,37 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) | |||
206 | if (isResize_UserEvent(ev)) { | 223 | if (isResize_UserEvent(ev)) { |
207 | updateVisible_SidebarWidget_(d); | 224 | updateVisible_SidebarWidget_(d); |
208 | } | 225 | } |
226 | else if (isCommand_Widget(w, ev, "mouse.clicked")) { | ||
227 | const char *cmd = command_UserEvent(ev); | ||
228 | if (argLabel_Command(cmd, "button") == SDL_BUTTON_LEFT) { | ||
229 | if (arg_Command(cmd)) { | ||
230 | setFlags_Widget(d->resizer, pressed_WidgetFlag, iTrue); | ||
231 | setBackgroundColor_Widget(d->resizer, orange_ColorId); | ||
232 | setMouseGrab_Widget(d->resizer); | ||
233 | refresh_Widget(d->resizer); | ||
234 | } | ||
235 | else { | ||
236 | setFlags_Widget(d->resizer, pressed_WidgetFlag, iFalse); | ||
237 | setBackgroundColor_Widget(d->resizer, red_ColorId); | ||
238 | setMouseGrab_Widget(NULL); | ||
239 | refresh_Widget(d->resizer); | ||
240 | } | ||
241 | } | ||
242 | return iTrue; | ||
243 | } | ||
244 | else if (isCommand_Widget(w, ev, "mouse.moved")) { | ||
245 | const char *cmd = command_UserEvent(ev); | ||
246 | if (isResizing_SidebarWidget_(d)) { | ||
247 | const iInt2 local = localCoord_Widget(w, coord_Command(cmd)); | ||
248 | w->rect.size.x = local.x + d->resizer->rect.size.x / 2; | ||
249 | arrange_Widget(findWidget_App("doctabs")); | ||
250 | if (!isRefreshPending_App()) { | ||
251 | updateSize_DocumentWidget(document_App()); | ||
252 | refresh_Widget(w); | ||
253 | } | ||
254 | } | ||
255 | return iTrue; | ||
256 | } | ||
209 | else if (isCommand_Widget(w, ev, "scroll.moved")) { | 257 | else if (isCommand_Widget(w, ev, "scroll.moved")) { |
210 | d->scrollY = arg_Command(command_UserEvent(ev)); | 258 | d->scrollY = arg_Command(command_UserEvent(ev)); |
211 | d->hoverItem = iInvalidPos; | 259 | d->hoverItem = iInvalidPos; |
@@ -226,8 +274,14 @@ static iBool processEvent_SidebarWidget_(iSidebarWidget *d, const SDL_Event *ev) | |||
226 | if (ev->type == SDL_MOUSEMOTION) { | 274 | if (ev->type == SDL_MOUSEMOTION) { |
227 | const iInt2 mouse = init_I2(ev->motion.x, ev->motion.y); | 275 | const iInt2 mouse = init_I2(ev->motion.x, ev->motion.y); |
228 | size_t hover = iInvalidPos; | 276 | size_t hover = iInvalidPos; |
229 | if (contains_Widget(w, mouse)) { | 277 | if (contains_Widget(d->resizer, mouse)) { |
230 | hover = itemIndex_SidebarWidget_(d, mouse); | 278 | SDL_SetCursor(d->resizeCursor); |
279 | } | ||
280 | else { | ||
281 | SDL_SetCursor(NULL); | ||
282 | if (contains_Widget(w, mouse)) { | ||
283 | hover = itemIndex_SidebarWidget_(d, mouse); | ||
284 | } | ||
231 | } | 285 | } |
232 | if (hover != d->hoverItem) { | 286 | if (hover != d->hoverItem) { |
233 | d->hoverItem = hover; | 287 | d->hoverItem = hover; |