/* PIKA - Photo and Image Kooker Application * a rebranding of The GNU Image Manipulation Program (created with heckimp) * A derived work which may be trivial. However, any changes may be (C)2023 by Aldercone Studio * * Original copyright, applying to most contents (license remains unchanged): * Copyright (C) 1995 Spencer Kimball and Peter Mattis * * pikacellrendererbutton.c * Copyright (C) 2016 Michael Natterer * * 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 . */ #include #include #include "widgets-types.h" #include "core/pikamarshal.h" #include "pikacellrendererbutton.h" enum { CLICKED, LAST_SIGNAL }; static gboolean pika_cell_renderer_button_activate (GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags); G_DEFINE_TYPE (PikaCellRendererButton, pika_cell_renderer_button, GTK_TYPE_CELL_RENDERER_PIXBUF) #define parent_class pika_cell_renderer_button_parent_class static guint button_cell_signals[LAST_SIGNAL] = { 0 }; static void pika_cell_renderer_button_class_init (PikaCellRendererButtonClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GtkCellRendererClass *cell_class = GTK_CELL_RENDERER_CLASS (klass); /** * PikaCellRendererButton::clicked: * @cell: * @path: * @state: * * Called on a button cell when it is clicked. **/ button_cell_signals[CLICKED] = g_signal_new ("clicked", G_OBJECT_CLASS_TYPE (object_class), G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (PikaCellRendererButtonClass, clicked), NULL, NULL, pika_marshal_VOID__STRING_FLAGS, G_TYPE_NONE, 2, G_TYPE_STRING, GDK_TYPE_MODIFIER_TYPE); cell_class->activate = pika_cell_renderer_button_activate; klass->clicked = NULL; } static void pika_cell_renderer_button_init (PikaCellRendererButton *cell_button) { g_object_set (cell_button, "mode", GTK_CELL_RENDERER_MODE_ACTIVATABLE, "xpad", 2, "ypad", 2, "stock-size", GTK_ICON_SIZE_BUTTON, NULL); } static gboolean pika_cell_renderer_button_activate (GtkCellRenderer *cell, GdkEvent *event, GtkWidget *widget, const gchar *path, const GdkRectangle *background_area, const GdkRectangle *cell_area, GtkCellRendererState flags) { PikaCellRendererButton *cell_button = PIKA_CELL_RENDERER_BUTTON (cell); GdkModifierType state = 0; if (event && ((GdkEventAny *) event)->type == GDK_BUTTON_PRESS) state = ((GdkEventButton *) event)->state; if (! event || (((GdkEventAny *) event)->type == GDK_BUTTON_PRESS && ((GdkEventButton *) event)->button == 1)) { pika_cell_renderer_button_clicked (cell_button, path, state); return TRUE; } return FALSE; } /* public functions */ GtkCellRenderer * pika_cell_renderer_button_new (void) { return g_object_new (PIKA_TYPE_CELL_RENDERER_BUTTON, NULL); } void pika_cell_renderer_button_clicked (PikaCellRendererButton *cell, const gchar *path, GdkModifierType state) { g_return_if_fail (PIKA_IS_CELL_RENDERER_BUTTON (cell)); g_return_if_fail (path != NULL); g_signal_emit (cell, button_cell_signals[CLICKED], 0, path, state); }