[evolution] I#1645 - Tasks: Add table column for ESTIMATED-DURATION
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] I#1645 - Tasks: Add table column for ESTIMATED-DURATION
- Date: Fri, 3 Dec 2021 09:30:32 +0000 (UTC)
commit ade50b7c9f9bcffdb58004c75427a65e77b54f35
Author: Milan Crha <mcrha redhat com>
Date: Fri Dec 3 10:29:33 2021 +0100
I#1645 - Tasks: Add table column for ESTIMATED-DURATION
Related to https://gitlab.gnome.org/GNOME/evolution/-/issues/1645
src/calendar/gui/CMakeLists.txt | 2 +
src/calendar/gui/e-cal-model-tasks.c | 61 +++++++++++++++++++++
src/calendar/gui/e-cal-model-tasks.h | 1 +
src/calendar/gui/e-cell-estimated-duration.c | 80 ++++++++++++++++++++++++++++
src/calendar/gui/e-cell-estimated-duration.h | 50 +++++++++++++++++
src/calendar/gui/e-task-table.c | 11 ++++
src/calendar/gui/e-task-table.etspec | 1 +
7 files changed, 206 insertions(+)
---
diff --git a/src/calendar/gui/CMakeLists.txt b/src/calendar/gui/CMakeLists.txt
index 657f70aa69..61168406de 100644
--- a/src/calendar/gui/CMakeLists.txt
+++ b/src/calendar/gui/CMakeLists.txt
@@ -43,6 +43,7 @@ set(SOURCES
e-cal-ops.c
e-calendar-view.c
e-cell-date-edit-text.c
+ e-cell-estimated-duration.c
e-comp-editor.c
e-comp-editor-event.c
e-comp-editor-memo.c
@@ -119,6 +120,7 @@ set(HEADERS
e-cal-ops.h
e-calendar-view.h
e-cell-date-edit-text.h
+ e-cell-estimated-duration.h
e-comp-editor.h
e-comp-editor-event.h
e-comp-editor-memo.h
diff --git a/src/calendar/gui/e-cal-model-tasks.c b/src/calendar/gui/e-cal-model-tasks.c
index 322f7ed5ea..2f5f3afde4 100644
--- a/src/calendar/gui/e-cal-model-tasks.c
+++ b/src/calendar/gui/e-cal-model-tasks.c
@@ -627,6 +627,36 @@ set_location (ECalModelComponent *comp_data,
}
}
+static gpointer
+get_estimated_duration (ECalModelComponent *comp_data)
+{
+ ICalProperty *prop;
+ gpointer res = NULL;
+
+ prop = i_cal_component_get_first_property (comp_data->icalcomp, I_CAL_ESTIMATEDDURATION_PROPERTY);
+ if (prop) {
+ ICalDuration *duration;
+ gint duration_int;
+
+ duration = i_cal_property_get_estimatedduration (prop);
+ duration_int = duration ? i_cal_duration_as_int (duration) : 0;
+
+ if (duration_int > 0) {
+ gint64 *pvalue;
+
+ pvalue = g_new (gint64, 1);
+ *pvalue = duration_int;
+
+ res = pvalue;
+ }
+
+ g_clear_object (&duration);
+ g_object_unref (prop);
+ }
+
+ return res;
+}
+
static void
cal_model_tasks_set_property (GObject *object,
guint property_id,
@@ -766,6 +796,7 @@ cal_model_tasks_store_values_from_model (ECalModel *model,
e_cal_model_util_set_value (values, source_model, E_CAL_MODEL_TASKS_FIELD_PRIORITY, row);
e_cal_model_util_set_value (values, source_model, E_CAL_MODEL_TASKS_FIELD_URL, row);
e_cal_model_util_set_value (values, source_model, E_CAL_MODEL_TASKS_FIELD_LOCATION, row);
+ e_cal_model_util_set_value (values, source_model, E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION, row);
}
static void
@@ -796,6 +827,7 @@ cal_model_tasks_fill_component_from_values (ECalModel *model,
set_priority (comp_data, e_cal_model_util_get_value (values, E_CAL_MODEL_TASKS_FIELD_PRIORITY));
set_url (comp_data, e_cal_model_util_get_value (values, E_CAL_MODEL_TASKS_FIELD_URL));
set_location (comp_data, e_cal_model_util_get_value (values, E_CAL_MODEL_TASKS_FIELD_LOCATION));
+ /*set_estimated_duration (comp_data, e_cal_model_util_get_value (values,
E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION)); - read-only*/
}
static gint
@@ -847,6 +879,8 @@ cal_model_tasks_value_at (ETableModel *etm,
return get_url (comp_data);
case E_CAL_MODEL_TASKS_FIELD_LOCATION:
return get_location (comp_data);
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
+ return get_estimated_duration (comp_data);
}
return (gpointer) "";
@@ -903,6 +937,9 @@ cal_model_tasks_set_value_at (ETableModel *etm,
case E_CAL_MODEL_TASKS_FIELD_LOCATION:
set_location (comp_data, value);
break;
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
+ /* set_estimated_duration (comp_data, value); - read-only */
+ break;
}
e_cal_model_modify_component (E_CAL_MODEL (model), comp_data, E_CAL_OBJ_MOD_ALL);
@@ -937,6 +974,8 @@ cal_model_tasks_is_cell_editable (ETableModel *etm,
case E_CAL_MODEL_TASKS_FIELD_URL :
case E_CAL_MODEL_TASKS_FIELD_LOCATION:
return TRUE;
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
+ return FALSE;
}
return FALSE;
@@ -968,6 +1007,17 @@ cal_model_tasks_duplicate_value (ETableModel *etm,
case E_CAL_MODEL_TASKS_FIELD_LOCATION:
return g_strdup (value);
+
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
+ if (value) {
+ gint64 *res = g_new (gint64, 1);
+ const gint64 *pvalue = value;
+
+ *res = *pvalue;
+
+ return res;
+ }
+ return NULL;
}
return NULL;
@@ -1000,6 +1050,9 @@ cal_model_tasks_free_value (ETableModel *etm,
case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
break;
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
+ g_free (value);
+ break;
}
}
@@ -1026,6 +1079,7 @@ cal_model_tasks_initialize_value (ETableModel *etm,
case E_CAL_MODEL_TASKS_FIELD_DUE :
case E_CAL_MODEL_TASKS_FIELD_COMPLETE :
case E_CAL_MODEL_TASKS_FIELD_OVERDUE :
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
return NULL;
case E_CAL_MODEL_TASKS_FIELD_PERCENT :
return GINT_TO_POINTER (-1);
@@ -1056,6 +1110,7 @@ cal_model_tasks_value_is_empty (ETableModel *etm,
return string_is_empty (value);
case E_CAL_MODEL_TASKS_FIELD_COMPLETED :
case E_CAL_MODEL_TASKS_FIELD_DUE :
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
return value ? FALSE : TRUE;
case E_CAL_MODEL_TASKS_FIELD_PERCENT :
return (GPOINTER_TO_INT (value) < 0) ? TRUE : FALSE;
@@ -1098,6 +1153,12 @@ cal_model_tasks_value_to_string (ETableModel *etm,
return g_strdup ("N/A");
else
return g_strdup_printf ("%i%%", GPOINTER_TO_INT (value));
+ case E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION:
+ if (value) {
+ const gint64 *pvalue = value;
+ return e_cal_util_seconds_to_string (*pvalue);
+ }
+ break;
}
return g_strdup ("");
diff --git a/src/calendar/gui/e-cal-model-tasks.h b/src/calendar/gui/e-cal-model-tasks.h
index bf9aa54b63..6976828879 100644
--- a/src/calendar/gui/e-cal-model-tasks.h
+++ b/src/calendar/gui/e-cal-model-tasks.h
@@ -66,6 +66,7 @@ typedef enum {
E_CAL_MODEL_TASKS_FIELD_URL,
E_CAL_MODEL_TASKS_FIELD_STRIKEOUT, /* it's another virtual readonly column */
E_CAL_MODEL_TASKS_FIELD_LOCATION,
+ E_CAL_MODEL_TASKS_FIELD_ESTIMATED_DURATION,
E_CAL_MODEL_TASKS_FIELD_LAST
} ECalModelTasksField;
diff --git a/src/calendar/gui/e-cell-estimated-duration.c b/src/calendar/gui/e-cell-estimated-duration.c
new file mode 100644
index 0000000000..18ccd1e5cf
--- /dev/null
+++ b/src/calendar/gui/e-cell-estimated-duration.c
@@ -0,0 +1,80 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * SPDX-FileCopyrightText: (C) 2021 Red Hat (www.redhat.com)
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#include "evolution-config.h"
+
+#include <libecal/libecal.h>
+
+#include "e-cell-estimated-duration.h"
+
+G_DEFINE_TYPE (ECellEstimatedDuration, e_cell_estimated_duration, E_TYPE_CELL_TEXT)
+
+static gchar *
+eced_get_text (ECellText *cell,
+ ETableModel *model,
+ gint col,
+ gint row)
+{
+ gint64 *pvalue = e_table_model_value_at (model, col, row);
+ gchar *res;
+
+ if (!pvalue || *pvalue == 0) {
+ e_table_model_free_value (model, col, pvalue);
+ return NULL;
+ }
+
+ res = e_cal_util_seconds_to_string (*pvalue);
+
+ e_table_model_free_value (model, col, pvalue);
+
+ return res;
+}
+
+static void
+eced_free_text (ECellText *cell,
+ ETableModel *model,
+ gint col,
+ gchar *text)
+{
+ g_free (text);
+}
+
+static void
+e_cell_estimated_duration_class_init (ECellEstimatedDurationClass *klass)
+{
+ ECellTextClass *ectc = E_CELL_TEXT_CLASS (klass);
+
+ ectc->get_text = eced_get_text;
+ ectc->free_text = eced_free_text;
+}
+
+static void
+e_cell_estimated_duration_init (ECellEstimatedDuration *self)
+{
+ g_object_set (self, "use-tabular-numbers", TRUE, NULL);
+}
+
+/**
+ * e_cell_estimated_duration_new:
+ * @fontname: (nullable): font to be used to render on the screen
+ * @justify: Justification of the string in the cell.
+ *
+ * Creates a new ECell renderer that can be used to render estimated duration
+ *
+ * Returns: an ECell object that can be used to render estimated duration.
+ *
+ * Since: 3.44
+ */
+ECell *
+e_cell_estimated_duration_new (const gchar *fontname,
+ GtkJustification justify)
+{
+ ECellEstimatedDuration *self = g_object_new (E_TYPE_CELL_ESTIMATED_DURATION, NULL);
+
+ e_cell_text_construct (E_CELL_TEXT (self), fontname, justify);
+
+ return E_CELL (self);
+}
diff --git a/src/calendar/gui/e-cell-estimated-duration.h b/src/calendar/gui/e-cell-estimated-duration.h
new file mode 100644
index 0000000000..c0179bd0da
--- /dev/null
+++ b/src/calendar/gui/e-cell-estimated-duration.h
@@ -0,0 +1,50 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
+/*
+ * SPDX-FileCopyrightText: (C) 2021 Red Hat (www.redhat.com)
+ * SPDX-License-Identifier: LGPL-2.1-or-later
+ */
+
+#ifndef E_CELL_ESTIMATED_DURATION_H
+#define E_CELL_ESTIMATED_DURATION_H
+
+#include <e-util/e-util.h>
+
+/* Standard GObject macros */
+#define E_TYPE_CELL_ESTIMATED_DURATION \
+ (e_cell_estimated_duration_get_type ())
+#define E_CELL_ESTIMATED_DURATION(obj) \
+ (G_TYPE_CHECK_INSTANCE_CAST \
+ ((obj), E_TYPE_CELL_ESTIMATED_DURATION, ECellEstimatedDuration))
+#define E_CELL_ESTIMATED_DURATION_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_CAST \
+ ((cls), E_TYPE_CELL_ESTIMATED_DURATION, ECellEstimatedDurationClass))
+#define E_IS_CELL_ESTIMATED_DURATION(obj) \
+ (G_TYPE_CHECK_INSTANCE_TYPE \
+ ((obj), E_TYPE_CELL_ESTIMATED_DURATION))
+#define E_IS_CELL_ESTIMATED_DURATION_CLASS(cls) \
+ (G_TYPE_CHECK_CLASS_TYPE \
+ ((cls), E_TYPE_CELL_ESTIMATED_DURATION))
+#define E_CELL_ESTIMATED_DURATION_GET_CLASS(obj) \
+ (G_TYPE_INSTANCE_GET_CLASS \
+ ((obj), E_TYPE_CELL_ESTIMATED_DURATION, ECellEstimatedDurationClass))
+
+G_BEGIN_DECLS
+
+typedef struct _ECellEstimatedDuration ECellEstimatedDuration;
+typedef struct _ECellEstimatedDurationClass ECellEstimatedDurationClass;
+
+struct _ECellEstimatedDuration {
+ ECellText parent;
+};
+
+struct _ECellEstimatedDurationClass {
+ ECellTextClass parent_class;
+};
+
+GType e_cell_estimated_duration_get_type (void) G_GNUC_CONST;
+ECell * e_cell_estimated_duration_new (const gchar *fontname,
+ GtkJustification justify);
+
+G_END_DECLS
+
+#endif /* E_CELL_ESTIMATED_DURATION_H */
diff --git a/src/calendar/gui/e-task-table.c b/src/calendar/gui/e-task-table.c
index c4c0c4442d..7876d492e1 100644
--- a/src/calendar/gui/e-task-table.c
+++ b/src/calendar/gui/e-task-table.c
@@ -42,6 +42,7 @@
#include "e-cal-ops.h"
#include "e-calendar-view.h"
#include "e-cell-date-edit-text.h"
+#include "e-cell-estimated-duration.h"
#include "itip-utils.h"
#include "print.h"
#include "misc.h"
@@ -416,6 +417,16 @@ task_table_constructed (GObject *object)
E_CELL_DATE_EDIT (popup_cell),
e_task_table_get_current_time, task_table, NULL);
+ cell = e_cell_estimated_duration_new (NULL, GTK_JUSTIFY_LEFT);
+ g_object_set (
+ cell,
+ "strikeout_column", E_CAL_MODEL_TASKS_FIELD_STRIKEOUT,
+ "bold_column", E_CAL_MODEL_TASKS_FIELD_OVERDUE,
+ "bg_color_column", E_CAL_MODEL_FIELD_COLOR,
+ NULL);
+ e_table_extras_add_cell (extras, "estimatedduration", cell);
+ g_object_unref (cell);
+
/*
* Combo fields.
*/
diff --git a/src/calendar/gui/e-task-table.etspec b/src/calendar/gui/e-task-table.etspec
index 8d3210e0a8..ab4d839f25 100644
--- a/src/calendar/gui/e-task-table.etspec
+++ b/src/calendar/gui/e-task-table.etspec
@@ -13,6 +13,7 @@
<ETableColumn model_col="10" _title="Created" expansion="2.0" minimum_width="10" resizable="true"
cell="dateedit" compare="date-compare" priority="-2"/>
<ETableColumn model_col="11" _title="Last modified" expansion="2.0" minimum_width="10" resizable="true"
cell="dateedit" compare="date-compare" priority="-2"/>
<ETableColumn model_col="12" _title="Source" expansion="1.0" minimum_width="10" resizable="true"
cell="calstring" compare="collate" priority="-2"/>
+ <ETableColumn model_col="25" _title="Estimated duration" expansion="3.0" minimum_width="10"
resizable="true" cell="estimatedduration" compare="pointer-integer64" priority="10"/>
<ETableState>
<column source="1"/>
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]