date-chooser-day: Make it a button
This stops reimplementing a flat button and use GtkButton directly instead.
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
*
|
||||
* Copyright (C) 2015 Red Hat, Inc.
|
||||
* Copyright (C) 2022 Purism SPC
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -25,33 +26,15 @@
|
||||
#include <stdlib.h>
|
||||
#include <langinfo.h>
|
||||
|
||||
enum {
|
||||
SELECTED,
|
||||
LAST_DAY_SIGNAL
|
||||
};
|
||||
|
||||
static guint signals[LAST_DAY_SIGNAL] = { 0, };
|
||||
|
||||
struct _GcalDateChooserDay
|
||||
{
|
||||
AdwBin parent;
|
||||
GtkButton parent;
|
||||
|
||||
GtkWidget *label;
|
||||
GDateTime *date;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GcalDateChooserDay, gcal_date_chooser_day, ADW_TYPE_BIN)
|
||||
|
||||
static void
|
||||
day_pressed (GtkGestureClick *click_gesture,
|
||||
gint n_press,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
GcalDateChooserDay *self)
|
||||
{
|
||||
if (n_press == 1)
|
||||
g_signal_emit (self, signals[SELECTED], 0);
|
||||
}
|
||||
G_DEFINE_TYPE (GcalDateChooserDay, gcal_date_chooser_day, GTK_TYPE_BUTTON)
|
||||
|
||||
static void
|
||||
gcal_date_chooser_day_dispose (GObject *object)
|
||||
@@ -66,40 +49,23 @@ gcal_date_chooser_day_dispose (GObject *object)
|
||||
static void
|
||||
gcal_date_chooser_day_class_init (GcalDateChooserDayClass *class)
|
||||
{
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
|
||||
object_class->dispose = gcal_date_chooser_day_dispose;
|
||||
|
||||
signals[SELECTED] = g_signal_new ("selected",
|
||||
GCAL_TYPE_DATE_CHOOSER_DAY,
|
||||
G_SIGNAL_RUN_FIRST,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, "day");
|
||||
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_space, 0, "selected", NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Return, 0, "selected", NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_ISO_Enter, 0, "selected", NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Enter, 0, "selected", NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Space, 0, "selected", NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
gcal_date_chooser_day_init (GcalDateChooserDay *self)
|
||||
{
|
||||
GtkGesture *click_gesture;
|
||||
GtkWidget *widget = GTK_WIDGET (self);
|
||||
|
||||
gtk_widget_set_halign (widget, GTK_ALIGN_CENTER);
|
||||
gtk_widget_set_valign (widget, GTK_ALIGN_CENTER);
|
||||
|
||||
gtk_widget_set_can_focus (widget, TRUE);
|
||||
gtk_widget_add_css_class (widget, "circular");
|
||||
gtk_widget_add_css_class (widget, "day");
|
||||
gtk_widget_add_css_class (widget, "flat");
|
||||
|
||||
self->label = gtk_label_new ("");
|
||||
gtk_widget_set_halign (self->label, GTK_ALIGN_CENTER);
|
||||
@@ -107,17 +73,7 @@ gcal_date_chooser_day_init (GcalDateChooserDay *self)
|
||||
gtk_widget_set_hexpand (self->label, TRUE);
|
||||
gtk_widget_set_vexpand (self->label, TRUE);
|
||||
|
||||
adw_bin_set_child (ADW_BIN (self), self->label);
|
||||
|
||||
click_gesture = gtk_gesture_click_new ();
|
||||
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (click_gesture), 0);
|
||||
gtk_widget_add_controller (widget, GTK_EVENT_CONTROLLER (click_gesture));
|
||||
|
||||
g_signal_connect_object (click_gesture,
|
||||
"pressed",
|
||||
G_CALLBACK (day_pressed),
|
||||
self,
|
||||
0);
|
||||
gtk_button_set_child (GTK_BUTTON (self), self->label);
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
@@ -160,8 +116,16 @@ void
|
||||
gcal_date_chooser_day_set_selected (GcalDateChooserDay *self,
|
||||
gboolean selected)
|
||||
{
|
||||
if (selected)
|
||||
gtk_widget_set_state_flags (GTK_WIDGET (self), GTK_STATE_FLAG_SELECTED, FALSE);
|
||||
GtkWidget *widget = GTK_WIDGET (self);
|
||||
|
||||
if (G_UNLIKELY (selected))
|
||||
{
|
||||
gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_SELECTED, FALSE);
|
||||
gtk_widget_remove_css_class (widget, "flat");
|
||||
}
|
||||
else
|
||||
gtk_widget_unset_state_flags (GTK_WIDGET (self), GTK_STATE_FLAG_SELECTED);
|
||||
{
|
||||
gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_SELECTED);
|
||||
gtk_widget_add_css_class (widget, "flat");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2015 Red Hat, Inc.
|
||||
* Copyright (C) 2022 Purism SPC
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
@@ -17,12 +18,12 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <adwaita.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GCAL_TYPE_DATE_CHOOSER_DAY (gcal_date_chooser_day_get_type())
|
||||
G_DECLARE_FINAL_TYPE (GcalDateChooserDay, gcal_date_chooser_day, GCAL, DATE_CHOOSER_DAY, AdwBin)
|
||||
G_DECLARE_FINAL_TYPE (GcalDateChooserDay, gcal_date_chooser_day, GCAL, DATE_CHOOSER_DAY, GtkButton)
|
||||
|
||||
GtkWidget* gcal_date_chooser_day_new (void);
|
||||
|
||||
|
||||
@@ -579,7 +579,7 @@ gcal_date_chooser_init (GcalDateChooser *self)
|
||||
self->days[row][col] = gcal_date_chooser_day_new ();
|
||||
|
||||
g_signal_connect_object (self->days[row][col],
|
||||
"selected",
|
||||
"clicked",
|
||||
G_CALLBACK (day_selected_cb),
|
||||
self,
|
||||
0);
|
||||
|
||||
+14
-34
@@ -182,50 +182,30 @@ datechooser .weekday:backdrop {
|
||||
}
|
||||
|
||||
/* days */
|
||||
datechooser day {
|
||||
transition-property: background-color;
|
||||
transition-duration: 200ms;
|
||||
datechooser button.day {
|
||||
font-size: 10pt;
|
||||
font-weight: normal;
|
||||
margin: 3px;
|
||||
min-height: 28px;
|
||||
min-width: 28px;
|
||||
transition: none;
|
||||
}
|
||||
|
||||
datechooser day label {
|
||||
transition-property: color;
|
||||
transition-duration: 200ms;
|
||||
datechooser button.day:selected {
|
||||
background-color: @accent_bg_color;
|
||||
color: @accent_fg_color;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
datechooser day {
|
||||
min-height: 32px;
|
||||
min-width: 32px;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
datechooser day.other-month:not(:hover),
|
||||
datechooser day.other-month:backdrop {
|
||||
datechooser button.day.other-month:not(:hover),
|
||||
datechooser button.day.other-month:backdrop {
|
||||
color: alpha(currentColor, 0.1);
|
||||
}
|
||||
|
||||
/* avoid the theme interfering with label colors */
|
||||
datechooser day:selected label,
|
||||
datechooser day.other-month label:hover,
|
||||
datechooser day.other-month label:backdrop {
|
||||
color: currentColor;
|
||||
}
|
||||
|
||||
/* hovered days style */
|
||||
datechooser day:hover:not(:backdrop) {
|
||||
background-color: alpha(currentColor, 0.1);
|
||||
}
|
||||
|
||||
datechooser day.other-month:hover:not(:backdrop) {
|
||||
datechooser button.day.other-month:hover:not(:backdrop) {
|
||||
color: @insensitive_fg_color;
|
||||
}
|
||||
|
||||
datechooser day:selected,
|
||||
datechooser day:selected:hover {
|
||||
color: @accent_fg_color;
|
||||
background-color: @accent_bg_color;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
label.month-name {
|
||||
font-size: 16pt;
|
||||
font-weight: bold;
|
||||
|
||||
Reference in New Issue
Block a user