[Bf-committers] Can someone please tell me what am I missing in this properties panel code
JohnBartle
johnbartle at live.com
Sat Jun 27 06:40:13 CEST 2015
Hello to everyone who reads this.
I am a novice/intermediate programmer and I am trying to figure out how to add a side panel/properties panel to the outliner. I have looked through the functions in the other editor code(e.g. bf_editor_space_graph), and also I have searched through the blame history to see if I can piece together how the other programmers have created properties panels. I just can't seem to find anything other than what I have below.
If anyone would be cool enough to show me what I am missing, what other functions should I be investigating, that would be...... cool!
Below is a .diff file showing the code that I have pieced together so far. I just really really want to know the missing pieces!!! THANKS!!!
====================================================
diff --git a/source/blender/editors/space_outliner/CMakeLists.txt b/source/blender/editors/space_outliner/CMakeLists.txt
index b716f06..3622bb0 100644
--- a/source/blender/editors/space_outliner/CMakeLists.txt
+++ b/source/blender/editors/space_outliner/CMakeLists.txt
@@ -36,8 +36,9 @@ set(INC_SYS
${GLEW_INCLUDE_PATH}
)
set(SRC
+ outliner_buttons.c
outliner_draw.c
outliner_edit.c
outliner_ops.c
outliner_select.c
diff --git a/source/blender/editors/space_outliner/outliner_buttons.c b/source/blender/editors/space_outliner/outliner_buttons.c
new file mode 100644
index 0000000..027e3eb
--- /dev/null
+++ b/source/blender/editors/space_outliner/outliner_buttons.c
@@ -0,0 +1,177 @@
+/*
+* ***** BEGIN GPL LICENSE BLOCK *****
+*
+* 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 2
+* 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, write to the Free Software Foundation,
+* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+*
+* The Original Code is Copyright (C) 2004 Blender Foundation.
+* All rights reserved.
+*
+* The Original Code is: all of this file.
+*
+* Contributor(s): Joshua Leung
+*
+* ***** END GPL LICENSE BLOCK *****
+*/
+
+/** \file blender/editors/space_outliner/outliner_buttons.c
+* \ingroup spoutliner
+*/
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <float.h>
+#include "MEM_guardedalloc.h"
+
+#include "DNA_anim_types.h"
+#include "DNA_armature_types.h"
+#include "DNA_group_types.h"
+#include "DNA_lamp_types.h"
+#include "DNA_material_types.h"
+#include "DNA_mesh_types.h"
+#include "DNA_meta_types.h"
+#include "DNA_scene_types.h"
+#include "DNA_sequence_types.h"
+#include "DNA_world_types.h"
+#include "DNA_object_types.h"
+
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+#include "BLI_ghash.h"
+
+#include "BLF_translation.h"
+
+#include "BKE_animsys.h"
+#include "BKE_context.h"
+#include "BKE_depsgraph.h"
+#include "BKE_fcurve.h"
+#include "BKE_group.h"
+#include "BKE_library.h"
+#include "BKE_main.h"
+#include "BKE_report.h"
+#include "BKE_scene.h"
+#include "BKE_sequencer.h"
+
+#include "BKE_screen.h"
+
+
+#include "ED_armature.h"
+#include "ED_object.h"
+#include "ED_screen.h"
+#include "ED_sequencer.h"
+#include "ED_util.h"
+
+#include "WM_api.h"
+#include "WM_types.h"
+
+#include "UI_interface.h"
+#include "UI_view2d.h"
+
+#include "RNA_access.h"
+#include "RNA_define.h"
+#include "RNA_enum_types.h"
+
+#include "UI_resources.h"
+
+#include "outliner_intern.h"
+
+enum etest {
+ GRAPHKE_SNAP_CFRA = 1,
+ GRAPHKE_SNAP_NEAREST_FRAME,
+ GRAPHKE_SNAP_NEAREST_SECOND,
+ GRAPHKE_SNAP_NEAREST_MARKER,
+ GRAPHKE_SNAP_HORIZONTAL,
+ GRAPHKE_SNAP_VALUE,
+};
+
+
+/* Graph Editor View Settings */
+static void outliner_panel_view(const bContext *C, Panel *pa)
+{
+ bScreen *sc = CTX_wm_screen(C);
+ SpaceOops *sout = CTX_wm_space_outliner(C);
+ Scene *scene = CTX_data_scene(C);
+ PointerRNA spaceptr, sceneptr;
+ uiLayout *col, *sub, *row;
+
+ /* get RNA pointers for use when creating the UI elements */
+ RNA_id_pointer_create(&scene->id, &sceneptr);
+ RNA_pointer_create(&sc->id, &RNA_SpaceOutliner, sout, &spaceptr);
+
+ /* 2D-Cursor */
+ col = uiLayoutColumn(pa->layout, false);
+ uiItemR(col, &spaceptr, "show_cursor", 0, NULL, ICON_NONE);
+
+ sub = uiLayoutColumn(col, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&spaceptr, "show_cursor"));
+ uiItemO(sub, IFACE_("Cursor from Selection"), ICON_NONE, "GRAPH_OT_frame_jump");
+
+ sub = uiLayoutColumn(col, true);
+ uiLayoutSetActive(sub, RNA_boolean_get(&spaceptr, "show_cursor"));
+ row = uiLayoutSplit(sub, 0.7f, true);
+ uiItemR(row, &sceneptr, "frame_current", 0, IFACE_("Cursor X"), ICON_NONE);
+ uiItemEnumO(row, "GRAPH_OT_snap", IFACE_("To Keys"), 0, "type", GRAPHKE_SNAP_CFRA);
+
+ row = uiLayoutSplit(sub, 0.7f, true);
+ uiItemR(row, &spaceptr, "cursor_position_y", 0, IFACE_("Cursor Y"), ICON_NONE);
+ uiItemEnumO(row, "GRAPH_OT_snap", IFACE_("To Keys"), 0, "type", GRAPHKE_SNAP_VALUE);
+}
+
+
+
+
+
+
+
+
+
+/* ******************* general ******************************** */
+void outliner_buttons_register(ARegionType *art)
+{
+ PanelType *pt;
+
+ pt = MEM_callocN(sizeof(PanelType), "spacetype outliner panel view");
+ strcpy(pt->idname, "OUTLINER_PT_view");
+ strcpy(pt->label, N_("View Properties"));
+ strcpy(pt->translation_context, BLF_I18NCONTEXT_DEFAULT_BPYRNA);
+ pt->draw = outliner_panel_view;
+ pt->flag |= PNL_DEFAULT_CLOSED;
+ BLI_addtail(&art->paneltypes, pt);
+
+
+}
+
+static int outliner_properties_toggle_exec(bContext *C, wmOperator *UNUSED(op))
+{
+ ScrArea *sa = CTX_wm_area(C);
+ ARegion *ar = outliner_has_buttons_region(sa);
+
+ if (ar)
+ ED_region_toggle_hidden(C, ar);
+
+ return OPERATOR_FINISHED;
+}
+
+void OUTLINER_OT_properties(wmOperatorType *ot)
+{
+ ot->name = "Properties";
+ ot->idname = "OUTLINER_OT_properties";
+ ot->description = "Toggle display properties panel";
+
+ ot->exec = outliner_properties_toggle_exec;
+ ot->poll = ED_operator_outliner_active;
+
+ /* flags */
+ ot->flag = 0;
+}
\ No newline at end of file
diff --git a/source/blender/editors/space_outliner/outliner_intern.h b/source/blender/editors/space_outliner/outliner_intern.h
index 24842d2..12377b3 100644
--- a/source/blender/editors/space_outliner/outliner_intern.h
+++ b/source/blender/editors/space_outliner/outliner_intern.h
@@ -163,8 +163,13 @@ typedef enum {
/* is the currrent element open? if so we also show children */
#define TSELEM_OPEN(telm, sv) ( (telm->flag & TSE_CLOSED) == 0 || (SEARCHING_OUTLINER(sv) && (telm->flag & TSE_CHILDSEARCH)) )
+/* space_outliner.c -----------------------------------------------*/
+
+struct ARegion *outliner_has_buttons_region(struct ScrArea *sa);
+
+
/* outliner_tree.c ----------------------------------------------- */
void outliner_free_tree(ListBase *lb);
void outliner_cleanup_tree(struct SpaceOops *soops);
@@ -258,8 +263,13 @@ void OUTLINER_OT_action_set(struct wmOperatorType *ot);
void OUTLINER_OT_constraint_operation(struct wmOperatorType *ot);
void OUTLINER_OT_modifier_operation(struct wmOperatorType *ot);
/* ---------------------------------------------------------------- */
+/* outliner_buttons.c -------------------------------------------- */
+
+void OUTLINER_OT_properties(struct wmOperatorType *ot);
+void outliner_buttons_register(struct ARegionType *art);
+
/* outliner_ops.c */
void outliner_operatortypes(void);
void outliner_keymap(struct wmKeyConfig *keyconf);
diff --git a/source/blender/editors/space_outliner/outliner_ops.c b/source/blender/editors/space_outliner/outliner_ops.c
index f586957..1b78152 100644
--- a/source/blender/editors/space_outliner/outliner_ops.c
+++ b/source/blender/editors/space_outliner/outliner_ops.c
@@ -42,8 +42,9 @@
/* ************************** registration **********************************/
void outliner_operatortypes(void)
{
+ WM_operatortype_append(OUTLINER_OT_properties);
WM_operatortype_append(OUTLINER_OT_item_activate);
WM_operatortype_append(OUTLINER_OT_select_border);
WM_operatortype_append(OUTLINER_OT_item_openclose);
WM_operatortype_append(OUTLINER_OT_item_rename);
@@ -88,8 +89,10 @@ void outliner_keymap(wmKeyConfig *keyconf)
{
wmKeyMap *keymap = WM_keymap_find(keyconf, "Outliner", SPACE_OUTLINER, 0);
wmKeyMapItem *kmi;
+ WM_keymap_add_item(keymap, "OUTLINER_OT_properties", NKEY, KM_PRESS, 0, 0);
+
WM_keymap_add_item(keymap, "OUTLINER_OT_item_rename", LEFTMOUSE, KM_DBL_CLICK, 0, 0);
kmi = WM_keymap_add_item(keymap, "OUTLINER_OT_item_activate", LEFTMOUSE, KM_CLICK, 0, 0);
RNA_boolean_set(kmi->ptr, "recursive", false);
diff --git a/source/blender/editors/space_outliner/space_outliner.c b/source/blender/editors/space_outliner/space_outliner.c
index 7b1ec17..46ff57a 100644
--- a/source/blender/editors/space_outliner/space_outliner.c
+++ b/source/blender/editors/space_outliner/space_outliner.c
@@ -61,8 +61,34 @@
#include "outliner_intern.h"
+/* ******************** manage regions ********************* */
+
+ARegion *outliner_has_buttons_region(ScrArea *sa)
+{
+ ARegion *ar, *arnew;
+
+ ar = BKE_area_find_region_type(sa, RGN_TYPE_UI);
+ if (ar) return ar;
+
+ /* add subdiv level; after main */
+ ar = BKE_area_find_region_type(sa, RGN_TYPE_WINDOW);
+
+ /* is error! */
+ if (ar == NULL) return NULL;
+
+ arnew = MEM_callocN(sizeof(ARegion), "buttons for outliner");
+
+ BLI_insertlinkafter(&sa->regionbase, ar, arnew);
+ arnew->regiontype = RGN_TYPE_UI;
+ arnew->alignment = RGN_ALIGN_RIGHT;
+
+ arnew->flag = RGN_FLAG_HIDDEN;
+
+ return arnew;
+}
+
static void outliner_main_area_init(wmWindowManager *wm, ARegion *ar)
{
ListBase *lb;
wmKeyMap *keymap;
@@ -444,8 +470,17 @@ static SpaceLink *outliner_new(const bContext *UNUSED(C))
BLI_addtail(&soutliner->regionbase, ar);
ar->regiontype = RGN_TYPE_HEADER;
ar->alignment = RGN_ALIGN_BOTTOM;
+ /* ui buttons */
+ ar = MEM_callocN(sizeof(ARegion), "buttons area for outlineredit");
+
+ BLI_addtail(&soutliner->regionbase, ar);
+ ar->regiontype = RGN_TYPE_UI;
+ ar->alignment = RGN_ALIGN_RIGHT;
+ ar->flag = RGN_FLAG_HIDDEN;
+
+
/* main area */
ar = MEM_callocN(sizeof(ARegion), "main area for outliner");
BLI_addtail(&soutliner->regionbase, ar);
@@ -485,8 +520,86 @@ static SpaceLink *outliner_duplicate(SpaceLink *sl)
return (SpaceLink *)soutlinern;
}
+
+static void outliner_buttons_area_init(wmWindowManager *wm, ARegion *ar)
+{
+ wmKeyMap *keymap;
+
+ ED_region_panels_init(wm, ar);
+
+ keymap = WM_keymap_find(wm->defaultconf, "Outliner Editor Generic", SPACE_OUTLINER, 0);
+ WM_event_add_keymap_handler_bb(&ar->handlers, keymap, &ar->v2d.mask, &ar->winrct);
+}
+
+
+static void outliner_buttons_area_draw(const bContext *C, ARegion *ar)
+{
+ ED_region_panels(C, ar, 1, NULL, -1);
+}
+
+//These case statements are cut-and-paste and they need to be looked over
+static void outliner_region_listener(bScreen *UNUSED(sc), ScrArea *UNUSED(sa), ARegion *ar, wmNotifier *wmn)
+{
+ //ED_region_tag_redraw(ar);//None of the other ED_region_tag_redraw() are called for now...
+ /* context changes */
+ switch (wmn->category) {
+ case NC_ANIMATION:
+ ED_region_tag_redraw(ar);
+ break;
+ case NC_SCENE:
+ switch (wmn->data) {
+ case ND_RENDER_OPTIONS:
+ case ND_OB_ACTIVE:
+ case ND_FRAME:
+ case ND_MARKERS:
+ ED_region_tag_redraw(ar);
+ break;
+ case ND_SEQUENCER:
+ if (wmn->action == NA_SELECTED)
+ ED_region_tag_redraw(ar);
+ break;
+
+ }
+ break;
+ case NC_OBJECT:
+ switch (wmn->data) {
+ case ND_BONE_ACTIVE:
+ case ND_BONE_SELECT:
+ case ND_KEYS:
+ ED_region_tag_redraw(ar);
+ break;
+ case ND_MODIFIER:
+ if (wmn->action == NA_RENAME)
+ ED_region_tag_redraw(ar);
+ break;
+
+ }
+ break;
+ case NC_NODE:
+ switch (wmn->action) {
+ case NA_EDITED:
+ case NA_SELECTED:
+ ED_region_tag_redraw(ar);
+ break;
+
+ }
+ break;
+ case NC_ID:
+ if (wmn->action == NA_RENAME)
+ ED_region_tag_redraw(ar);
+ break;
+ default:
+ if (wmn->data == ND_KEYS)
+ ED_region_tag_redraw(ar);
+ break;
+
+
+ }
+}
+
+
/* only called once, from space_api/spacetypes.c */
void ED_spacetype_outliner(void)
{
SpaceType *st = MEM_callocN(sizeof(SpaceType), "spacetype time");
@@ -525,7 +638,21 @@ void ED_spacetype_outliner(void)
art->free = outliner_header_area_free;
art->listener = outliner_header_area_listener;
BLI_addhead(&st->regiontypes, art);
+ /* regions: UI buttons */
+ art = MEM_callocN(sizeof(ARegionType), "spacetype outliner region");
+ art->regionid = RGN_TYPE_UI;
+ art->prefsizex = 200;
+ art->keymapflag = ED_KEYMAP_UI;
+ art->init = outliner_buttons_area_init;
+ art->draw = outliner_buttons_area_draw;
+ art->listener = outliner_region_listener;
+
+ BLI_addhead(&st->regiontypes, art);
+
+ outliner_buttons_register(art);
+
+
BKE_spacetype_register(st);
}
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
More information about the Bf-committers
mailing list