static gboolean _lib_plugin_header_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data) { if(e->type == GDK_2BUTTON_PRESS || e->type == GDK_3BUTTON_PRESS) return TRUE; dt_lib_module_t *module = (dt_lib_module_t *)user_data; if(e->button == 1) { /* bail out if module is static */ if(!module->expandable(module)) return FALSE; // make gtk scroll to the module once it updated its allocation size uint32_t container = module->container(module); if(dt_conf_get_bool("lighttable/ui/scroll_to_module")) { if(container == DT_UI_CONTAINER_PANEL_LEFT_CENTER) darktable.gui->scroll_to[0] = module->expander; else if(container == DT_UI_CONTAINER_PANEL_RIGHT_CENTER) darktable.gui->scroll_to[1] = module->expander; } /* handle shiftclick on expander, hide all except this */ if(!dt_conf_get_bool("lighttable/ui/single_module") != !(e->state & GDK_SHIFT_MASK)) { GList *it = g_list_first(darktable.lib->plugins); const dt_view_t *v = dt_view_manager_get_current_view(darktable.view_manager); gboolean all_other_closed = TRUE; while(it) { dt_lib_module_t *m = (dt_lib_module_t *)it->data; if(m != module && container == m->container(module) && m->expandable(module) && (m->views(module) & v->view(v))) { all_other_closed = all_other_closed && !dtgtk_expander_get_expanded(DTGTK_EXPANDER(m->expander)); dt_lib_gui_set_expanded(m, FALSE); } it = g_list_next(it); } if(all_other_closed) dt_lib_gui_set_expanded(module, !dtgtk_expander_get_expanded(DTGTK_EXPANDER(module->expander))); else dt_lib_gui_set_expanded(module, TRUE); } else { /* else just toggle */ dt_lib_gui_set_expanded(module, !dtgtk_expander_get_expanded(DTGTK_EXPANDER(module->expander))); } return TRUE; } else if(e->button == 2) { /* show preset popup if any preset for module */ return TRUE; } return FALSE; }
static gboolean _lib_plugin_header_button_press(GtkWidget *w, GdkEventButton *e, gpointer user_data) { dt_lib_module_t *module = (dt_lib_module_t *)user_data; if (e->button == 1) { /* bail out if module is static */ if(!module->expandable()) return FALSE; /* handle shiftclick on expander, hide all except this */ if (!dt_conf_get_bool("lighttable/ui/single_module") != !(e->state & GDK_SHIFT_MASK)) { GList *it = g_list_first(darktable.lib->plugins); uint32_t container = module->container(); dt_view_t *v = darktable.view_manager->view + darktable.view_manager->current_view; gboolean all_other_closed = TRUE; while (it) { dt_lib_module_t *m = (dt_lib_module_t *)it->data; if(m != module && container == m->container() && m->expandable() && (m->views() & v->view(v))) { all_other_closed = all_other_closed && !gtk_widget_get_visible(m->widget); dt_lib_gui_set_expanded(m, FALSE); } it = g_list_next(it); } if(all_other_closed) dt_lib_gui_set_expanded(module, !gtk_widget_get_visible(module->widget)); else dt_lib_gui_set_expanded(module, TRUE); } else { /* else just toggle */ dt_lib_gui_set_expanded(module, !gtk_widget_get_visible(module->widget)); } return TRUE; } else if (e->button == 2) { /* show preset popup if any preset for module */ return TRUE; } return FALSE; }
static int expanded_member(lua_State *L) { dt_lib_module_t *module = *(dt_lib_module_t **)lua_touserdata(L, 1); if(lua_gettop(L) != 3) { lua_pushboolean(L, module->expandable()); return 1; } else { dt_lib_gui_set_expanded(module, lua_toboolean(L, 3)); return 0; } }
int dt_view_manager_switch (dt_view_manager_t *vm, int k) { // Before switching views, restore accelerators if disabled if(!darktable.control->key_accelerators_on) dt_control_key_accelerators_on(darktable.control); // destroy old module list int error = 0; dt_view_t *v = vm->view + vm->current_view; /* Special case when entering nothing (just before leaving dt) */ if ( k==DT_MODE_NONE ) { /* iterator plugins and cleanup plugins in current view */ GList *plugins = g_list_last(darktable.lib->plugins); while (plugins) { dt_lib_module_t *plugin = (dt_lib_module_t *)(plugins->data); if (!plugin->views) fprintf(stderr,"module %s doesnt have views flags\n",plugin->name()); /* does this module belong to current view ?*/ if (plugin->views() & v->view(v) ) { plugin->gui_cleanup(plugin); dt_accel_disconnect_list(plugin->accel_closures); plugin->accel_closures = NULL; } /* get next plugin */ plugins = g_list_previous(plugins); } /* leave the current view*/ if(vm->current_view >= 0 && v->leave) v->leave(v); /* remove all widets in all containers */ for(int l=0;l<DT_UI_CONTAINER_SIZE;l++) dt_ui_container_clear(darktable.gui->ui, l); vm->current_view = -1 ; return 0 ; } int newv = vm->current_view; if (k < vm->num_views) newv = k; dt_view_t *nv = vm->view + newv; if (nv->try_enter) error = nv->try_enter(nv); if (!error) { GList *plugins; /* cleanup current view before initialization of new */ if (vm->current_view >=0) { /* leave current view */ if(v->leave) v->leave(v); dt_accel_disconnect_list(v->accel_closures); v->accel_closures = NULL; /* iterator plugins and cleanup plugins in current view */ plugins = g_list_last(darktable.lib->plugins); while (plugins) { dt_lib_module_t *plugin = (dt_lib_module_t *)(plugins->data); if (!plugin->views) fprintf(stderr,"module %s doesnt have views flags\n",plugin->name()); /* does this module belong to current view ?*/ if (plugin->views() & v->view(v) ) { plugin->gui_cleanup(plugin); dt_accel_disconnect_list(plugin->accel_closures); plugin->accel_closures = NULL; } /* get next plugin */ plugins = g_list_previous(plugins); } /* remove all widets in all containers */ for(int l=0;l<DT_UI_CONTAINER_SIZE;l++) dt_ui_container_clear(darktable.gui->ui, l); } /* change current view to the new view */ vm->current_view = newv; /* restore visible stat of panels for the new view */ dt_ui_restore_panels(darktable.gui->ui); /* lets add plugins related to new view into panels */ plugins = g_list_last(darktable.lib->plugins); while (plugins) { dt_lib_module_t *plugin = (dt_lib_module_t *)(plugins->data); if( plugin->views() & nv->view(v) ) { /* module should be in this view, lets initialize */ plugin->gui_init(plugin); /* try get the module expander */ GtkWidget *w = NULL; w = dt_lib_gui_get_expander(plugin); if(plugin->connect_key_accels) plugin->connect_key_accels(plugin); dt_lib_connect_common_accels(plugin); /* if we dont got an expander lets add the widget */ if (!w) w = plugin->widget; /* add module to it's container */ dt_ui_container_add_widget(darktable.gui->ui, plugin->container(), w); } /* lets get next plugin */ plugins = g_list_previous(plugins); } /* hide/show modules as last config */ plugins = g_list_last(darktable.lib->plugins); while (plugins) { dt_lib_module_t *plugin = (dt_lib_module_t *)(plugins->data); if(plugin->views() & nv->view(v)) { /* set expanded if last mode was that */ char var[1024]; gboolean expanded = FALSE; gboolean visible = dt_lib_is_visible(plugin); if (plugin->expandable()) { snprintf(var, 1024, "plugins/lighttable/%s/expanded", plugin->plugin_name); expanded = dt_conf_get_bool(var); /* show expander if visible */ if(visible) { gtk_widget_show_all(GTK_WIDGET(plugin->expander)); // gtk_widget_show_all(plugin->widget); } else { gtk_widget_hide(GTK_WIDGET(plugin->expander)); // gtk_widget_hide_all(plugin->widget); } dt_lib_gui_set_expanded(plugin, expanded); } else { /* show/hide plugin widget depending on expanded flag or if plugin not is expandeable() */ if(visible) gtk_widget_show_all(plugin->widget); else gtk_widget_hide_all(plugin->widget); } } /* lets get next plugin */ plugins = g_list_previous(plugins); } /* enter view. crucially, do this before initing the plugins below, as e.g. modulegroups requires the dr stuff to be inited. */ if(newv >= 0 && nv->enter) nv->enter(nv); if(newv >= 0 && nv->connect_key_accels) nv->connect_key_accels(nv); /* raise view changed signal */ dt_control_signal_raise(darktable.signals, DT_SIGNAL_VIEWMANAGER_VIEW_CHANGED); /* add endmarkers to left and right center containers */ GtkWidget *endmarker = gtk_drawing_area_new(); dt_ui_container_add_widget(darktable.gui->ui, DT_UI_CONTAINER_PANEL_LEFT_CENTER, endmarker); g_signal_connect (G_OBJECT (endmarker), "expose-event", G_CALLBACK (dt_control_expose_endmarker), 0); gtk_widget_set_size_request(endmarker, -1, 50); gtk_widget_show(endmarker); endmarker = gtk_drawing_area_new(); dt_ui_container_add_widget(darktable.gui->ui, DT_UI_CONTAINER_PANEL_RIGHT_CENTER, endmarker); g_signal_connect (G_OBJECT (endmarker), "expose-event", G_CALLBACK (dt_control_expose_endmarker), (gpointer)1); gtk_widget_set_size_request(endmarker, -1, 50); gtk_widget_show(endmarker); } return error; }