summaryrefslogtreecommitdiff
path: root/src/ui/sidebarwidget.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/sidebarwidget.c')
-rw-r--r--src/ui/sidebarwidget.c58
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
13iDeclareType(SidebarItem) 14iDeclareType(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
55iDefineObjectConstruction(SidebarWidget) 58iDefineObjectConstruction(SidebarWidget)
56 59
60static iBool isResizing_SidebarWidget_(const iSidebarWidget *d) {
61 return (flags_Widget(d->resizer) & pressed_WidgetFlag) != 0;
62}
63
57static void clearItems_SidebarWidget_(iSidebarWidget *d) { 64static 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
155void deinit_SidebarWidget(iSidebarWidget *d) { 171void 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;