coco2d-x create tableView
*.h
#ifndef __MUSICLAYER_H__ #define __MUSICLAYER_H__ #include "cocos2d.h" #include "cocos/ui/UIButton.h" #include "cocos/ui/UIEditBox/UIEditBox.h" #include "extensions/GUI/CCScrollView/CCTableView.h" #include "SimpleAudioEngine.h" #include <vector> using namespace cocos2d; using namespace ui; using namespace CocosDenshion; using namespace extension; using namespace std; class CustomTableViewCell : public TableViewCell { public: virtual void draw(cocos2d::Renderer *renderer, const cocos2d::Mat4 &transform, uint32_t flags) override; }; class MusicLayer:public LayerColor, EditBoxDelegate, TableViewDataSource, TableViewDelegate { int m_TableNum = 0; vector<string> m_ListPath; public: void inits(); void free(); MusicLayer(); ~MusicLayer(); private: void OnCallback(cocos2d::Ref* pSender); virtual bool onTouchBegan(Touch *touch, Event *unused_event) override; virtual void editBoxEditingDidBegin(EditBox* editBox)override; CC_DEPRECATED_ATTRIBUTE virtual void editBoxEditingDidEnd(EditBox* editBox)override; virtual void editBoxTextChanged(EditBox* editBox, const std::string& text)override; virtual void editBoxReturn(EditBox* editBox)override; virtual void editBoxEditingDidEndWithAction(EditBox* editBox, EditBoxDelegate::EditBoxEndAction action)override; virtual void scrollViewDidScroll(ScrollView* view) override {} virtual void scrollViewDidZoom(ScrollView* view) override {} virtual void tableCellTouched(TableView* table, TableViewCell* cell)override; virtual Size tableCellSizeForIndex(TableView *table, ssize_t idx)override; virtual TableViewCell* tableCellAtIndex(TableView *table, ssize_t idx)override; virtual ssize_t numberOfCellsInTableView(TableView *table)override; private: void initFileSearchPathLayer(); void initPlayLayer(); void initTableView(); void refreshCellItem(Ref*node,ssize_t idx); }; #endif // !__MUSICLAYER_H__
*.cpp
#include "MusicLayer.h" //using namespace cocos2d; //using namespace ui; //using namespace CocosDenshion; //using namespace std; #define DISPLAY Director::getInstance()->getVisibleSize() #define displayex Director::getInstance()->getVisibleSize() MusicLayer::MusicLayer() { this->inits(); } MusicLayer::~MusicLayer() { this->free(); } void MusicLayer::free() { } void MusicLayer::inits() { log("MusicLayer init"); this->setTouchEnabled(true); auto ELTOBO = EventListenerTouchOneByOne::create(); ELTOBO->setSwallowTouches(true); ELTOBO->onTouchBegan = std::move(std::bind(&MusicLayer::onTouchBegan, this, std::placeholders::_1, std::placeholders::_2)); this->getEventDispatcher()->addEventListenerWithSceneGraphPriority(ELTOBO, this); //this->getEventDispatcher()->addEventListenerWithFixedPriority(); //this->getEventDispatcher()->addCustomEventListener(); string file("res/Button.png"); auto btn = cocos2d::ui::Button::create(file, file, file); btn->setColor(Color3B(24, 48, 64)); btn->setPressedActionEnabled(true); btn->setScale9Enabled(true); btn->setContentSize(Size(100, 50)); btn->setPosition(Vec2(displayex.width - btn->getContentSize().width / 2, displayex.height - btn->getContentSize().height / 2)); btn->setTitleColor(Color3B::BLUE); btn->setTitleFontSize(50); btn->setName("X"); btn->setTitleText("X"); btn->addClickEventListener(std::bind(&MusicLayer::OnCallback, this, std::placeholders::_1)); this->addChild(btn); this->initFileSearchPathLayer(); this->initPlayLayer(); this->initTableView(); } void MusicLayer::initFileSearchPathLayer() { //seting layer auto setLayer = LayerColor::create(Color4B(24, 48, 64, 255)); setLayer->setContentSize(Size(displayex.width / 3, displayex.height - 50)); setLayer->setPosition(0, 50); setLayer->setName("setLayer"); this->addChild(setLayer, 1); string file("res/Button.png"); auto btn = cocos2d::ui::Button::create(file, file, file); btn->setColor(Color3B(24, 48, 64)); btn->setPressedActionEnabled(true); btn->setScale9Enabled(true); btn->setContentSize(Size(setLayer->getContentSize().width - 100, 40)); btn->setPosition(Vec2(setLayer->getContentSize().width / 2, setLayer->getContentSize().height - btn->getContentSize().height / 2)); btn->setTitleColor(Color3B::BLUE); btn->setTitleFontSize(30); btn->setName("Search"); btn->setTitleText("SEARCH"); btn->addClickEventListener(std::bind(&MusicLayer::OnCallback, this, std::placeholders::_1)); setLayer->addChild(btn); } void MusicLayer::initPlayLayer() { //player layer auto playLayer = LayerColor::create(Color4B(16, 65, 86, 255)); playLayer->setContentSize(Size(displayex.width, 50)); this->addChild(playLayer, 1); string file("res/Button.png"); auto btn = cocos2d::ui::Button::create(file, file, file); btn->setColor(Color3B(24, 48, 64)); btn->setPosition(Vec2(playLayer->getContentSize().width / 2, playLayer->getContentSize().height / 2)); btn->setPressedActionEnabled(true); btn->setScale9Enabled(true); btn->setContentSize(Size(50, 50)); btn->setTitleColor(Color3B::BLUE); btn->setTitleFontSize(20); btn->setName("play"); btn->setTitleText("PLAY"); btn->addClickEventListener(std::bind(&MusicLayer::OnCallback, this, std::placeholders::_1)); playLayer->addChild(btn); } void MusicLayer::initTableView() { auto setLayer = this->getChildByName("setLayer"); auto tableView = TableView::create(this,Size(setLayer->getContentSize().width,setLayer->getContentSize().height - 50)); tableView->setColor(Color3B(13, 64, 98)); tableView->setName("tableView"); tableView->setContentSize(Size(setLayer->getContentSize().width, setLayer->getContentSize().height - 100)); tableView->setDirection(ScrollView::Direction::VERTICAL); tableView->setDelegate(this); tableView->setTouchEnabled(true); tableView->reloadData(); setLayer->addChild(tableView); } void MusicLayer::OnCallback(cocos2d::Ref* pSender) { string name = ((Node*)(pSender))->getName(); if (name == "play") { SimpleAudioEngine::getInstance()->playBackgroundMusic("D:\\Audio/YZFHKMS-H.mp3"); } else if (name == "X") { auto action = Sequence::create(MoveTo::create(0.2f, Vec3(-(displayex.width), 0, 0)), DelayTime::create(0.1f), CallFunc::create([=]() { this->removeFromParent(); }), nullptr); this->runAction(action); } else if (name == "Search") { auto editBox = this->getChildByName("path"); if (!(editBox)) { auto edit = ui::EditBox::create(Size(400, 50), "res/input.png"); edit->setPosition(Vec2(displayex.width / 2 + 10, displayex.height - edit->getContentSize().height / 2)); edit->setName("path"); this->addChild(edit); edit->setDelegate(this); } else { editBox->runAction(MoveTo::create(0.2f, Vec3(displayex.width / 2 + 10, displayex.height - editBox->getContentSize().height / 2, 0))); } } else if (name == "path") { log("path"); } } void MusicLayer::editBoxEditingDidBegin(EditBox* editBox) { log("editBoxEditingDidBegin"); } void MusicLayer::editBoxEditingDidEnd(EditBox* editBox) { log("editBoxEditingDidEnd"); } void MusicLayer::editBoxTextChanged(EditBox* editBox, const std::string& text) { log("editBoxTextChanged"); } void MusicLayer::editBoxReturn(EditBox* editBox) { string str = editBox->getText(); if (str == "") { log("editBoxReturn: %s", "NULL"); return; } else { log("editBoxReturn: %s", str.c_str()); } auto setLayer = this->getChildByName("setLayer"); TableView *tableView = (TableView*)(setLayer->getChildByName("tableView")); tableView->reloadData(); FileUtils::getInstance()->addSearchPath(str); auto VV = FileUtils::getInstance()->listFiles(str); for (auto i = VV.begin(); i != VV.end(); i++) { auto is_0 = i->find("./", 0); auto is_1 = i->find("../", 0); int pos = 0; int sPos = 0; char tmp[128] = { 0 }; if (is_0 == -1 && is_1 == -1) { log("%s", i->c_str()); pos = i->find(".mp3", 0); if (pos != 0 && pos != -1) { for (int j = i->size(); j >= 0; j--) { if ((i->c_str())[j] == '/') { sPos = j; break; } } memcpy(tmp, i->c_str() + sPos + 1,(i->size() - sPos)); this->m_ListPath.push_back(tmp); this->m_TableNum++; } } } tableView->reloadData(); editBox->runAction(MoveTo::create(0.2f,Vec3(-(editBox->getContentSize().width), editBox->getPosition().y,0))); } void MusicLayer::editBoxEditingDidEndWithAction(EditBox* editBox, EditBoxDelegate::EditBoxEndAction action) { log("editBoxEditingDidEndWithAction"); } void CustomTableViewCell::draw(Renderer *renderer, const Mat4 &transform, uint32_t flags) { TableViewCell::draw(renderer, transform, flags); // draw bounding box //auto pos = getPosition(); //auto size = Size(178, 200); //Vec2 vertices[4] = { // Vec2(pos.x + 1, pos.y + 1), // Vec2(pos.x + size.width - 1, pos.y + 1), // Vec2(pos.x + size.width - 1, pos.y + size.height - 1), // Vec2(pos.x + 1, pos.y + size.height - 1), //}; //DrawPrimitives::drawColor4B(0, 0, 255, 255); //DrawPrimitives::drawPoly(vertices, 4, true); } void MusicLayer::tableCellTouched(TableView* table, TableViewCell* cell) { CCLOG("cell touched at index: %ld", static_cast<long>(cell->getIdx())); string file = m_ListPath[(int)(cell->getIdx())].c_str(); log("tableCellTouched %s",file.c_str()); SimpleAudioEngine::getInstance()->playBackgroundMusic(file.c_str(),true); } Size MusicLayer::tableCellSizeForIndex(TableView *table, ssize_t idx) { return Size(displayex.width / 3 - 10, 50); } TableViewCell* MusicLayer::tableCellAtIndex(TableView *table, ssize_t idx) { //auto string = StringUtils::format("%ld", static_cast<long>(idx)); TableViewCell *cell = table->dequeueCell(); if (!cell) { cell = new (std::nothrow) CustomTableViewCell(); cell->autorelease(); auto sprite = Sprite::create("res/Button.png"); sprite->setAnchorPoint(Vec2::ZERO); sprite->setColor(Color3B(24, 48, 64)); sprite->setPosition(Vec2(0, 0)); sprite->setContentSize(Size(displayex.width / 3 - 10,50)); sprite->setTag(123); cell->addChild(sprite); auto label = Label::createWithSystemFont(m_ListPath[idx], "Helvetica", 21.0F); label->setAnchorPoint(Vec2(0.0f,0.5f)); label->setPosition(Vec2(10, sprite->getContentSize().height / 2)); label->setTag(123); sprite->addChild(label); log("create cell "); } else { //auto label = (Label*)(cell->getChildByTag(123)->getChildByTag(123)); //label->setString(string); //label->setAnchorPoint(Vec2(0.0f, 0.5f)); //label->setPosition(Vec2(0, label->getPosition().y)); //log("update cell set string %s",string.c_str()); this->refreshCellItem((Ref*)(cell), idx); } return cell; } void MusicLayer::refreshCellItem(Ref*node, ssize_t idx) { auto label = (Label*)(((Node*)(node))->getChildByTag(123)->getChildByTag(123)); label->setString(m_ListPath[(int)(idx)]); } ssize_t MusicLayer::numberOfCellsInTableView(TableView *table) { log("cell num"); return m_TableNum; } bool MusicLayer::onTouchBegan(Touch *pTouch, Event *pEvent) { log("touch MusicLayer"); return true; }