int Feed::updateMessages(const QList<Message> &messages) { int custom_id = customId(); int account_id = getParentServiceRoot()->accountId(); bool anything_updated = false; bool ok; QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); int updated_messages = DatabaseQueries::updateMessages(database, messages, custom_id, account_id, url(), &anything_updated, &ok); if (ok) { if (updated_messages > 0) { setStatus(NewMessages); } else { setStatus(Normal); } QList<RootItem*> items_to_update; updateCounts(true); items_to_update.append(this); if (getParentServiceRoot()->recycleBin() != nullptr && anything_updated) { getParentServiceRoot()->recycleBin()->updateCounts(true); items_to_update.append(getParentServiceRoot()->recycleBin()); } getParentServiceRoot()->itemChanged(items_to_update); } return updated_messages; }
void GameStateShop::purchaseCard(int controlId) { MTGCard * c = srcCards->getCard(controlId - BOOSTER_SLOTS); if (!c || !c->data || playerdata->credits - mPrices[controlId] < 0) return; myCollection->Add(c); int price = mPrices[controlId]; pricelist->setPrice(c->getMTGId(), price); // In case they changed their minds after cancelling. playerdata->credits -= price; //Update prices int rnd; switch (options[Options::ECON_DIFFICULTY].number) { case Constants::ECON_HARD: rnd = rand() % 50; break; case Constants::ECON_EASY: rnd = rand() % 10; break; default: rnd = rand() % 25; break; } price = price + (rnd * price) / 100; pricelist->setPrice(c->getMTGId(), price); mPrices[controlId] = pricelist->getPurchasePrice(c->getMTGId()); //Prices go up immediately. mInventory[controlId]--; updateCounts(); mTouched = true; menu->Close(); }
Client::~Client() throw() { dcassert(!sock); // In case we were deleted before we Failed FavoriteManager::getInstance()->removeUserCommand(getHubUrl()); TimerManager::getInstance()->removeListener(this); updateCounts(true); }
void WSrcCards::validate() { validated.clear(); updateCounts(); if (!filtersRoot) return; for (size_t t = 0; t < cards.size(); t++) { if (matchesFilters(cards[t])) validated.push_back(t); } }
void StandardServiceRoot::loadFromDatabase(){ QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); Assignment categories = DatabaseQueries::getCategories(database, accountId()); Assignment feeds = DatabaseQueries::getFeeds(database, accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories); assembleFeeds(feeds); // As the last item, add recycle bin, which is needed. appendChild(m_recycleBin); updateCounts(true); }
void PacketRangeGroupBox::initRange(packet_range_t *range) { if (!range) return; range_ = range; if (range_->process_filtered) { pr_ui_->displayedButton->setChecked(true); } else { pr_ui_->capturedButton->setChecked(true); } if (range_->user_range) { pr_ui_->rangeLineEdit->setText(range_convert_range(range_->user_range)); } updateCounts(); }
void GmailServiceRoot::loadFromDatabase() { QSqlDatabase database = qApp->database()->connection(metaObject()->className()); Assignment categories = DatabaseQueries::getCategories(database, accountId()); Assignment feeds = DatabaseQueries::getGmailFeeds(database, accountId()); // All data are now obtained, lets create the hierarchy. assembleCategories(categories); assembleFeeds(feeds); foreach (RootItem* feed, childItems()) { if (feed->customId() == QL1S("INBOX")) { feed->setKeepOnTop(true); } } // As the last item, add recycle bin, which is needed. updateCounts(true); }
Client::~Client() { dcassert(!m_client_sock); if (m_client_sock) { LogManager::getInstance()->message("[Error] Client::~Client() sock == nullptr"); } FavoriteManager::getInstance()->removeUserCommand(getHubUrl()); dcassert(FavoriteManager::getInstance()->countUserCommand(getHubUrl()) == 0); // In case we were deleted before we Failed // [-] TimerManager::getInstance()->removeListener(this); [-] IRainman fix: please see shutdown(). updateCounts(true); //[+]FlylinkDC // [-] IRainman. //if (m_hEventClientInitialized) // CloseHandle(m_hEventClientInitialized); //[~]FlylinkDC }
// Handle what happens when something is dropped onto a tag item bool NNotebookView::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) { Q_UNUSED(index); // suppress unused variable Q_UNUSED(action); // suppress unused variable // If this is a note-to-tag drop we are assigning tags to a note if (data->hasFormat("application/x-nixnote-note")) { QByteArray d = data->data("application/x-nixnote-note"); QString data(d); // Find the tag lid we dropped onto qint32 bookLid = parent->data(NAME_POSITION, Qt::UserRole).toInt(); if (bookLid <=0) return false; NotebookTable bookTable(global.db); Notebook notebook; bookTable.get(notebook, bookLid); // The string has a long list of note lids. We parse them out & update the note QStringList stringLids = data.split(" "); for (int i=0; i<stringLids.size(); i++) { if (stringLids[i].trimmed() != "") { qint32 noteLid = stringLids.at(i).toInt(); if (noteLid > 0) { NoteTable noteTable(global.db); qint32 currentNotebook = noteTable.getNotebookLid(noteLid); if (currentNotebook != bookLid) { noteTable.updateNotebook(noteLid, bookLid, true); emit(updateNoteList(noteLid, NOTE_TABLE_NOTEBOOK_POSITION, notebook.name.value())); qint64 dt = QDateTime::currentMSecsSinceEpoch(); noteTable.updateDate(noteLid, dt, NOTE_UPDATED_DATE, true); emit(updateNoteList(noteLid, NOTE_TABLE_DATE_UPDATED_POSITION, dt)); } } } } if (stringLids.size() > 0) { emit(updateCounts()); } return true; } return false; }
void Client::shutdown(ClientPtr& aClient, bool aRedirect) { FavoriteManager::getInstance()->removeUserCommand(getHubUrl()); TimerManager::getInstance()->removeListener(this); if (!aRedirect) { fire(ClientListener::Disconnecting(), this); } if(sock) { BufferedSocket::putSocket(sock, [=] { // Ensure that the pointer won't be deleted too early state = STATE_DISCONNECTED; if (!aRedirect) { cache.clear(); } aClient->clearUsers(); updateCounts(true); }); } }
void NmdcHub::onLine(const string& aLine) throw() { lastActivity = GET_TICK(); if(aLine.length() == 0) return; if(aLine[0] != '$') { // Check if we're being banned... if(state != STATE_CONNECTED) { if(Util::findSubString(aLine, "banned") != string::npos) { reconnect = false; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::Message(), this, Util::validateMessage(fromNmdc(aLine), true)); return; } string cmd; string param; string::size_type x; if( (x = aLine.find(' ')) == string::npos) { cmd = aLine; } else { cmd = aLine.substr(0, x); param = aLine.substr(x+1); } if(cmd == "$Search") { if(state != STATE_CONNECTED) { return; } string::size_type i = 0; string::size_type j = param.find(' ', i); if(j == string::npos || i == j) return; string seeker = fromNmdc(param.substr(i, j-i)); // Filter own searches if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { if(seeker == (getLocalIp() + ":" + Util::toString(SETTING(IN_PORT)))) { return; } } else { // Hub:seeker if(Util::stricmp(seeker.c_str() + 4, getNick().c_str()) == 0) { return; } } i = j + 1; { Lock l(cs); u_int32_t tick = GET_TICK(); seekers.push_back(make_pair(seeker, tick)); // First, check if it's a flooder FloodIter fi; for(fi = flooders.begin(); fi != flooders.end(); ++fi) { if(fi->first == seeker) { return; } } int count = 0; for(fi = seekers.begin(); fi != seekers.end(); ++fi) { if(fi->first == seeker) count++; if(count > 7) { if(seeker.compare(0, 4, "Hub:") == 0) Speaker<NmdcHubListener>::fire(NmdcHubListener::SearchFlood(), this, seeker.substr(4)); else Speaker<NmdcHubListener>::fire(NmdcHubListener::SearchFlood(), this, seeker + STRING(NICK_UNKNOWN)); flooders.push_back(make_pair(seeker, tick)); return; } } } int a; if(param[i] == 'F') { a = SearchManager::SIZE_DONTCARE; } else if(param[i+2] == 'F') { a = SearchManager::SIZE_ATLEAST; } else { a = SearchManager::SIZE_ATMOST; } i += 4; j = param.find('?', i); if(j == string::npos || i == j) return; string size = param.substr(i, j-i); i = j + 1; j = param.find('?', i); if(j == string::npos || i == j) return; int type = Util::toInt(param.substr(i, j-i)) - 1; i = j + 1; param = param.substr(i); if(param.size() > 0) { Speaker<NmdcHubListener>::fire(NmdcHubListener::Search(), this, seeker, a, Util::toInt64(size), type, fromNmdc(param)); if(seeker.compare(0, 4, "Hub:") == 0) { User::Ptr u; { Lock l(cs); User::NickIter ni = users.find(seeker.substr(4)); if(ni != users.end() && !ni->second->isSet(User::PASSIVE)) { u = ni->second; u->setFlag(User::PASSIVE); } } if(u) { updated(u); } } } } else if(cmd == "$MyINFO") { string::size_type i, j; i = 5; j = param.find(' ', i); if( (j == string::npos) || (j == i) ) return; string nick = fromNmdc(param.substr(i, j-i)); i = j + 1; User::Ptr u; dcassert(nick.size() > 0); { Lock l(cs); User::NickIter ni = users.find(nick); if(ni == users.end()) { u = users[nick] = ClientManager::getInstance()->getUser(nick, this); } else { u = ni->second; } } j = param.find('$', i); if(j == string::npos) return; string tmpDesc = Util::validateMessage(fromNmdc(param.substr(i, j-i)), true); // Look for a tag... if(tmpDesc.size() > 0 && tmpDesc[tmpDesc.size()-1] == '>') { x = tmpDesc.rfind('<'); if(x != string::npos) { // Hm, we have something... u->setTag(tmpDesc.substr(x)); tmpDesc.erase(x); } else { u->setTag(Util::emptyString); } } else { u->setTag(Util::emptyString); } u->setDescription(tmpDesc); i = j + 3; j = param.find('$', i); if(j == string::npos) return; u->setConnection(fromNmdc(param.substr(i, j-i-1))); i = j + 1; j = param.find('$', i); if(j == string::npos) return; u->setEmail(Util::validateMessage(fromNmdc(param.substr(i, j-i)), true)); i = j + 1; j = param.find('$', i); if(j == string::npos) return; u->setBytesShared(param.substr(i, j-i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::MyInfo(), this, u); } else if(cmd == "$Quit") { if(!param.empty()) { User::Ptr u; { Lock l(cs); User::NickIter i = users.find(fromNmdc(param)); if(i == users.end()) { dcdebug("C::onLine Quitting user %s not found\n", param.c_str()); return; } u = i->second; users.erase(i); } Speaker<NmdcHubListener>::fire(NmdcHubListener::Quit(), this, u); ClientManager::getInstance()->putUserOffline(u, true); } } else if(cmd == "$ConnectToMe") { if(state != STATE_CONNECTED) { return; } string::size_type i = param.find(' '); string::size_type j; if( (i == string::npos) || ((i + 1) >= param.size()) ) { return; } i++; j = param.find(':', i); if(j == string::npos) { return; } string server = fromNmdc(param.substr(i, j-i)); if(j+1 >= param.size()) { return; } string port = param.substr(j+1); ConnectionManager::getInstance()->connect(server, (short)Util::toInt(port), getNick()); Speaker<NmdcHubListener>::fire(NmdcHubListener::ConnectToMe(), this, server, (short)Util::toInt(port)); } else if(cmd == "$RevConnectToMe") { if(state != STATE_CONNECTED) { return; } User::Ptr u; bool up = false; { Lock l(cs); string::size_type j = param.find(' '); if(j == string::npos) { return; } User::NickIter i = users.find(fromNmdc(param.substr(0, j))); if(i == users.end()) { return; } u = i->second; if(!u->isSet(User::PASSIVE)) { u->setFlag(User::PASSIVE); up = true; } } if(u) { if(SETTING(CONNECTION_TYPE) == SettingsManager::CONNECTION_ACTIVE) { connectToMe(u); Speaker<NmdcHubListener>::fire(NmdcHubListener::RevConnectToMe(), this, u); } else { // Notify the user that we're passive too... if(up) revConnectToMe(u); } if(up) updated(u); } } else if(cmd == "$SR") { SearchManager::getInstance()->onSearchResult(aLine); } else if(cmd == "$HubName") { name = fromNmdc(param); Speaker<NmdcHubListener>::fire(NmdcHubListener::HubName(), this); } else if(cmd == "$Supports") { StringTokenizer<string> st(param, ' '); StringList& sl = st.getTokens(); for(StringIter i = sl.begin(); i != sl.end(); ++i) { if(*i == "UserCommand") { supportFlags |= SUPPORTS_USERCOMMAND; } else if(*i == "NoGetINFO") { supportFlags |= SUPPORTS_NOGETINFO; } else if(*i == "UserIP2") { supportFlags |= SUPPORTS_USERIP2; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::Supports(), this, sl); } else if(cmd == "$UserCommand") { string::size_type i = 0; string::size_type j = param.find(' '); if(j == string::npos) return; int type = Util::toInt(param.substr(0, j)); i = j+1; if(type == UserCommand::TYPE_SEPARATOR || type == UserCommand::TYPE_CLEAR) { int ctx = Util::toInt(param.substr(i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::UserCommand(), this, type, ctx, Util::emptyString, Util::emptyString); } else if(type == UserCommand::TYPE_RAW || type == UserCommand::TYPE_RAW_ONCE) { j = param.find(' ', i); if(j == string::npos) return; int ctx = Util::toInt(param.substr(i)); i = j+1; j = param.find('$'); if(j == string::npos) return; string name = fromNmdc(param.substr(i, j-i)); i = j+1; string command = fromNmdc(param.substr(i, param.length() - i)); Speaker<NmdcHubListener>::fire(NmdcHubListener::UserCommand(), this, type, ctx, Util::validateMessage(name, true, false), Util::validateMessage(command, true, false)); } } else if(cmd == "$Lock") { if(state != STATE_LOCK) { return; } state = STATE_HELLO; if(!param.empty()) { string::size_type j = param.find(" Pk="); string lock, pk; if( j != string::npos ) { lock = param.substr(0, j); pk = param.substr(j + 4); } else { // Workaround for faulty linux hubs... j = param.find(" "); if(j != string::npos) lock = param.substr(0, j); else lock = param; } if(CryptoManager::getInstance()->isExtended(lock)) { StringList feat; feat.push_back("UserCommand"); feat.push_back("NoGetINFO"); feat.push_back("NoHello"); feat.push_back("UserIP2"); feat.push_back("TTHSearch"); if(BOOLSETTING(COMPRESS_TRANSFERS)) feat.push_back("GetZBlock"); supports(feat); } key(CryptoManager::getInstance()->makeKey(lock)); validateNick(getNick()); Speaker<NmdcHubListener>::fire(NmdcHubListener::CLock(), this, lock, pk); } } else if(cmd == "$Hello") { if(!param.empty()) { string nick = fromNmdc(param); User::Ptr u = ClientManager::getInstance()->getUser(nick, this); { Lock l(cs); users[nick] = u; } if(getNick() == nick) { setMe(u); u->setFlag(User::DCPLUSPLUS); if(SETTING(CONNECTION_TYPE) != SettingsManager::CONNECTION_ACTIVE) u->setFlag(User::PASSIVE); else u->unsetFlag(User::PASSIVE); } if(state == STATE_HELLO) { state = STATE_CONNECTED; updateCounts(false); version(); getNickList(); myInfo(); } Speaker<NmdcHubListener>::fire(NmdcHubListener::Hello(), this, u); } } else if(cmd == "$ForceMove") { disconnect(); Speaker<NmdcHubListener>::fire(NmdcHubListener::Redirect(), this, param); } else if(cmd == "$HubIsFull") { Speaker<NmdcHubListener>::fire(NmdcHubListener::HubFull(), this); } else if(cmd == "$ValidateDenide") { // Mind the spelling... disconnect(); Speaker<NmdcHubListener>::fire(NmdcHubListener::ValidateDenied(), this); } else if(cmd == "$UserIP") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& l = t.getTokens(); for(StringIter it = l.begin(); it != l.end(); ++it) { string::size_type j = 0; if((j = it->find(' ')) == string::npos) continue; if((j+1) == it->length()) continue; v.push_back(ClientManager::getInstance()->getUser(it->substr(0, j), this)); v.back()->setIp(it->substr(j+1)); } Speaker<NmdcHubListener>::fire(NmdcHubListener::UserIp(), this, v); } } else if(cmd == "$NickList") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& sl = t.getTokens(); for(StringIter it = sl.begin(); it != sl.end(); ++it) { v.push_back(ClientManager::getInstance()->getUser(*it, this)); } { Lock l(cs); for(User::Iter it2 = v.begin(); it2 != v.end(); ++it2) { users[(*it2)->getNick()] = *it2; } } if(!(getSupportFlags() & SUPPORTS_NOGETINFO)) { string tmp; // Let's assume 10 characters per nick... tmp.reserve(v.size() * (11 + 10 + getNick().length())); for(User::List::const_iterator i = v.begin(); i != v.end(); ++i) { tmp += "$GetINFO "; tmp += (*i)->getNick(); tmp += ' '; tmp += getNick(); tmp += '|'; } if(!tmp.empty()) { send(tmp); } } Speaker<NmdcHubListener>::fire(NmdcHubListener::NickList(), this, v); } } else if(cmd == "$OpList") { if(!param.empty()) { User::List v; StringTokenizer<string> t(fromNmdc(param), "$$"); StringList& sl = t.getTokens(); for(StringIter it = sl.begin(); it != sl.end(); ++it) { v.push_back(ClientManager::getInstance()->getUser(*it, this)); v.back()->setFlag(User::OP); } { Lock l(cs); for(User::Iter it2 = v.begin(); it2 != v.end(); ++it2) { users[(*it2)->getNick()] = *it2; } } Speaker<NmdcHubListener>::fire(NmdcHubListener::OpList(), this, v); updateCounts(false); // Special...to avoid op's complaining that their count is not correctly // updated when they log in (they'll be counted as registered first...) myInfo(); } } else if(cmd == "$To:") { string::size_type i = param.find("From:"); if(i != string::npos) { i+=6; string::size_type j = param.find("$"); if(j != string::npos) { string from = fromNmdc(param.substr(i, j - 1 - i)); if(from.size() > 0 && param.size() > (j + 1)) { Speaker<NmdcHubListener>::fire(NmdcHubListener::PrivateMessage(), this, ClientManager::getInstance()->getUser(from, this, false), Util::validateMessage(fromNmdc(param.substr(j + 1)), true)); } } } } else if(cmd == "$GetPass") { setRegistered(true); Speaker<NmdcHubListener>::fire(NmdcHubListener::GetPassword(), this); } else if(cmd == "$BadPass") { Speaker<NmdcHubListener>::fire(NmdcHubListener::BadPassword(), this); } else if(cmd == "$LogedIn") { Speaker<NmdcHubListener>::fire(NmdcHubListener::LoggedIn(), this); } else { dcassert(cmd[0] == '$'); dcdebug("NmdcHub::onLine Unknown command %s\n", aLine.c_str()); } }
void FavoritesView::loadData() { QHashIterator<qint32, FavoritesViewItem *> i(dataStore); // Cleanup old items in the tree. We go through // it twice. The first time is to remove children // not in root (i.e. notebooks in a stack). The // second time is to remove items at a root level. while(i.hasNext()) { i.next(); if (i.value() != NULL && i.value()->parent() != root) { i.value()->parent()->removeChild(i.value()); } } i.toFront(); while(i.hasNext()) { i.next(); if (i.value() != NULL) { i.value()->setHidden(true); root->removeChild(i.value()); delete i.value(); dataStore.remove(i.key()); } } // Now start rebuilding the table FavoritesTable ftable(global.db); dataStore.clear(); targetStore.clear(); QList<qint32> lids; ftable.getAll(lids); QList<qint32> children; // First pass, we just get the top level ones for (int i=0; i<lids.size(); i++) { FavoritesRecord record; if (ftable.get(record, lids[i])) { if (record.parent == 0) { if (record.type == FavoritesRecord::LinkedStack || record.type == FavoritesRecord::NotebookStack) { if (!ftable.childrenFound(lids[i])) { ftable.expunge(lids[i]); } else { buildTreeEntry(root, &record); } } else { buildTreeEntry(root, &record); } } else { children.append(lids[i]); } } } // // Second pass we get any children for (int i=0; i<children.size(); i++) { FavoritesRecord record; if (ftable.get(record, children[i])) { FavoritesViewItem *parent = dataStore[record.parent]; if (parent != NULL) buildTreeEntry(parent, &record); } } emit updateCounts(); sortByColumn(NAME_POSITION, Qt::AscendingOrder); resetSize(); }
Client::~Client() throw() { dcassert(!socket); TimerManager::getInstance()->removeListener(this); updateCounts(true); }
// Handle what happens when something is dropped onto a tag item bool NTagView::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) { // If this is a note-to-tag drop we are assigning tags to a note if (data->hasFormat("application/x-nixnote-note")) { QByteArray d = data->data("application/x-nixnote-note"); QString data(d); // Find the tag lid we dropped onto qint32 tagLid = parent->data(NAME_POSITION, Qt::UserRole).toInt(); // The string has a long list of note lids. We parse them out & update the note QStringList stringLids = data.split(" "); for (int i=0; i<stringLids.size(); i++) { if (stringLids[i].trimmed() != "") { qint32 noteLid = stringLids.at(i).toInt(); if (noteLid > 0) { NoteTable noteTable(global.db); if (!noteTable.hasTag(noteLid, tagLid)) { noteTable.addTag(noteLid, tagLid, true); QString tagString = noteTable.getNoteListTags(noteLid); emit(updateNoteList(noteLid, NOTE_TABLE_TAGS_POSITION, tagString)); // qint64 dt = QDateTime::currentMSecsSinceEpoch(); // noteTable.updateDate(noteLid, dt, NOTE_UPDATED_DATE, true); // emit(updateNoteList(noteLid, NOTE_TABLE_DATE_UPDATED_POSITION, dt)); } } } } if (stringLids.size() > 0) emit updateCounts(); return true; } // If this is a tag-to-tag drop then we are modifying the hierarchy if (data->hasFormat("application/x-nixnote-tag")) { // If there is no parent, then they are trying to drop to the top level, which isn't permitted if (parent == NULL) return false; // Get the lid we are dropping. QByteArray d = data->data("application/x-nixnote-tag"); qint32 lid = d.toInt(); if (lid == 0) return false; qint32 newParentLid = parent->data(NAME_POSITION, Qt::UserRole).toInt(); qint32 oldParentLid = dataStore[lid]->parentLid; if (newParentLid == oldParentLid) return false; if (newParentLid == lid) return false; NTagViewItem *item = dataStore[lid]; // If we had an old parent, remove the child from it. if (oldParentLid > 0) { NTagViewItem *parent_ptr = dataStore[oldParentLid]; for (int i=0; i<parent_ptr->childrenLids.size(); i++) { if (parent_ptr->childrenLids[i] == lid) { parent_ptr->childrenLids.removeAt(i); i=parent_ptr->childrenLids.size(); } } parent_ptr->removeChild(item); } else { root->removeChild(item); } // Update the actual database Tag tag; TagTable tagTable(global.db); tagTable.get(tag, lid); QString guid; tagTable.getGuid(guid, newParentLid); tag.parentGuid = guid; tagTable.update(tag, true); if (newParentLid>0) { NTagViewItem *parent_ptr = dataStore[newParentLid]; parent_ptr->addChild(item); parent_ptr->childrenLids.append(lid); item->parentLid = newParentLid; item->parentGuid = tag.guid; } else { item->parentLid = 0; item->parentGuid = ""; root->addChild(item); } // Resort the data this->sortByColumn(NAME_POSITION, Qt::AscendingOrder); sortItems(NAME_POSITION, Qt::AscendingOrder); return QTreeWidget::dropMimeData(parent, index, data, action); } return false; }