This file is indexed.

/usr/share/openscenegraph/examples/osgwidgetaddremove/osgwidgetaddremove.cpp is in openscenegraph-examples 3.2.0~rc1-4.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
// -*-c++-*- osgWidget - Code by: Jeremy Moles (cubicool) 2007-2008
// $Id: osgwidgetaddremove.cpp 45 2008-04-23 16:46:11Z cubicool $

#include <osgWidget/Util>
#include <osgWidget/WindowManager>
#include <osgWidget/Table>
#include <osgWidget/Box>
#include <osgWidget/Label>

const unsigned int MASK_2D = 0xF0000000;

class ABCWidget: public osgWidget::Label {
public:
    ABCWidget(const std::string& label):
    osgWidget::Label("", label) {
        setFont("fonts/Vera.ttf");
        setFontSize(20);
        setCanFill(true);
        setShadow(0.08f);
        addSize(10.0f, 10.0f);
    }
};

class Button: public osgWidget::Label {
public:
    Button(const std::string& label):
    osgWidget::Label("", label) {
        setFont("fonts/Vera.ttf");
        setFontSize(30);
        setColor(0.8f, 0.2f, 0.2f, 0.8f);
        setCanFill(true);
        setShadow(0.1f);
        setEventMask(osgWidget::EVENT_MASK_MOUSE_CLICK);
        addSize(20.0f, 20.0f);
    }

    // NOTE! I need to make it clearer than Push/Release can happen so fast that
    // the changes you make aren't visible with your refresh rate. Throttling state
    // changes and what-have-you on mousePush/mouseRelease/etc. is going to be
    // annoying...

    virtual bool mousePush(double, double, const osgWidget::WindowManager*) {
        addColor(0.2f, 0.2f, 0.2f, 0.0f);
        
        return true;
    }

    virtual bool mouseRelease(double, double, const osgWidget::WindowManager*) {
        addColor(-0.2f, -0.2f, -0.2f, 0.0f);
        
        return true;
    }
};

class AddRemove: public osgWidget::Box {
    osg::ref_ptr<osgWidget::Window> _win1;

public:
    AddRemove():
    osgWidget::Box ("buttons", osgWidget::Box::VERTICAL),
    _win1          (new osgWidget::Box("win1", osgWidget::Box::VERTICAL)) {
        addWidget(new Button("Add Widget"));
        addWidget(new Button("Remove Widget"));

        // Take special note here! Not only do the Button objects have their
        // own overridden methods for changing the color, but they have attached
        // callbacks for doing the work with local data.
        getByName("Widget_1")->addCallback(new osgWidget::Callback(
            &AddRemove::handlePressAdd,
            this,
            osgWidget::EVENT_MOUSE_PUSH
        ));

        getByName("Widget_2")->addCallback(new osgWidget::Callback(
            &AddRemove::handlePressRemove,
            this,
            osgWidget::EVENT_MOUSE_PUSH
        ));
    }

    virtual void managed(osgWidget::WindowManager* wm) {
        osgWidget::Box::managed(wm);

        _win1->setOrigin(250.0f, 0.0f);

        wm->addChild(_win1.get());
    }

    bool handlePressAdd(osgWidget::Event& ev) {
        static unsigned int num = 0;

        std::stringstream ss;

        ss << "a random widget " << num;

        _win1->addWidget(new ABCWidget(ss.str()));

        num++;

        return true;
    }

    bool handlePressRemove(osgWidget::Event& ev) {
        // TODO: Temporary hack!
        const osgWidget::Box::Vector& v = _win1->getObjects();
    
        if(!v.size()) return false;

        osgWidget::Widget* w = _win1->getObjects()[v.size() - 1].get();

        _win1->removeWidget(w);

        return true;
    }
};

int main(int argc, char** argv) {
    osgViewer::Viewer viewer;

    osgWidget::WindowManager* wm = new osgWidget::WindowManager(
        &viewer,
        1280.0f,
        1024.0f,
        MASK_2D
    );
    
    osgWidget::Box* buttons = new AddRemove();

    wm->addChild(buttons);

    return createExample(viewer, wm);
}