Commit 981e8dcd authored by Ell's avatar Ell

app, menus, icons: add dashboard dockable

The dashboard dockable shows the current GEGL cache and swap sizes,
and their recent history.  It has options to control the update
rate and history duration of the data, and an option to warn (by
raising/blinking the dialog) when the swap size approaches its
limit.
parent 8f3cb718
......@@ -44,6 +44,10 @@ libappactions_a_SOURCES = \
cursor-info-actions.h \
cursor-info-commands.c \
cursor-info-commands.h \
dashboard-actions.c \
dashboard-actions.h \
dashboard-commands.c \
dashboard-commands.h \
data-commands.c \
data-commands.h \
data-editor-commands.c \
......
......@@ -57,6 +57,7 @@
#include "colormap-actions.h"
#include "context-actions.h"
#include "cursor-info-actions.h"
#include "dashboard-actions.h"
#include "debug-actions.h"
#include "dialogs-actions.h"
#include "dock-actions.h"
......@@ -128,6 +129,9 @@ static const GimpActionFactoryEntry action_groups[] =
{ "cursor-info", N_("Pointer Information"), NULL,
cursor_info_actions_setup,
cursor_info_actions_update },
{ "dashboard", N_("Dashboard"), GIMP_ICON_DIALOG_DASHBOARD,
dashboard_actions_setup,
dashboard_actions_update },
{ "debug", N_("Debug"), NULL,
debug_actions_setup,
debug_actions_update },
......
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpwidgets/gimpwidgets.h"
#include "actions-types.h"
#include "widgets/gimpactiongroup.h"
#include "widgets/gimpdashboard.h"
#include "widgets/gimphelp-ids.h"
#include "dashboard-actions.h"
#include "dashboard-commands.h"
#include "gimp-intl.h"
static const GimpActionEntry dashboard_actions[] =
{
{ "dashboard-popup", GIMP_ICON_DIALOG_DASHBOARD,
NC_("dashboard-action", "Dashboard Menu"), NULL, NULL, NULL,
GIMP_HELP_DASHBOARD_DIALOG },
{ "dashboard-update-interval", NULL,
NC_("dashboard-action", "Update Interval") },
{ "dashboard-history-duration", NULL,
NC_("dashboard-action", "History Duration") }
};
static const GimpToggleActionEntry dashboard_toggle_actions[] =
{
{ "dashboard-low-swap-space-warning", NULL,
NC_("dashboard-action", "Low Swap Space Warning"), NULL,
N_("Raise the dashboard when the swap size approaches its limit"),
G_CALLBACK (dashboard_low_swap_space_warning_cmd_callback),
FALSE,
GIMP_HELP_DASHBOARD_LOW_SWAP_SPACE_WARNING }
};
static const GimpRadioActionEntry dashboard_update_interval_actions[] =
{
{ "dashboard-update-interval-0-25-sec", NULL,
NC_("dashboard-update-interval", "0.25 Seconds"), NULL, NULL,
GIMP_DASHBOARD_UPDATE_INTERVAL_0_25_SEC,
GIMP_HELP_DASHBOARD_UPDATE_INTERVAL },
{ "dashboard-update-interval-0-5-sec", NULL,
NC_("dashboard-update-interval", "0.5 Seconds"), NULL, NULL,
GIMP_DASHBOARD_UPDATE_INTERVAL_0_5_SEC,
GIMP_HELP_DASHBOARD_UPDATE_INTERVAL },
{ "dashboard-update-interval-1-sec", NULL,
NC_("dashboard-update-interval", "1 Second"), NULL, NULL,
GIMP_DASHBOARD_UPDATE_INTERVAL_1_SEC,
GIMP_HELP_DASHBOARD_UPDATE_INTERVAL },
{ "dashboard-update-interval-2-sec", NULL,
NC_("dashboard-update-interval", "2 Seconds"), NULL, NULL,
GIMP_DASHBOARD_UPDATE_INTERVAL_2_SEC,
GIMP_HELP_DASHBOARD_UPDATE_INTERVAL },
{ "dashboard-update-interval-4-sec", NULL,
NC_("dashboard-update-interval", "4 Seconds"), NULL, NULL,
GIMP_DASHBOARD_UPDATE_INTERVAL_4_SEC,
GIMP_HELP_DASHBOARD_UPDATE_INTERVAL }
};
static const GimpRadioActionEntry dashboard_history_duration_actions[] =
{
{ "dashboard-history-duration-15-sec", NULL,
NC_("dashboard-history-duration", "15 Seconds"), NULL, NULL,
GIMP_DASHBOARD_HISTORY_DURATION_15_SEC,
GIMP_HELP_DASHBOARD_HISTORY_DURATION },
{ "dashboard-history-duration-30-sec", NULL,
NC_("dashboard-history-duration", "30 Seconds"), NULL, NULL,
GIMP_DASHBOARD_HISTORY_DURATION_30_SEC,
GIMP_HELP_DASHBOARD_HISTORY_DURATION },
{ "dashboard-history-duration-60-sec", NULL,
NC_("dashboard-history-duration", "60 Seconds"), NULL, NULL,
GIMP_DASHBOARD_HISTORY_DURATION_60_SEC,
GIMP_HELP_DASHBOARD_HISTORY_DURATION },
{ "dashboard-history-duration-120-sec", NULL,
NC_("dashboard-history-duration", "120 Seconds"), NULL, NULL,
GIMP_DASHBOARD_HISTORY_DURATION_120_SEC,
GIMP_HELP_DASHBOARD_HISTORY_DURATION },
{ "dashboard-history-duration-240-sec", NULL,
NC_("dashboard-history-duration", "240 Seconds"), NULL, NULL,
GIMP_DASHBOARD_HISTORY_DURATION_240_SEC,
GIMP_HELP_DASHBOARD_HISTORY_DURATION }
};
void
dashboard_actions_setup (GimpActionGroup *group)
{
gimp_action_group_add_actions (group, "dashboard-action",
dashboard_actions,
G_N_ELEMENTS (dashboard_actions));
gimp_action_group_add_toggle_actions (group, "dashboard-action",
dashboard_toggle_actions,
G_N_ELEMENTS (dashboard_toggle_actions));
gimp_action_group_add_radio_actions (group, "dashboard-update-interval",
dashboard_update_interval_actions,
G_N_ELEMENTS (dashboard_update_interval_actions),
NULL,
0,
G_CALLBACK (dashboard_update_interval_cmd_callback));
gimp_action_group_add_radio_actions (group, "dashboard-history-duration",
dashboard_history_duration_actions,
G_N_ELEMENTS (dashboard_history_duration_actions),
NULL,
0,
G_CALLBACK (dashboard_history_duration_cmd_callback));
}
void
dashboard_actions_update (GimpActionGroup *group,
gpointer data)
{
GimpDashboard *dashboard = GIMP_DASHBOARD (data);
#define SET_ACTIVE(action,condition) \
gimp_action_group_set_action_active (group, action, (condition) != 0)
switch (dashboard->update_interval)
{
case GIMP_DASHBOARD_UPDATE_INTERVAL_0_25_SEC:
SET_ACTIVE ("dashboard-update-interval-0-25-sec", TRUE);
break;
case GIMP_DASHBOARD_UPDATE_INTERVAL_0_5_SEC:
SET_ACTIVE ("dashboard-update-interval-0-5-sec", TRUE);
break;
case GIMP_DASHBOARD_UPDATE_INTERVAL_1_SEC:
SET_ACTIVE ("dashboard-update-interval-1-sec", TRUE);
break;
case GIMP_DASHBOARD_UPDATE_INTERVAL_2_SEC:
SET_ACTIVE ("dashboard-update-interval-2-sec", TRUE);
break;
case GIMP_DASHBOARD_UPDATE_INTERVAL_4_SEC:
SET_ACTIVE ("dashboard-update-interval-4-sec", TRUE);
break;
}
switch (dashboard->history_duration)
{
case GIMP_DASHBOARD_HISTORY_DURATION_15_SEC:
SET_ACTIVE ("dashboard-history-duration-15-sec", TRUE);
break;
case GIMP_DASHBOARD_HISTORY_DURATION_30_SEC:
SET_ACTIVE ("dashboard-history-duration-30-sec", TRUE);
break;
case GIMP_DASHBOARD_HISTORY_DURATION_60_SEC:
SET_ACTIVE ("dashboard-history-duration-60-sec", TRUE);
break;
case GIMP_DASHBOARD_HISTORY_DURATION_120_SEC:
SET_ACTIVE ("dashboard-history-duration-120-sec", TRUE);
break;
case GIMP_DASHBOARD_HISTORY_DURATION_240_SEC:
SET_ACTIVE ("dashboard-history-duration-240-sec", TRUE);
break;
}
SET_ACTIVE ("dashboard-low-swap-space-warning",
dashboard->low_swap_space_warning);
#undef SET_ACTIVE
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __DASHBOARD_ACTIONS_H__
#define __DASHBOARD_ACTIONS_H__
void dashboard_actions_setup (GimpActionGroup *group);
void dashboard_actions_update (GimpActionGroup *group,
gpointer data);
#endif /* __DASHBOARD_ACTIONS_H__ */
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpwidgets/gimpwidgets.h"
#include "actions-types.h"
#include "widgets/gimpdashboard.h"
#include "widgets/gimphelp-ids.h"
#include "dashboard-commands.h"
#include "gimp-intl.h"
/* public functionss */
void
dashboard_update_interval_cmd_callback (GtkAction *action,
GtkAction *current,
gpointer data)
{
GimpDashboard *dashboard = GIMP_DASHBOARD (data);
GimpDashboardUpdateInteval update_interval;
update_interval = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
gimp_dashboard_set_update_interval (dashboard, update_interval);
}
void
dashboard_history_duration_cmd_callback (GtkAction *action,
GtkAction *current,
gpointer data)
{
GimpDashboard *dashboard = GIMP_DASHBOARD (data);
GimpDashboardHistoryDuration history_duration;
history_duration = gtk_radio_action_get_current_value (GTK_RADIO_ACTION (action));
gimp_dashboard_set_history_duration (dashboard, history_duration);
}
void
dashboard_low_swap_space_warning_cmd_callback (GtkAction *action,
gpointer data)
{
GimpDashboard *dashboard = GIMP_DASHBOARD (data);
gboolean low_swap_space_warning;
low_swap_space_warning = gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action));
gimp_dashboard_set_low_swap_space_warning (dashboard, low_swap_space_warning);
}
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __DASHBOARD_COMMANDS_H__
#define __DASHBOARD_COMMANDS_H__
void dashboard_update_interval_cmd_callback (GtkAction *action,
GtkAction *current,
gpointer data);
void dashboard_history_duration_cmd_callback (GtkAction *action,
GtkAction *current,
gpointer data);
void dashboard_low_swap_space_warning_cmd_callback (GtkAction *action,
gpointer data);
#endif /* __DASHBOARD_COMMANDS_H__ */
......@@ -233,6 +233,12 @@ const GimpStringActionEntry dialogs_dockable_actions[] =
NC_("dialogs-action", "Error Co_nsole"), NULL,
NC_("dialogs-action", "Open the error console"),
"gimp-error-console",
GIMP_HELP_ERRORS_DIALOG },
{ "dialogs-dashboard", GIMP_ICON_DIALOG_DASHBOARD,
NC_("dialogs-action", "_Dashboard"), NULL,
NC_("dialogs-action", "Open the dashboard"),
"gimp-dashboard",
GIMP_HELP_ERRORS_DIALOG }
};
......
......@@ -35,6 +35,7 @@
#include "widgets/gimpchanneltreeview.h"
#include "widgets/gimpcoloreditor.h"
#include "widgets/gimpcolormapeditor.h"
#include "widgets/gimpdashboard.h"
#include "widgets/gimpdevicestatus.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimpdockwindow.h"
......@@ -344,6 +345,16 @@ dialogs_cursor_view_new (GimpDialogFactory *factory,
return gimp_cursor_view_new (gimp_dialog_factory_get_menu_factory (factory));
}
GtkWidget *
dialogs_dashboard_new (GimpDialogFactory *factory,
GimpContext *context,
GimpUIManager *ui_manager,
gint view_size)
{
return gimp_dashboard_new (context->gimp,
gimp_dialog_factory_get_menu_factory (factory));
}
/***** list views *****/
......
......@@ -125,6 +125,10 @@ GtkWidget * dialogs_cursor_view_new (GimpDialogFactory *factory,
GimpContext *context,
GimpUIManager *ui_manager,
gint view_size);
GtkWidget * dialogs_dashboard_new (GimpDialogFactory *factory,
GimpContext *context,
GimpUIManager *ui_manager,
gint view_size);
GtkWidget * dialogs_image_list_view_new (GimpDialogFactory *factory,
GimpContext *context,
......
......@@ -320,6 +320,10 @@ static const GimpDialogFactoryEntry entries[] =
N_("Pointer"), N_("Pointer Information"), GIMP_ICON_CURSOR,
GIMP_HELP_POINTER_INFO_DIALOG,
dialogs_cursor_view_new, 0, TRUE),
DOCKABLE ("gimp-dashboard",
N_("Dashboard"), N_("Dashboard"), GIMP_ICON_DIALOG_DASHBOARD,
GIMP_HELP_ERRORS_DIALOG,
dialogs_dashboard_new, 0, TRUE),
/* list & grid views */
LISTGRID (image, image,
......
......@@ -387,6 +387,14 @@ menus_init (Gimp *gimp,
"sample-points-menu.xml",
NULL,
NULL);
gimp_menu_factory_manager_register (global_menu_factory, "<Dashboard>",
"dashboard",
NULL,
"/dashboard-popup",
"dashboard-menu.xml",
NULL,
NULL);
}
void
......
......@@ -120,6 +120,8 @@ libappwidgets_a_sources = \
gimpcursor.h \
gimpcurveview.c \
gimpcurveview.h \
gimpdashboard.c \
gimpdashboard.h \
gimpdasheditor.c \
gimpdasheditor.h \
gimpdataeditor.c \
......
This diff is collapsed.
/* GIMP - The GNU Image Manipulation Program
* Copyright (C) 1995 Spencer Kimball and Peter Mattis
*
* gimpdashboard.h
* Copyright (C) 2017 Ell
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef __GIMP_DASHBOARD_H__
#define __GIMP_DASHBOARD_H__
#include "gimpeditor.h"
#define GIMP_TYPE_DASHBOARD (gimp_dashboard_get_type ())
#define GIMP_DASHBOARD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DASHBOARD, GimpDashboard))
#define GIMP_DASHBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DASHBOARD, GimpDashboardClass))
#define GIMP_IS_DASHBOARD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_DASHBOARD))
#define GIMP_IS_DASHBOARD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DASHBOARD))
#define GIMP_DASHBOARD_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_DASHBOARD, GimpDashboardClass))
typedef struct _GimpDashboardClass GimpDashboardClass;
struct _GimpDashboard
{
GimpEditor parent_instance;
Gimp *gimp;
GtkWidget *box;
GtkWidget *cache_meter;
GtkWidget *cache_occupied_label;
GtkWidget *cache_occupied_pct_label;
GtkWidget *cache_limit_label;
GtkWidget *swap_meter;
GtkWidget *swap_occupied_label;
GtkWidget *swap_occupied_pct_label;
GtkWidget *swap_size_label;
GtkWidget *swap_size_pct_label;
GtkWidget *swap_limit_label;
gint timeout_id;
gint low_swap_space_idle_id;
GThread *thread;
GMutex mutex;
GCond cond;
gboolean quit;
GimpDashboardUpdateInteval update_interval;
GimpDashboardHistoryDuration history_duration;
gboolean low_swap_space_warning;
};
struct _GimpDashboardClass
{
GimpEditorClass parent_class;
};
GType gimp_dashboard_get_type (void) G_GNUC_CONST;
GtkWidget * gimp_dashboard_new (Gimp *gimp,
GimpMenuFactory *menu_factory);
void gimp_dashboard_set_update_interval (GimpDashboard *dashboard,
GimpDashboardUpdateInteval update_interval);
void gimp_dashboard_set_history_duration (GimpDashboard *dashboard,
GimpDashboardHistoryDuration history_duration);
void gimp_dashboard_set_low_swap_space_warning (GimpDashboard *dashboard,
gboolean low_swap_space_warning);
#endif /* __GIMP_DASHBOARD_H__ */
......@@ -662,6 +662,11 @@
#define GIMP_HELP_SAMPLE_POINT_DIALOG "gimp-sample-point-dialog"
#define GIMP_HELP_SAMPLE_POINT_SAMPLE_MERGED "gimp-sample-point-sample-merged"
#define GIMP_HELP_DASHBOARD_DIALOG "gimp-dashboard-dialog"
#define GIMP_HELP_DASHBOARD_UPDATE_INTERVAL "gimp-dashboard-update-interval"
#define GIMP_HELP_DASHBOARD_HISTORY_DURATION "gimp-dashboard-history-duration"
#define GIMP_HELP_DASHBOARD_LOW_SWAP_SPACE_WARNING "gimp-dashboard-low-swap-space-warning"
#define GIMP_HELP_DOCK "gimp-dock"
#define GIMP_HELP_DOCK_CLOSE "gimp-dock-close"
#define GIMP_HELP_DOCK_IMAGE_MENU "gimp-dock-image-menu"
......
......@@ -306,5 +306,23 @@ typedef enum /*< skip >*/
GIMP_DIALOGS_HIDDEN_WITH_DISPLAY /* dialogs are hidden with the display */
} GimpDialogsState;
typedef enum /*< skip >*/
{
GIMP_DASHBOARD_UPDATE_INTERVAL_0_25_SEC = 250,
GIMP_DASHBOARD_UPDATE_INTERVAL_0_5_SEC = 500,
GIMP_DASHBOARD_UPDATE_INTERVAL_1_SEC = 1000,
GIMP_DASHBOARD_UPDATE_INTERVAL_2_SEC = 2000,
GIMP_DASHBOARD_UPDATE_INTERVAL_4_SEC = 4000
} GimpDashboardUpdateInteval;
typedef enum /*< skip >*/
{
GIMP_DASHBOARD_HISTORY_DURATION_15_SEC = 15000,
GIMP_DASHBOARD_HISTORY_DURATION_30_SEC = 30000,
GIMP_DASHBOARD_HISTORY_DURATION_60_SEC = 60000,
GIMP_DASHBOARD_HISTORY_DURATION_120_SEC = 120000,
GIMP_DASHBOARD_HISTORY_DURATION_240_SEC = 240000
} GimpDashboardHistoryDuration;
#endif /* __WIDGETS_ENUMS_H__ */
......@@ -57,6 +57,7 @@ typedef struct _GimpDeviceStatus GimpDeviceStatus;
typedef struct _GimpEditor GimpEditor;
typedef struct _GimpErrorConsole GimpErrorConsole;
typedef struct _GimpToolOptionsEditor GimpToolOptionsEditor;
typedef struct _GimpDashboard GimpDashboard;
/* GimpDataEditor widgets */
......
......@@ -61,8 +61,8 @@
inkscape:window-maximized="1"
inkscape:window-y="24"
inkscape:window-x="65"
inkscape:cy="181.50558"
inkscape:cx="960.06476"
inkscape:cy="117.27625"
inkscape:cx="757.84583"
inkscape:zoom="1"
showgrid="true"
id="namedview88"
......@@ -40418,7 +40418,7 @@
inkscape:r_cy="true"
inkscape:r_cx="true"
id="path4926"
d="M 7.8738374,1044.3622 C 6.8302869,1044.4246 6,1045.2489 6,1046.2491 c 0,0.039 0.00388,0.075 0.00629,0.1131 h 3.9874254 c 0.00241,-0.038 0.00629,-0.074 0.00629,-0.1131 0,-1.0409 -0.8967429,-1.8869 -2.0000024,-1.8869 -0.043099,0 -0.083767,0 -0.1261851,0 z"
d="M 7.8738374,1044.3622 C 6.8302869,1044.4246 6,1045.2489 6,1046.2491 c 0,0.039 0.00388,0.075 0.00629,0.1131 h 3.9874254 c 0.00241,-0.038 0.00629,-0.074 0.00629,-0.1131 0,-1.0409 -0.8967381,-1.8869 -1.9999976,-1.8869 -0.043099,0 -0.083767,0 -0.1261851,0 z"
style="color:#000000;display:inline;overflow:visible;visibility:visible;opacity:1;fill:#fffbd7;fill-opacity:0.55681817;fill-rule:evenodd;stroke:none;stroke-width:1.01903164;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker:none;marker-start:none;marker-mid:none;marker-end:none"
inkscape:connector-curvature="0" />
</g>
......@@ -50746,6 +50746,48 @@
id="rect52867"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
transform="matrix(3.7795276,0,0,3.7795276,90.2587,-1003.0102)"
id="gimp-dashboard">
<g
id="g2910"
transform="translate(0,0.26636769)">
<path
style="opacity:1;fill:none;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:0.39687499;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
d="m 2.1171834,293.03123 c -0.7036231,0 -1.3718978,0.31263 -1.82417803,0.85163 l 0.60719808,0.50953 c 0.30179595,-0.35967 0.74746885,-0.56793 1.21697995,-0.56793 0.1161413,0 0.2308877,0.0125 0.342098,0.0372 -0.2890398,0.45136 -0.6480014,0.88459 -0.9027816,1.3478 -0.112182,0.30823 0.047317,0.65159 0.3555339,0.76378 0.3082197,0.11223 0.6515993,-0.0494 0.7637777,-0.3576 0.016812,-0.0462 0.028085,-0.0937 0.033073,-0.14263 v -0.002 -0.008 l 0.00206,-0.0103 0.1400432,-1.44539 c 0.1814891,0.0953 0.3460284,0.22401 0.4811075,0.38499 l 0.6092684,-0.50953 c -0.3097918,-0.30804 -0.6683875,-0.57637 -1.0097449,-0.709 -0.2768298,-0.0596 -0.5608524,-0.13853 -0.8144352,-0.14255 z m -0.0062,2.11667 c 0.032755,-6.6e-4 0.065347,0.005 0.096118,0.016 0.1372458,0.05 0.2080275,0.20172 0.1581299,0.33899 -0.04998,0.13725 -0.2017216,0.20803 -0.3389974,0.15813 -0.1372458,-0.05 -0.2080276,-0.20172 -0.15813,-0.33899 0.037284,-0.1026 0.1337466,-0.17176 0.2428794,-0.17415 z"
id="path817-3"
inkscape:connector-curvature="0"
sodipodi:nodetypes="cccscccccccccccccccccccc" />
<g
id="g2902">
<g
id="g2896">
<path
style="opacity:1;fill:#66dd11;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
d="m 2.1171834,293.03123 c -0.7036231,0 -1.37189781,0.31263 -1.82417802,0.85163 l 0.60719809,0.50953 c 0.30179593,-0.35967 0.74746893,-0.56793 1.21697993,-0.56793 0.1161414,0 0.2308878,0.0125 0.342098,0.0372 l 0.3260784,-0.47491 0.1441773,-0.21032 c -0.2577537,-0.0938 -0.5319466,-0.1452 -0.8123537,-0.1452 z"
id="path2875-5"
inkscape:connector-curvature="0" />
<path
style="opacity:1;fill:#dd3322;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
d="m 2.9310971,293.17744 -0.080098,0.82992 c 0.1814891,0.0953 0.3460284,0.22401 0.4811075,0.38499 l 0.6092548,-0.50949 C 3.669724,293.55914 3.3194255,293.31918 2.9310873,293.17747 Z"
id="path2871"
inkscape:connector-curvature="0" />
</g>
<path
id="path817"
d="m 2.9316039,293.17386 -0.1462442,0.21291 -1.1601359,1.6893 v 0.002 c -0.00132,0.002 -0.00283,0.004 -0.00413,0.006 l -0.042892,0.0625 0.00982,0.004 c -0.0099,0.0198 -0.023863,0.0381 -0.031523,0.0589 -0.112182,0.30823 0.047317,0.65159 0.3555339,0.76378 0.3082198,0.11223 0.6515992,-0.0494 0.7637776,-0.3576 0.016812,-0.0462 0.028085,-0.0937 0.033073,-0.14263 v -0.002 -0.008 l 0.00206,-0.0103 z m -0.8206217,1.97404 a 0.26458332,0.26458332 0 0 1 0.096118,0.016 0.26458332,0.26458332 0 0 1 0.1581299,0.339 0.26458332,0.26458332 0 0 1 -0.3389974,0.15813 0.26458332,0.26458332 0 0 1 -0.1581299,-0.339 0.26458332,0.26458332 0 0 1 0.2428792,-0.17415 z"
style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.26458332;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke"
inkscape:connector-curvature="0" />
</g>
</g>
<rect
y="292.76666"
x="0"
height="4.2333331"
width="4.2333331"
id="rect2978"
style="fill:none;fill-rule:evenodd;stroke:none;stroke-width:0.26458332px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
</g>
</g>
<g
inkscape:groupmode="layer"
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="16"
height="16"
viewBox="0 0 4.2333332 4.2333335"
version="1.1"
id="svg8"
inkscape:version="0.92.2 (5c3e80d, 2017-08-06)"
sodipodi:docname="gimp-dashboard.svg">
<title
id="title4405">GIMP Dashboard</title>
<defs
id="defs2">
<linearGradient
inkscape:collect="always"
id="linearGradient1484">
<stop
style="stop-color:#119911;stop-opacity:1"
offset="0"
id="stop1480" />
<stop
id="stop1488"
offset="0.50094193"
style="stop-color:#eaea38;stop-opacity:1" />
<stop
style="stop-color:#bc1b1b;stop-opacity:1"
offset="1"
id="stop1482" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient1484"
id="linearGradient1486"
x1="0.29556136"
y1="293.64385"
x2="3.9377716"
y2="293.64385"
gradientUnits="userSpaceOnUse" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="38.5625"
inkscape:cx="5.0696921"
inkscape:cy="8"
inkscape:document-units="mm"
inkscape:current-layer="layer1"
showgrid="true"
units="px"
inkscape:window-width="1535"
inkscape:window-height="876"
inkscape:window-x="65"
inkscape:window-y="24"
inkscape:window-maximized="1">
<inkscape:grid
type="xygrid"
id="grid815"
empspacing="4" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>