commit 8487a4512cfda6a5f07592ae6bc7b03d8d763fa4
parent 06b7e3e196d0908c25f762ccbaceec2a2a3edb27
Author: William Casarin <jb55@jb55.com>
Date: Thu, 11 Oct 2018 17:26:49 -0700
expandable selections
Diffstat:
M | viscal.c | | | 111 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------ |
1 file changed, 77 insertions(+), 34 deletions(-)
diff --git a/viscal.c b/viscal.c
@@ -12,6 +12,8 @@
#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array)[0]))
+#define sgn(x) (((x) > 0) - ((x) < 0))
+
#define clamp(val, low, high) (val < low ? low : (val > high ? high : val))
#define max(a,b) \
@@ -49,7 +51,7 @@ enum cal_flags {
CAL_MDOWN = 1 << 0
, CAL_DRAGGING = 1 << 1
, CAL_SPLIT = 1 << 2
- , CAL_EDITING = 1 << 3
+ , CAL_CHANGING = 1 << 3
, CAL_INSERTING = 1 << 4
};
@@ -100,6 +102,7 @@ struct cal {
// TODO: make multiple target selection
struct event *target;
int timeblock_size;
+ int timeblock_step;
int refresh_events;
int x, y, mx, my;
int gutter_height;
@@ -150,6 +153,7 @@ calendar_create(struct cal *cal) {
cal->target = NULL;
cal->chord = 0;
cal->gutter_height = 40;
+ cal->timeblock_step = 15;
cal->timeblock_size = 30;
cal->ncalendars = 0;
cal->nevents = 0;
@@ -314,7 +318,7 @@ static void edit_mode(struct cal *cal)
if (!event)
return;
- cal->flags |= CAL_EDITING;
+ cal->flags |= CAL_CHANGING;
const char *summary =
icalcomponent_get_summary(event->vevent);
@@ -608,25 +612,6 @@ closest_timeblock(struct cal *cal, int y) {
-static void
-calendar_view_clicked(struct cal *cal, int mx, int my) {
- time_t closest;
- /* int y; */
- char buf[32];
-
- closest = closest_timeblock(cal, my);
-
-
- format_locale_timet(buf, sizeof(buf), closest);
- printf("(%d,%d) clicked @%s\n", mx, my, buf);
- create_event(cal, closest, closest + cal->timeblock_size * 60,
- calendar_def_cal(cal));
- // TODO: configurable default duration
- /* icalcomponent_set_duration(vevent, duration); */
-
- /* y = calendar_time_to_loc(cal, closest) * cal->height; */
-}
-
static int
event_hit (struct event *ev, double mx, double my) {
return
@@ -684,8 +669,13 @@ static void move_now(struct cal *cal)
closest_timeblock_for_timet(now, cal->timeblock_size);
}
+static void insert_event(struct cal *cal, time_t st, time_t et, struct ical *ical)
+{
+ cal->flags |= CAL_INSERTING;
+ create_event(cal, st, et, ical->calendar);
+}
-static void insert_event(struct cal *cal)
+static void insert_event_cmd(struct cal *cal)
{
// we should eventually always have a calendar
// at least a temporary one
@@ -695,11 +685,24 @@ static void insert_event(struct cal *cal)
time_t st = cal->current;
time_t et = cal->current + cal->timeblock_size * 60;
- create_event(cal, st, et, current_calendar(cal)->calendar);
+ insert_event(cal, st, et, current_calendar(cal));
+}
- cal->flags |= CAL_INSERTING;
+
+static void
+calendar_view_clicked(struct cal *cal, int mx, int my) {
+ time_t closest;
+ /* int y; */
+ char buf[32];
+
+ closest = closest_timeblock(cal, my);
+
+ format_locale_timet(buf, sizeof(buf), closest);
+ printf("DEBUG (%d,%d) clicked @%s\n", mx, my, buf);
+ insert_event_cmd(cal);
}
+
static int query_span(struct cal *cal, int index_hint, time_t start, time_t end,
time_t min_start, time_t max_end)
{
@@ -797,6 +800,38 @@ static void center_view(struct cal *cal)
cal->scroll = 0;
}
+static void expand_selection_relative(struct cal *cal, int sign)
+{
+ int *step = &cal->timeblock_step;
+
+ printf("step %d\n", *step);
+
+ if (sign < 0 && cal->timeblock_size <= 15)
+ *step = 5;
+ else if (sign > 0 && cal->timeblock_size >= 15)
+ *step = 15;
+
+ int amount = *step * sign;
+
+ if (cal->timeblock_size + amount <= 0)
+ return;
+
+ cal->timeblock_size += amount;
+
+ printf("timeblock_size %d\n", cal->timeblock_size);
+}
+
+static void expand_selection(struct cal *cal)
+{
+ expand_selection_relative(cal, 1);
+}
+
+static void shrink_selection(struct cal *cal)
+{
+ expand_selection_relative(cal, -1);
+}
+
+
static void select_down(struct cal *cal)
{
cal->selected_event_ind =
@@ -895,9 +930,7 @@ static void open_below(struct cal *cal)
set_current_calendar(cal, ev->ical);
- create_event(cal, et, push_to, ev->ical->calendar);
-
- cal->flags |= CAL_INSERTING;
+ insert_event(cal, et, push_to, ev->ical);
}
static void finish_editing(struct cal *cal)
@@ -914,7 +947,7 @@ static void finish_editing(struct cal *cal)
icalcomponent_set_summary(event->vevent, g_editbuf);
// leave edit mode
- cal->flags &= ~CAL_EDITING;
+ cal->flags &= ~CAL_CHANGING;
}
static void append_str_edit_buffer(const char *src)
@@ -955,7 +988,9 @@ static void pop_edit_buffer(int amount)
static void delete_event(struct event *event)
{
- icalcomponent_remove_component(event->ical, event->vevent);
+ icalcomponent_remove_component(event->ical->calendar, event->vevent);
+
+
}
static void cancel_editing(struct cal *cal)
@@ -971,7 +1006,7 @@ static void cancel_editing(struct cal *cal)
delete_event(event);
}
- cal->flags &= ~(CAL_EDITING | CAL_INSERTING);
+ cal->flags &= ~(CAL_CHANGING | CAL_INSERTING);
}
static void pop_word_edit_buffer()
@@ -1061,7 +1096,7 @@ static gboolean on_keypress (GtkWidget *widget, GdkEvent *event, gpointer user_
switch (event->type) {
case GDK_KEY_PRESS:
- if (cal->flags & CAL_EDITING) {
+ if (cal->flags & CAL_CHANGING) {
state_changed = on_edit_keypress(cal, &event->key);
debug_edit_buffer(&event->key);
goto check_state;
@@ -1105,7 +1140,7 @@ static gboolean on_keypress (GtkWidget *widget, GdkEvent *event, gpointer user_
cal->scroll += scroll_amt;
break;
- case 'e':
+ case 'c':
edit_mode(cal);
break;
@@ -1135,8 +1170,16 @@ static gboolean on_keypress (GtkWidget *widget, GdkEvent *event, gpointer user_
cal->chord = 'z';
break;
+ case 'v':
+ expand_selection(cal);
+ break;
+
+ case 'V':
+ shrink_selection(cal);
+ break;
+
case 'i':
- insert_event(cal);
+ insert_event_cmd(cal);
break;
case 'o':
@@ -1520,7 +1563,7 @@ draw_event (cairo_t *cr, struct cal *cal, struct event *ev, struct event *sel) {
int isdate = dtstart.is_date;
int is_selected = sel == ev;
- int is_editing = is_selected && (cal->flags & CAL_EDITING);
+ int is_editing = is_selected && (cal->flags & CAL_CHANGING);
time_t st, et;
vevent_span_timet(ev->vevent, &st, &et);