/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright 2024 GNOME Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General
* Public License along with this library; if not, see .
*
* Authors:
* - Philip Withnall
*
* SPDX-License-Identifier: GPL-3.0-or-later
*/
#include
#include
#include "cc-time-editor.h"
#include "cc-timelike-editor.h"
/**
* CcTimeEditor:
*
* A widget for displaying and editing a clock time in hours and minutes, from
* 00:00 to 23:59.
*
* It also supports a 12-hour mode, which is used automatically if requested via
* the user’s `org.gnome.desktop.interface.clock-format` GSetting.
*/
struct _CcTimeEditor {
GtkWidget parent_instance;
CcTimelikeEditor *editor;
};
G_DEFINE_TYPE (CcTimeEditor, cc_time_editor, GTK_TYPE_WIDGET)
static void cc_time_editor_dispose (GObject *object);
static void editor_time_changed_cb (CcTimelikeEditor *editor,
gpointer user_data);
typedef enum {
SIGNAL_TIME_CHANGED,
} CcTimeEditorSignal;
static guint signals[SIGNAL_TIME_CHANGED + 1];
static void
cc_time_editor_class_init (CcTimeEditorClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
object_class->dispose = cc_time_editor_dispose;
/**
* CcTimeEditor::time-changed:
*
* Emitted when the time in the widget is edited.
*
* Use this rather than #GObject::notify because that would be emitted
* separately for hours and minutes. (It’s currently not implemented.)
*/
signals[SIGNAL_TIME_CHANGED] =
g_signal_new ("time-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_FIRST,
0, NULL, NULL,
NULL,
G_TYPE_NONE, 0);
gtk_widget_class_set_template_from_resource (widget_class, "/org/gnome/control-center/common/cc-time-editor.ui");
gtk_widget_class_bind_template_child (widget_class, CcTimeEditor, editor);
gtk_widget_class_bind_template_callback (widget_class, editor_time_changed_cb);
gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BOX_LAYOUT);
}
static void
cc_time_editor_init (CcTimeEditor *self)
{
gtk_widget_init_template (GTK_WIDGET (self));
g_signal_connect_object (self->editor, "time-changed",
G_CALLBACK (editor_time_changed_cb), self, G_CONNECT_DEFAULT);
}
static void
cc_time_editor_dispose (GObject *object)
{
gtk_widget_dispose_template (GTK_WIDGET (object), CC_TYPE_TIME_EDITOR);
G_OBJECT_CLASS (cc_time_editor_parent_class)->dispose (object);
}
static void
editor_time_changed_cb (CcTimelikeEditor *editor,
gpointer user_data)
{
CcTimeEditor *self = CC_TIME_EDITOR (user_data);
g_signal_emit (self, signals[SIGNAL_TIME_CHANGED], 0);
}
/**
* cc_time_editor_new:
*
* Create a new #CcTimeEditor.
*
* Returns: (transfer full): a new #CcTimeEditor
*/
CcTimeEditor *
cc_time_editor_new (void)
{
return g_object_new (CC_TYPE_TIME_EDITOR, NULL);
}
/**
* cc_time_editor_set_time:
* @self: a #CcTimeEditor
* @hour: the new hour ([0, 23])
* @minute: the new minute ([0, 59])
*
* Set the time in the editor.
*
* This is always in 24-hour time, regardless of whether the editor is
* displaying in 12-hour mode.
*/
void
cc_time_editor_set_time (CcTimeEditor *self,
guint hour,
guint minute)
{
g_return_if_fail (CC_IS_TIME_EDITOR (self));
cc_timelike_editor_set_time (self->editor, hour, minute);
}
/**
* cc_time_editor_get_hour:
* @self: a #CcTimeEditor
*
* Get the hours from the editor.
*
* These are always in 24-hour time, regardless of whether the editor is
* displaying in 12-hour mode.
*
* Returns: current hours value from the editor ([0, 23])
*/
guint
cc_time_editor_get_hour (CcTimeEditor *self)
{
g_return_val_if_fail (CC_IS_TIME_EDITOR (self), 0);
return cc_timelike_editor_get_hour (self->editor);
}
/**
* cc_time_editor_get_minute:
* @self: a #CcTimeEditor
*
* Get the minutes from the editor.
*
* Returns: current minutes value from the editor ([0, 59])
*/
guint
cc_time_editor_get_minute (CcTimeEditor *self)
{
g_return_val_if_fail (CC_IS_TIME_EDITOR (self), 0);
return cc_timelike_editor_get_minute (self->editor);
}