Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
modulegroups.c File Reference
#include "bauhaus/bauhaus.h"
#include "common/darktable.h"
#include "common/debug.h"
#include "common/image_cache.h"
#include "common/iop_order.h"
#include "control/conf.h"
#include "control/control.h"
#include "control/signal.h"
#include "develop/develop.h"
#include "develop/imageop.h"
#include "gui/gtk.h"
#include "libs/lib.h"
#include "libs/lib_api.h"
+ Include dependency graph for modulegroups.c:

Data Structures

struct  dt_lib_modulegroups_t
 

Macros

#define DT_IOP_ORDER_INFO   (darktable.unmuted & DT_DEBUG_IOPORDER)
 

Typedefs

typedef enum dt_modulesgroups_tabs_t dt_modulesgroups_tabs_t
 
typedef enum dt_modulesgroups_basic_sections_t dt_modulesgroups_basic_sections_t
 
typedef struct dt_lib_modulegroups_t dt_lib_modulegroups_t
 
typedef enum dt_modulegroups_dnd_target_t dt_modulegroups_dnd_target_t
 

Enumerations

enum  dt_modulesgroups_tabs_t {
  MOD_TAB_ACTIVE = 0 ,
  MOD_TAB_BASIC = 1 ,
  MOD_TAB_REPAIR = 2 ,
  MOD_TAB_SHARPNESS = 3 ,
  MOD_TAB_EFFECTS = 4 ,
  MOD_TAB_TECHNICAL = 5 ,
  MOD_TAB_ALL = 6 ,
  MOD_TAB_LAST
}
 
enum  dt_modulesgroups_basic_sections_t {
  TAB_BASIC_COLOR = 0 ,
  TAB_BASIC_FILM = 1 ,
  TAB_BASIC_TONES = 2 ,
  TAB_BASIC_LAST
}
 
enum  dt_modulegroups_dnd_target_t { DT_MODULEGROUPS_DND_TARGET_IOP = 0 }
 

Functions

static dt_modulesgroups_tabs_t _group_to_tab (dt_iop_group_t group)
 
static void _switch_page (GtkNotebook *notebook, GtkWidget *page, guint page_num, gpointer user_data)
 
static gboolean _update_iop_visibility (gpointer user_data)
 
static void _lib_modulegroups_signal_set (gpointer instance, gpointer module, gpointer user_data)
 
static void _lib_modulegroups_refresh (gpointer instance, gpointer user_data)
 
static gboolean _is_module_in_history (const dt_iop_module_t *module)
 
static void _modulegroups_setup_drag_source (dt_lib_module_t *self, dt_iop_module_t *module)
 Attach the module drag source handlers once to an expander widget.
 
static gboolean _modulegroups_reorder_target (GtkWidget *target)
 Reorder one page or subgroup container to match reverse pipeline order.
 
static void _modulegroups_sync_section_label_margins (dt_lib_modulegroups_t *d)
 Align the basic-tab section labels with the module expander margins.
 
static void _modulegroups_clear_drop_state (dt_lib_modulegroups_t *d)
 Remove all drag-and-drop visual feedback from module headers.
 
static void _modulegroups_append_visible_expanders (GtkWidget *widget, GList **widgets)
 Append visible module expanders in display order from a page subtree.
 
static dt_iop_module_t_modulegroups_get_dnd_dest_module (GtkWidget *page, const gint y, dt_iop_module_t *module_src)
 Find the module header under the current drop position.
 
static void _modulegroups_drag_begin (GtkWidget *widget, GdkDragContext *context, gpointer user_data)
 
static void _modulegroups_drag_end (GtkWidget *widget, GdkDragContext *context, gpointer user_data)
 
static void _modulegroups_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer user_data)
 
static gboolean _modulegroups_drag_drop (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint time, gpointer user_data)
 
static gboolean _modulegroups_drag_motion (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, guint time, gpointer user_data)
 
static void _modulegroups_drag_data_received (GtkWidget *widget, GdkDragContext *dc, gint x, gint y, GtkSelectionData *selection_data, guint info, guint time, gpointer user_data)
 
static void _modulegroups_drag_leave (GtkWidget *widget, GdkDragContext *dc, guint time, gpointer user_data)
 
static void _modulegroups_track_widget (GtkWidget **slot, GtkWidget *widget)
 
static void _ensure_page_widgets (dt_lib_module_t *self)
 
dt_modulesgroups_tabs_t _modulegroups_cycle_tabs (int tab)
 
static dt_modulesgroups_tabs_t _get_current_tab (dt_lib_module_t *self)
 
static void _set_current_tab (dt_lib_module_t *self, dt_modulesgroups_tabs_t tab)
 
static void _set_current_tab_from_module_group (dt_lib_module_t *self, dt_iop_group_t group)
 
static gboolean _is_module_in_tab (dt_iop_module_t *module, dt_modulesgroups_tabs_t current_tab)
 
static GtkWidget_get_target_container (dt_lib_module_t *self, const dt_iop_module_t *module)
 Return the GtkBox currently hosting a module for the active tab.
 
const char * name (struct dt_lib_module_t *self)
 
const char ** views (dt_lib_module_t *self)
 
uint32_t container (dt_lib_module_t *self)
 
int expandable (dt_lib_module_t *self)
 
int position ()
 
static gboolean _modulegroups_switch_tab_next (GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
 
static gboolean _modulegroups_switch_tab_previous (GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer data)
 
static gboolean _scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data)
 
static void _focus_module (dt_iop_module_t *module)
 
static dt_iop_module_t_find_first_visible_module (dt_lib_module_t *self)
 
static dt_iop_module_t_find_last_visible_module (dt_lib_module_t *self)
 
static gboolean _focus_previous_module (GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer user_data)
 
static gboolean _focus_next_module (GtkAccelGroup *accel_group, GObject *accelerable, guint keyval, GdkModifierType modifier, gpointer user_data)
 
static gboolean _is_valid_widget (GtkWidget *widget)
 
static GList * _find_next_visible_widget (GList *widgets)
 
static GList * _find_previous_visible_widget (GList *widgets)
 
static void _focus_widget (GtkWidget *widget)
 
static gboolean _focus_next_control ()
 
static gboolean _focus_previous_control ()
 
void gui_init (dt_lib_module_t *self)
 
static gboolean _modulegroups_move_widget (GtkWidget *widget, GtkWidget *target)
 
void gui_cleanup (dt_lib_module_t *self)
 

Variables

static const GtkTargetEntry _modulegroups_target_list []
 
static const guint _modulegroups_n_targets = G_N_ELEMENTS(_modulegroups_target_list)
 

Macro Definition Documentation

◆ DT_IOP_ORDER_INFO

#define DT_IOP_ORDER_INFO   (darktable.unmuted & DT_DEBUG_IOPORDER)

Typedef Documentation

◆ dt_lib_modulegroups_t

◆ dt_modulegroups_dnd_target_t

◆ dt_modulesgroups_basic_sections_t

◆ dt_modulesgroups_tabs_t

Enumeration Type Documentation

◆ dt_modulegroups_dnd_target_t

Enumerator
DT_MODULEGROUPS_DND_TARGET_IOP 

◆ dt_modulesgroups_basic_sections_t

Enumerator
TAB_BASIC_COLOR 
TAB_BASIC_FILM 
TAB_BASIC_TONES 
TAB_BASIC_LAST 

◆ dt_modulesgroups_tabs_t

Enumerator
MOD_TAB_ACTIVE 
MOD_TAB_BASIC 
MOD_TAB_REPAIR 
MOD_TAB_SHARPNESS 
MOD_TAB_EFFECTS 
MOD_TAB_TECHNICAL 
MOD_TAB_ALL 
MOD_TAB_LAST 

Function Documentation

◆ _ensure_page_widgets()

◆ _find_first_visible_module()

static dt_iop_module_t * _find_first_visible_module ( dt_lib_module_t self)
static

◆ _find_last_visible_module()

static dt_iop_module_t * _find_last_visible_module ( dt_lib_module_t self)
static

◆ _find_next_visible_widget()

static GList * _find_next_visible_widget ( GList *  widgets)
static

References _is_valid_widget().

Referenced by _focus_next_control().

◆ _find_previous_visible_widget()

static GList * _find_previous_visible_widget ( GList *  widgets)
static

References _is_valid_widget().

Referenced by _focus_previous_control().

◆ _focus_module()

◆ _focus_next_control()

◆ _focus_next_module()

static gboolean _focus_next_module ( GtkAccelGroup *  accel_group,
GObject *  accelerable,
guint  keyval,
GdkModifierType  modifier,
gpointer  user_data 
)
static

◆ _focus_previous_control()

◆ _focus_previous_module()

static gboolean _focus_previous_module ( GtkAccelGroup *  accel_group,
GObject *  accelerable,
guint  keyval,
GdkModifierType  modifier,
gpointer  user_data 
)
static

◆ _focus_widget()

static void _focus_widget ( GtkWidget widget)
static

◆ _get_current_tab()

◆ _get_target_container()

static GtkWidget * _get_target_container ( dt_lib_module_t self,
const dt_iop_module_t module 
)
static

Return the GtkBox currently hosting a module for the active tab.

The basic tab splits its modules into three subgroup containers, while the other tabs each own a single page box.

Parameters
dModulegroups runtime data.
moduleModule whose container is requested.
Returns
Target GtkWidget container, or NULL when the current tab should not host it.

References _get_current_tab(), d, dt_lib_module_t::data, IOP_GROUP_COLOR, IOP_GROUP_FILM, IOP_GROUP_TONES, IS_NULL_PTR, MOD_TAB_BASIC, TAB_BASIC_COLOR, TAB_BASIC_FILM, and TAB_BASIC_TONES.

Referenced by _update_iop_visibility().

◆ _group_to_tab()

◆ _is_module_in_history()

static gboolean _is_module_in_history ( const dt_iop_module_t module)
static

◆ _is_module_in_tab()

◆ _is_valid_widget()

static gboolean _is_valid_widget ( GtkWidget widget)
static

◆ _lib_modulegroups_refresh()

static void _lib_modulegroups_refresh ( gpointer  instance,
gpointer  user_data 
)
static

References _update_iop_visibility().

Referenced by gui_cleanup(), and gui_init().

◆ _lib_modulegroups_signal_set()

static void _lib_modulegroups_signal_set ( gpointer  instance,
gpointer  module,
gpointer  user_data 
)
static

◆ _modulegroups_append_visible_expanders()

static void _modulegroups_append_visible_expanders ( GtkWidget widget,
GList **  widgets 
)
static

Append visible module expanders in display order from a page subtree.

The basic tab nests its sections inside extra boxes, so drag-and-drop must recurse through the visible widget tree and keep only actual module expanders.

Parameters
widgetCurrent widget in the page subtree.
widgetsOutput list collecting expanders in display order.

References _modulegroups_append_visible_expanders().

Referenced by _modulegroups_append_visible_expanders(), and _modulegroups_get_dnd_dest_module().

◆ _modulegroups_clear_drop_state()

static void _modulegroups_clear_drop_state ( dt_lib_modulegroups_t d)
static

Remove all drag-and-drop visual feedback from module headers.

Modulegroups owns the containers hosting the module expanders, so it also owns the temporary drop markers shown while reordering the list.

Parameters
dModulegroups runtime data.

References d, darktable, darktable_t::develop, dt_gui_remove_class(), dt_develop_t::iop, and IS_NULL_PTR.

Referenced by _modulegroups_drag_begin(), _modulegroups_drag_data_received(), _modulegroups_drag_end(), _modulegroups_drag_leave(), _modulegroups_drag_motion(), and gui_cleanup().

◆ _modulegroups_cycle_tabs()

◆ _modulegroups_drag_begin()

◆ _modulegroups_drag_data_get()

static void _modulegroups_drag_data_get ( GtkWidget widget,
GdkDragContext *  context,
GtkSelectionData *  selection_data,
guint  info,
guint  time,
gpointer  user_data 
)
static

References TRUE.

Referenced by _modulegroups_setup_drag_source().

◆ _modulegroups_drag_data_received()

static void _modulegroups_drag_data_received ( GtkWidget widget,
GdkDragContext *  dc,
gint  x,
gint  y,
GtkSelectionData *  selection_data,
guint  info,
guint  time,
gpointer  user_data 
)
static

◆ _modulegroups_drag_drop()

static gboolean _modulegroups_drag_drop ( GtkWidget widget,
GdkDragContext *  dc,
gint  x,
gint  y,
guint  time,
gpointer  user_data 
)
static

References TRUE.

Referenced by _ensure_page_widgets().

◆ _modulegroups_drag_end()

static void _modulegroups_drag_end ( GtkWidget widget,
GdkDragContext *  context,
gpointer  user_data 
)
static

◆ _modulegroups_drag_leave()

static void _modulegroups_drag_leave ( GtkWidget widget,
GdkDragContext *  dc,
guint  time,
gpointer  user_data 
)
static

◆ _modulegroups_drag_motion()

◆ _modulegroups_get_dnd_dest_module()

static dt_iop_module_t * _modulegroups_get_dnd_dest_module ( GtkWidget page,
const gint  y,
dt_iop_module_t module_src 
)
static

Find the module header under the current drop position.

The y coordinate is relative to the page widget receiving the drop event. We translate each visible module expander into that same coordinate space so reordering keeps working across nested section containers.

Parameters
pageVisible modulegroups page handling the drag.
yDrop coordinate in the page reference frame.
module_srcDrag source module.
Returns
Destination module under the drop position, or NULL.

References _modulegroups_append_visible_expanders(), dt_iop_module_t::expander, FALSE, dt_iop_module_t::header, and TRUE.

Referenced by _modulegroups_drag_data_received(), and _modulegroups_drag_motion().

◆ _modulegroups_move_widget()

static gboolean _modulegroups_move_widget ( GtkWidget widget,
GtkWidget target 
)
static

References FALSE, and TRUE.

Referenced by _update_iop_visibility(), and gui_cleanup().

◆ _modulegroups_reorder_target()

static gboolean _modulegroups_reorder_target ( GtkWidget target)
static

Reorder one page or subgroup container to match reverse pipeline order.

We walk the whole pipeline from last to first and keep only expanders whose current parent is the requested container. This keeps the GUI order consistent regardless of the active tab layout.

Parameters
targetPage or subgroup container to reorder.
Returns
TRUE when at least one visible module ended up in that container.

References darktable, darktable_t::develop, dt_iop_is_hidden(), FALSE, dt_develop_t::iop, position(), and TRUE.

Referenced by _update_iop_visibility().

◆ _modulegroups_setup_drag_source()

static void _modulegroups_setup_drag_source ( dt_lib_module_t self,
dt_iop_module_t module 
)
static

Attach the module drag source handlers once to an expander widget.

Modulegroups owns module reordering in the darkroom panel, so it also owns the drag source registration for every visible expander.

Parameters
selfModulegroups lib module.
moduleModule whose expander should become draggable.

References _modulegroups_drag_begin(), _modulegroups_drag_data_get(), _modulegroups_drag_end(), _modulegroups_n_targets, _modulegroups_target_list, and TRUE.

Referenced by _update_iop_visibility().

◆ _modulegroups_switch_tab_next()

static gboolean _modulegroups_switch_tab_next ( GtkAccelGroup *  accel_group,
GObject *  accelerable,
guint  keyval,
GdkModifierType  modifier,
gpointer  data 
)
static

◆ _modulegroups_switch_tab_previous()

static gboolean _modulegroups_switch_tab_previous ( GtkAccelGroup *  accel_group,
GObject *  accelerable,
guint  keyval,
GdkModifierType  modifier,
gpointer  data 
)
static

◆ _modulegroups_sync_section_label_margins()

static void _modulegroups_sync_section_label_margins ( dt_lib_modulegroups_t d)
static

Align the basic-tab section labels with the module expander margins.

The section label border is drawn on the label widget itself. To make that border line start and end exactly where module boxes do, we copy the current expander margins from the first available module widget.

Parameters
dModulegroups runtime data.

References darktable, darktable_t::develop, dt_iop_is_hidden(), and dt_develop_t::iop.

Referenced by _update_iop_visibility().

◆ _modulegroups_track_widget()

static void _modulegroups_track_widget ( GtkWidget **  slot,
GtkWidget widget 
)
static

Referenced by _ensure_page_widgets().

◆ _scroll_event()

static gboolean _scroll_event ( GtkWidget widget,
GdkEventScroll *  event,
gpointer  user_data 
)
static

◆ _set_current_tab()

◆ _set_current_tab_from_module_group()

static void _set_current_tab_from_module_group ( dt_lib_module_t self,
dt_iop_group_t  group 
)
static

◆ _switch_page()

static void _switch_page ( GtkNotebook *  notebook,
GtkWidget page,
guint  page_num,
gpointer  user_data 
)
static

◆ _update_iop_visibility()

◆ container()

uint32_t container ( dt_lib_module_t self)

◆ expandable()

int expandable ( dt_lib_module_t self)

◆ gui_cleanup()

◆ gui_init()

◆ name()

const char * name ( struct dt_lib_module_t self)

◆ position()

int position ( )

◆ views()

const char ** views ( dt_lib_module_t self)

References v.

Variable Documentation

◆ _modulegroups_n_targets

const guint _modulegroups_n_targets = G_N_ELEMENTS(_modulegroups_target_list)
static

◆ _modulegroups_target_list

const GtkTargetEntry _modulegroups_target_list[]
static
Initial value:
= {
{ "iop", GTK_TARGET_SAME_APP, DT_MODULEGROUPS_DND_TARGET_IOP }
}
@ DT_MODULEGROUPS_DND_TARGET_IOP
Definition modulegroups.c:127

Referenced by _ensure_page_widgets(), and _modulegroups_setup_drag_source().