Compare commits

...

3 Commits

Author SHA1 Message Date
Petr Mrázek
3b8f9592ee WIP fix build 2020-01-07 10:00:47 +01:00
Petr Mrázek
6270a4a468 WIP some more perf work that was left over, I guess 2020-01-07 10:00:47 +01:00
Petr Mrázek
c4919bab25 NOISSUE First step towards 10000 instances 2020-01-07 10:00:47 +01:00
9 changed files with 101 additions and 49 deletions

View File

@@ -32,10 +32,17 @@ BaseInstance::BaseInstance(SettingsObjectPtr globalSettings, SettingsObjectPtr s
m_settings = settings; m_settings = settings;
m_rootDir = rootDir; m_rootDir = rootDir;
m_id = QFileInfo(instanceRoot()).fileName();
m_settings->registerSetting("name", "Unnamed Instance"); m_settings->registerSetting("name", "Unnamed Instance");
m_name = m_settings->get("name").toString();
m_settings->registerSetting("iconKey", "default"); m_settings->registerSetting("iconKey", "default");
m_settings->registerSetting("notes", ""); m_settings->registerSetting("notes", "");
m_settings->registerSetting("lastLaunchTime", 0); m_settings->registerSetting("lastLaunchTime", 0);
m_lastlaunch = m_settings->get("lastLaunchTime").value<qint64>();
m_settings->registerSetting("totalTimePlayed", 0); m_settings->registerSetting("totalTimePlayed", 0);
// Custom Commands // Custom Commands
@@ -117,9 +124,9 @@ BaseInstance::Status BaseInstance::currentStatus() const
return m_status; return m_status;
} }
QString BaseInstance::id() const const QString &BaseInstance::id() const
{ {
return QFileInfo(instanceRoot()).fileName(); return m_id;
} }
bool BaseInstance::isRunning() const bool BaseInstance::isRunning() const
@@ -192,13 +199,19 @@ bool BaseInstance::reloadSettings()
qint64 BaseInstance::lastLaunch() const qint64 BaseInstance::lastLaunch() const
{ {
return m_settings->get("lastLaunchTime").value<qint64>(); return m_lastlaunch;
} }
void BaseInstance::setLastLaunch(qint64 val) void BaseInstance::setLastLaunch(qint64 val)
{ {
//FIXME: if no change, do not set. setting involves saving a file. if(m_lastlaunch == val) {
return;
}
// FIXME: there is no single source of truth.
m_lastlaunch = val;
m_settings->set("lastLaunchTime", val); m_settings->set("lastLaunchTime", val);
emit propertiesChanged(this); emit propertiesChanged(this);
} }
@@ -227,14 +240,20 @@ QString BaseInstance::iconKey() const
void BaseInstance::setName(QString val) void BaseInstance::setName(QString val)
{ {
//FIXME: if no change, do not set. setting involves saving a file. if(m_name == val) {
return;
}
// FIXME: there is no single source of truth.
m_name = val;
m_settings->set("name", val); m_settings->set("name", val);
emit propertiesChanged(this); emit propertiesChanged(this);
} }
QString BaseInstance::name() const QString BaseInstance::name() const
{ {
return m_settings->get("name").toString(); return m_name;
} }
QString BaseInstance::windowTitle() const QString BaseInstance::windowTitle() const

View File

@@ -80,7 +80,7 @@ public:
/// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to /// The instance's ID. The ID SHALL be determined by MMC internally. The ID IS guaranteed to
/// be unique. /// be unique.
virtual QString id() const; const QString &id() const;
void setRunning(bool running); void setRunning(bool running);
bool isRunning() const; bool isRunning() const;
@@ -250,6 +250,10 @@ protected slots:
protected: /* data */ protected: /* data */
QString m_rootDir; QString m_rootDir;
QString m_id;
QString m_name;
qint64 m_lastlaunch = 0;
SettingsObjectPtr m_settings; SettingsObjectPtr m_settings;
// InstanceFlags m_flags; // InstanceFlags m_flags;
bool m_isRunning = false; bool m_isRunning = false;

View File

@@ -115,7 +115,7 @@ QVariant InstanceList::data(const QModelIndex &index, int role) const
// HACK: see GroupView.h in gui! // HACK: see GroupView.h in gui!
case GroupRole: case GroupRole:
{ {
return getInstanceGroup(pdata->id()); return getInstanceGroup(pdata);
} }
default: default:
break; break;
@@ -153,6 +153,16 @@ Qt::ItemFlags InstanceList::flags(const QModelIndex &index) const
return f; return f;
} }
GroupId InstanceList::getInstanceGroup(BaseInstance * inst) const
{
auto iter = m_instanceGroupIndex.find(inst->id());
if(iter != m_instanceGroupIndex.end())
{
return *iter;
}
return GroupId();
}
GroupId InstanceList::getInstanceGroup(const InstanceId& id) const GroupId InstanceList::getInstanceGroup(const InstanceId& id) const
{ {
auto inst = getInstanceById(id); auto inst = getInstanceById(id);
@@ -160,12 +170,7 @@ GroupId InstanceList::getInstanceGroup(const InstanceId& id) const
{ {
return GroupId(); return GroupId();
} }
auto iter = m_instanceGroupIndex.find(inst->id()); return getInstanceGroup(inst.get());
if(iter != m_instanceGroupIndex.end())
{
return *iter;
}
return GroupId();
} }
void InstanceList::setInstanceGroup(const InstanceId& id, const GroupId& name) void InstanceList::setInstanceGroup(const InstanceId& id, const GroupId& name)

View File

@@ -144,6 +144,7 @@ private slots:
void instanceDirContentsChanged(const QString &path); void instanceDirContentsChanged(const QString &path);
private: private:
GroupId getInstanceGroup(BaseInstance * inst) const;
int getInstIndex(BaseInstance *inst) const; int getInstIndex(BaseInstance *inst) const;
void suspendWatch(); void suspendWatch();
void resumeWatch(); void resumeWatch();

View File

@@ -17,18 +17,15 @@ QVariant InstanceProxyModel::data(const QModelIndex & index, int role) const
return data; return data;
} }
bool InstanceProxyModel::subSortLessThan(const QModelIndex &left, bool InstanceProxyModel::subSortLessThan(const QModelIndex &left, const QModelIndex &right) const
const QModelIndex &right) const
{ {
BaseInstance *pdataLeft = static_cast<BaseInstance *>(left.internalPointer()); BaseInstance *pdataLeft = static_cast<BaseInstance *>(left.internalPointer());
BaseInstance *pdataRight = static_cast<BaseInstance *>(right.internalPointer()); BaseInstance *pdataRight = static_cast<BaseInstance *>(right.internalPointer());
QString sortMode = MMC->settings()->get("InstSortMode").toString(); switch(currentSortMode) {
if (sortMode == "LastLaunch") case SortMode::ByLastPlayed:
{
return pdataLeft->lastLaunch() > pdataRight->lastLaunch(); return pdataLeft->lastLaunch() > pdataRight->lastLaunch();
} default:
else case SortMode::ByName:
{
return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0; return QString::localeAwareCompare(pdataLeft->name(), pdataRight->name()) < 0;
} }
} }

View File

@@ -7,10 +7,21 @@
*/ */
class InstanceProxyModel : public GroupedProxyModel class InstanceProxyModel : public GroupedProxyModel
{ {
public:
enum class SortMode {
ByName,
ByLastPlayed
};
public: public:
explicit InstanceProxyModel(QObject *parent = 0); explicit InstanceProxyModel(QObject *parent = 0);
QVariant data(const QModelIndex & index, int role) const override; QVariant data(const QModelIndex & index, int role) const override;
void setSortMode(SortMode mode) {
currentSortMode = mode;
}
protected: protected:
virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const override; virtual bool subSortLessThan(const QModelIndex &left, const QModelIndex &right) const override;
private:
SortMode currentSortMode = SortMode::ByName;
}; };

View File

@@ -679,7 +679,23 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new MainWindow
proxymodel = new InstanceProxyModel(this); proxymodel = new InstanceProxyModel(this);
proxymodel->setSourceModel(MMC->instances().get()); proxymodel->setSourceModel(MMC->instances().get());
auto sortMode = MMC->settings()->getSetting("InstSortMode");
auto applySortMode = [this](QVariant value) {
auto StrValue = value.toString();
if (StrValue == "LastLaunch")
{
proxymodel->setSortMode(InstanceProxyModel::SortMode::ByLastPlayed);
}
else // Name
{
proxymodel->setSortMode(InstanceProxyModel::SortMode::ByName);
}
proxymodel->sort(0); proxymodel->sort(0);
};
applySortMode(sortMode->get());
connect(sortMode.get(), &Setting::SettingChanged, [applySortMode](const Setting &setting, QVariant value){
applySortMode(value);
});
connect(proxymodel, &InstanceProxyModel::dataChanged, this, &MainWindow::instanceDataChanged); connect(proxymodel, &InstanceProxyModel::dataChanged, this, &MainWindow::instanceDataChanged);
view->setModel(proxymodel); view->setModel(proxymodel);
@@ -1370,15 +1386,17 @@ void MainWindow::finalizeInstance(InstancePtr inst)
{ {
view->updateGeometries(); view->updateGeometries();
setSelectedInstanceById(inst->id()); setSelectedInstanceById(inst->id());
if (MMC->accounts()->anyAccountIsValid()) if (MMC->accounts()->anyAccountIsValid()) {
{
ProgressDialog loadDialog(this); ProgressDialog loadDialog(this);
auto update = inst->createUpdateTask(Net::Mode::Online); auto update = inst->createUpdateTask(Net::Mode::Online);
connect(update.get(), &Task::failed, [this](QString reason) connect(
{ update.get(),
&Task::failed,
[this](QString reason) {
QString error = QString("Instance load failed: %1").arg(reason); QString error = QString("Instance load failed: %1").arg(reason);
CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show(); CustomMessageBox::selectable(this, tr("Error"), error, QMessageBox::Warning)->show();
}); }
);
if(update) if(update)
{ {
loadDialog.setSkipButton(true, tr("Abort")); loadDialog.setSkipButton(true, tr("Abort"));
@@ -1387,10 +1405,12 @@ void MainWindow::finalizeInstance(InstancePtr inst)
} }
else else
{ {
CustomMessageBox::selectable(this, tr("Error"), tr("MultiMC cannot download Minecraft or update instances unless you have at least " CustomMessageBox::selectable(
"one account added.\nPlease add your Mojang or Minecraft account."), this,
QMessageBox::Warning) tr("Error"),
->show(); tr("MultiMC cannot download Minecraft or update instances unless you have at least one account added.\nPlease add your Mojang or Minecraft account."),
QMessageBox::Warning
)->show();
} }
} }

View File

@@ -36,6 +36,7 @@ void VisualGroup::update()
{ {
auto temp_items = items(); auto temp_items = items();
auto itemsPerRow = view->itemsPerRow(); auto itemsPerRow = view->itemsPerRow();
m_itemLookup.clear();
int numRows = qMax(1, qCeil((qreal)temp_items.size() / (qreal)itemsPerRow)); int numRows = qMax(1, qCeil((qreal)temp_items.size() / (qreal)itemsPerRow));
rows = QVector<VisualRow>(numRows); rows = QVector<VisualRow>(numRows);
@@ -61,6 +62,7 @@ void VisualGroup::update()
maxRowHeight = itemHeight; maxRowHeight = itemHeight;
} }
rows[currentRow].items.append(item); rows[currentRow].items.append(item);
m_itemLookup[item] = QPair<int, int>(positionInRow, currentRow);
positionInRow++; positionInRow++;
} }
rows[currentRow].height = maxRowHeight; rows[currentRow].height = maxRowHeight;
@@ -69,20 +71,12 @@ void VisualGroup::update()
QPair<int, int> VisualGroup::positionOf(const QModelIndex &index) const QPair<int, int> VisualGroup::positionOf(const QModelIndex &index) const
{ {
int y = 0; auto iter = m_itemLookup.find(index);
for (auto & row: rows) if(iter == m_itemLookup.end()) {
{
for(auto x = 0; x < row.items.size(); x++)
{
if(row.items[x] == index)
{
return qMakePair(x,y);
}
}
y++;
}
qWarning() << "Item" << index.row() << index.data(Qt::DisplayRole).toString() << "not found in visual group" << text; qWarning() << "Item" << index.row() << index.data(Qt::DisplayRole).toString() << "not found in visual group" << text;
return qMakePair(0, 0); return qMakePair(0, 0);
}
return *iter;
} }
int VisualGroup::rowTopOf(const QModelIndex &index) const int VisualGroup::rowTopOf(const QModelIndex &index) const

View File

@@ -50,6 +50,7 @@ struct VisualGroup
QString text; QString text;
bool collapsed = false; bool collapsed = false;
QVector<VisualRow> rows; QVector<VisualRow> rows;
QMap<QModelIndex, QPair<int, int>> m_itemLookup;
int firstItemIndex = 0; int firstItemIndex = 0;
int m_verticalPosition = 0; int m_verticalPosition = 0;