bool UIGChooserItemMachine::isLockedMachine() const
{
    KMachineState state = machineState();
    return state != KMachineState_PoweredOff &&
           state != KMachineState_Saved &&
           state != KMachineState_Teleported &&
           state != KMachineState_Aborted;
}
void ExperimentController::toggleTempLogs(bool temperatureLogsState, bool debugTemperatureLogsState)
{
    _settings.temperatureLogsState = temperatureLogsState;
    _settings.debugTemperatureLogsState = debugTemperatureLogsState;

    if (machineState() == IdleMachineState)
    {
        if (_settings.temperatureLogsState || _settings.debugTemperatureLogsState)
        {
            if (_settings.startTime == boost::posix_time::not_a_date_time)
            {
                _settings.startTime = boost::posix_time::microsec_clock::universal_time();

                startLogging();
            }
        }
        else
            stopLogging();
    }
}
ExperimentController::StartingResult ExperimentController::start(int experimentId)
{
    if (OpticsInstance::getInstance()->lidOpen())
        return LidIsOpen;

    Experiment experiment = _dbControl->getExperiment(experimentId);

    if (experiment.empty() || !experiment.protocol())
        return ExperimentNotFound;
    else if (experiment.startedAt() != boost::posix_time::not_a_date_time)
        return ExperimentUsed;

    experiment.setStartedAt(boost::posix_time::microsec_clock::local_time());

    if (machineState() != IdleMachineState)
        return MachineRunning;

    stopLogging();

    {
        Poco::RWLock::ScopedWriteLock lock(*_machineMutex);

        _settings.temperatureLogsState = false;
        _settings.debugTemperatureLogsState = false;

        LidInstance::getInstance()->setTargetTemperature(experiment.protocol()->lidTemperature());

        _dbControl->startExperiment(experiment);

        _machineState = LidHeatingMachineState;
        _experiment = std::move(experiment);

        LidInstance::getInstance()->setEnableMode(true);
    }

    startLogging();

    return Started;
}
QVariant UIGSelectorItemMachine::data(int iKey) const
{
    /* Provide other members with required data: */
    switch (iKey)
    {
        /* Layout hints: */
        case MachineItemData_MachineItemMargin: return 4;
        case MachineItemData_MachineItemMajorSpacing: return 10;
        case MachineItemData_MachineItemMinorSpacing: return 4;
        case MachineItemData_MachineItemTextSpacing: return 2;
        /* Fonts: */
        case MachineItemData_MachineNameFont:
        {
            QFont machineNameFont = qApp->font();
            machineNameFont.setPointSize(machineNameFont.pointSize() + 1);
            machineNameFont.setWeight(QFont::Bold);
            return machineNameFont;
        }
        case MachineItemData_SnapshotNameFont:
        {
            QFont snapshotStateFont = qApp->font();
            snapshotStateFont.setPointSize(snapshotStateFont.pointSize() + 1);
            return snapshotStateFont;
        }
        case MachineItemData_MachineStateTextFont:
        {
            QFont machineStateFont = qApp->font();
            machineStateFont.setPointSize(machineStateFont.pointSize() + 1);
            return machineStateFont;
        }
        /* Sizes: */
        case MachineItemData_MachinePixmapSize: return QSizeF(32, 32);
        case MachineItemData_MachineNameSize:
        {
            QFontMetrics fm(data(MachineItemData_MachineNameFont).value<QFont>());
            return QSize(fm.width(data(MachineItemData_MachineName).toString()), fm.height());
        }
        case MachineItemData_SnapshotNameSize:
        {
            QFontMetrics fm(data(MachineItemData_SnapshotNameFont).value<QFont>());
            return QSize(fm.width(QString("(%1)").arg(data(MachineItemData_SnapshotName).toString())), fm.height());
        }
        case MachineItemData_MachineStatePixmapSize: return QSizeF(16, 16);
        case MachineItemData_MachineStateTextSize:
        {
            QFontMetrics fm(data(MachineItemData_MachineStateTextFont).value<QFont>());
            return QSize(fm.width(data(MachineItemData_MachineStateText).toString()), fm.height());
        }
        /* Pixmaps: */
        case MachineItemData_MachinePixmap: return osIcon();
        case MachineItemData_MachineStatePixmap: return machineStateIcon();
        /* Texts: */
        case MachineItemData_MachineName: return name();
        case MachineItemData_SnapshotName: return snapshotName();
        case MachineItemData_MachineStateText: return gpConverter->toString(data(MachineItemData_MachineState).value<KMachineState>());
        /* Other values: */
        case MachineItemData_MachineId: return id();
        case MachineItemData_MachineOSTypeId: return osTypeId();
        case MachineItemData_MachineState: return QVariant::fromValue(machineState());
        /* Default: */
        default: break;
    }
    return QVariant();
}