std::vector<WStandardItem *> TreeViewExample::cityItems(const std::string& city, WeatherIcon weather, const std::string& drink, bool useInternalPath, bool visited) { std::vector<WStandardItem *> result; WStandardItem *item; // column 0: country item = new WStandardItem(WString::fromUTF8(city)); result.push_back(item); // column 1: weather item = new WStandardItem(); item->setIcon(std::string("icons/") + weatherIcons[weather]); result.push_back(item); // column 2: drink item = new WStandardItem(drink); if (useInternalPath) item->setLink(WLink(WLink::InternalPath, "/drinks/" + drink)); result.push_back(item); // column 3: visited item = new WStandardItem(); item->setCheckable(true); item->setChecked(visited); result.push_back(item); return result; }
WStandardItem *TreeViewExample::countryItem(const std::string& country, const std::string& code) { WStandardItem *result = new WStandardItem(WString::fromUTF8(country)); result->setIcon("icons/flag_" + code + ".png"); return result; }
/// // Create a file entry // WStandardItem* FileBrowser::createEntry(const std::string& baseName, int index) { WStandardItem *result = new WStandardItem(baseName); result->setIcon("icons/file.gif"); // Set the data for the entry index in the user roles result->setData(index, UserRole); return result; }
/*! \brief Create a folder item. * * Configures flags for drag and drop support. */ WStandardItem *createFolderItem(const WString& location, const std::string& folderId = std::string()) { WStandardItem *result = new WStandardItem(location); if (!folderId.empty()) { result->setData(boost::any(folderId)); result->setFlags(result->flags() | ItemIsDropEnabled); folderNameMap_[folderId] = location; } else result->setFlags(result->flags().clear(ItemIsSelectable)); result->setIcon("icons/folder.gif"); return result; }
/*! \brief Populate the files model. * * Data (and headers) is read from the CSV file data/files.csv. We * add icons to the first column, resolve the folder id to the * actual folder name, and configure item flags, and parse date * values. */ void populateFiles() { fileModel_->invisibleRootItem()->setRowCount(0); std::ifstream f((appRoot() + "data/files.csv").c_str()); if (!f) throw std::runtime_error("Could not read: data/files.csv"); readFromCsv(f, fileModel_); for (int i = 0; i < fileModel_->rowCount(); ++i) { WStandardItem *item = fileModel_->item(i, 0); item->setFlags(item->flags() | ItemIsDragEnabled); item->setIcon("icons/file.gif"); std::string folderId = item->text().toUTF8(); item->setData(boost::any(folderId), UserRole); item->setText(folderNameMap_[folderId]); convertToDate(fileModel_->item(i, 4)); convertToDate(fileModel_->item(i, 5)); } }
/// // Add an entry to the browser // bool FileBrowser::addEntry(bool rootDir, int entryDepth, const std::string &baseDir, const std::string &baseName, int index) { // // The code below adds an entry into the tree such as follows: // // + tract_meta.bash // + dicom_seriesCollect.bash // + tract_meta-stage-2-dcm2trk.bash // | // + stage-1-mri_convert // | // + diff_unpack // // ... // // The relatively convoluted logic below is responsible for // adding a new item to this tree structure. // If it's not a root directory, add the unique folder names as // root folder entries if (!rootDir) { bool addEntry = true; int modelRow; // Iterate over all the rows in the root for (modelRow = 0; modelRow < mModel->rowCount(); modelRow++) { WStandardItem *item = mModel->item(modelRow); bool match = true; // For the depth of the folder, attempt to match as many folders // as possible. for (int depth = 0; depth <= entryDepth && item != NULL; depth++) { path dirPath = path(baseDir); for (int d = 0; d < (entryDepth - depth); d++) { dirPath = dirPath.branch_path(); } std::string folderLeafName = path(dirPath).leaf().string(); boost::any displayData = item->data(DisplayRole); if (!displayData.empty()) { WString folderName = boost::any_cast<WString>(displayData); // Folder did not match, this means we need to add it // to the tree if (folderName.toUTF8() != folderLeafName) { match = false; break; } } } // All folders matched, we do not need a new folder if (match) { addEntry = false; } } // Add all of the necessary folder entries to the tree if (addEntry) { WStandardItem *lastItem = mModel->invisibleRootItem(); for (int depth = 0; depth <= entryDepth; depth++) { path dirPath = path(baseDir); for (int d = 0; d < (entryDepth - depth); d++) { dirPath = dirPath.branch_path(); } std::string folderLeafName = path(dirPath).leaf().string(); bool addFolder = true; for (int row = 0; row < lastItem->rowCount(); row++) { WStandardItem *item = lastItem->child(row); std::string folderLeafName = path(dirPath).leaf().string(); boost::any displayData = item->data(DisplayRole); if (!displayData.empty()) { WString folderName = boost::any_cast<WString>(displayData); if (folderName.toUTF8() == folderLeafName) { addFolder = false; lastItem = item; break; } } } if (addFolder) { WStandardItem *newItem = new WStandardItem(folderLeafName); newItem->setFlags(newItem->flags().clear(ItemIsSelectable)); newItem->setIcon("icons/folder.gif"); lastItem->appendRow(newItem); lastItem = newItem; } } } } // For root entries, add the file logs else { mModel->appendRow(createEntry(baseName, index)); } // Now add the items under the folders if (!rootDir) { WStandardItem *lastItem = mModel->invisibleRootItem(); for (int depth = 0; depth <= entryDepth; depth++) { path dirPath = path(baseDir); for (int d = 0; d < (entryDepth - depth); d++) { dirPath = dirPath.branch_path(); } std::string folderLeafName = path(dirPath).leaf().string(); for (int row = 0; row < lastItem->rowCount(); row++) { WStandardItem *item = lastItem->child(row); std::string folderLeafName = path(dirPath).leaf().string(); boost::any displayData = item->data(DisplayRole); if (!displayData.empty()) { WString folderName = boost::any_cast<WString>(displayData); if (folderName.toUTF8() == folderLeafName) { lastItem = item; break; } } } } if (lastItem != NULL) { lastItem->appendRow(createEntry(baseName, index)); } } // Add the directory to the watch list addWatchPath(baseDir); return true; }