Пример #1
0
CalcResponse CalcDB::removeCalc(const std::string& keyword)
{
	if(!_db)
		return CALC_RESPONSE_NODB;

	CalcResponse ret = CALC_RESPONSE_NOCALC;

	// First we need to know the calc exists.
	std::string response;
	if(getCalc(keyword, response) == CALC_RESPONSE_NOCALC)
		return ret;

	std::string query = "DELETE FROM calcs WHERE keyword = ?";
	sqlite3_stmt* stmt = 0;

	if(sqlite3_prepare_v2(_db, query.c_str(), query.size(), &stmt, 0) == SQLITE_OK)
	{
		sqlite3_bind_text(stmt, 1, keyword.c_str(), keyword.size(), SQLITE_STATIC);

		if(sqlite3_step(stmt) == SQLITE_DONE)
		{
			ret = CALC_RESPONSE_OK;
		}
	}
	else
	{
		std::cerr << "Error with query: " << query << std::endl;
	}
	
	return ret;
}
Пример #2
0
CalcResponse CalcDB::getLatestVersionNumber(const std::string& keyword, int& version)
{
	if(!_db)
		return CALC_RESPONSE_NODB;

	std::string response;
	if(getCalc(keyword, response) == CALC_RESPONSE_NOCALC)
		return CALC_RESPONSE_NOCALC;

	std::string query = "SELECT MAX(version) FROM calcs WHERE keyword = ?";
	sqlite3_stmt* stmt = 0;

	if(sqlite3_prepare_v2(_db, query.c_str(), query.size(), &stmt, 0) == SQLITE_OK)
	{
		sqlite3_bind_text(stmt, 1, keyword.c_str(), keyword.size(), SQLITE_STATIC);

		if(sqlite3_step(stmt) == SQLITE_ROW)
		{
			version = sqlite3_column_int(stmt, 0);	
		}
	}
	else
	{
		std::cerr << "Error with query: " << query << std::endl;
	}

	sqlite3_finalize(stmt);

	return CALC_RESPONSE_VERSIONOK;
}
Пример #3
0
CalcResponse CalcDB::makeCalc(const std::string& keyword, const std::string& newcalc, const std::string& author)
{
	if(!_db)
		return CALC_RESPONSE_NODB;

	std::string response;
	if(getCalc(keyword, response) == CALC_RESPONSE_OK)
		return CALC_RESPONSE_CALCALREADYEXISTS;

	CalcResponse ret = CALC_RESPONSE_CALCALREADYEXISTS;

	std::string calc = newcalc;
	calc = MiscStringHelpers::trim(calc);

	std::string query = "INSERT INTO calcs (calc, keyword, author, version, added) VALUES (?,?,?,'0', strftime(\"%Y-%m-%d %H:%M:%S\",\"now\"))";

	sqlite3_stmt* stmt = 0;
	
	if(sqlite3_prepare_v2(_db, query.c_str(), query.size(), &stmt, 0) == SQLITE_OK)
	{
		sqlite3_bind_text(stmt, 1, calc.c_str(), calc.size(), SQLITE_STATIC);
		sqlite3_bind_text(stmt, 2, keyword.c_str(), keyword.size(), SQLITE_STATIC);
		sqlite3_bind_text(stmt, 3, author.c_str(), author.size(), SQLITE_STATIC);
		
		int step = sqlite3_step(stmt);
		
		if(step == SQLITE_DONE)
		{
			ret = CALC_RESPONSE_CALCCHANGED;
		}
		else if(step == SQLITE_BUSY)
		{
			ret = CALC_RESPONSE_DBBUSY;
		}
	}
	else
	{
		std::cerr << "Error with query: " << query << std::endl;
	}

	sqlite3_finalize(stmt);

	return ret;
}
Пример #4
0
int CFormulaNode::RunCalc()
{
	if( !getCalc() )
	{
		if( getCalcButtonID().length() )
			setMissButton();
		return 0;
	}
	if( !getCalc()->isPositionRunExist() ) return 0;

	QVector<RealFde> frames_ltrb;
	frames_ltrb.fill( 0.0, 4 * GetChildCount() );
	QVector<RealFde> frames_margin_ltrb;
	frames_margin_ltrb.fill( 0.0, 4 * GetChildCount() );
	QVector<RealFde> primitive_ltrb;
	primitive_ltrb.fill( 0.0, 4 * GetChildCount() );

	long i;
	CNode *pCurNode = GetFirstChild();
	if( pCurNode->GetType() != NODE_FRAME ) return 0;
	for( i = 0; i < GetChildCount() && pCurNode; pCurNode = pCurNode->GetNext(), i++ )
	{
		frames_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Left ] = pCurNode->GetPosition().x();
		frames_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Top ] = pCurNode->GetPosition().y();
		frames_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Right ] = pCurNode->GetPosition().x() + pCurNode->GetSize().width();
		frames_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Bottom ] = pCurNode->GetPosition().y() + pCurNode->GetSize().height();

		frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Left ] = ((CFrameNode*) pCurNode)->getLeftIndent();
		frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Top ] = ((CFrameNode*) pCurNode)->getTopIndent();
		frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Right ] = ((CFrameNode*) pCurNode)->getRightIndent();
		frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Bottom ] = ((CFrameNode*) pCurNode)->getBottomIndent();
	}

	for( i = 0; i < getGraphPrimNumber(); i++ )
	{
		primitive_ltrb.push_back( getGraphPrimitivePositionCoord( i, 0 ) );
		primitive_ltrb.push_back( getGraphPrimitivePositionCoord( i, 1 ) );
		primitive_ltrb.push_back( getGraphPrimitivePositionCoord( i, 2 ) );
		primitive_ltrb.push_back( getGraphPrimitivePositionCoord( i, 3 ) );
	}

	UseBtnCalc_InitByThisSize( *getCalc() );
	int ret = getCalc()->PositionRun( frames_ltrb, frames_margin_ltrb, primitive_ltrb );

	// reset parent margins
	UseBtnCalc_ChangeThisMargin( *getCalc() );

	for( i = 0; i < getGraphPrimNumber(); i++ )
	{
		if( getCalc()->isFormulaTypeGraphics( i ) )
		{
			setGraphPrimitivePositionCoord( 
				i, SVG_NodeTemplate_Parameter_Left,
				primitive_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Left ] );
			setGraphPrimitivePositionCoord( 
				i, SVG_NodeTemplate_Parameter_Top,
				primitive_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Top ] );
			setGraphPrimitivePositionCoord( 
				i, SVG_NodeTemplate_Parameter_Right,
				primitive_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Right ] );
			setGraphPrimitivePositionCoord( 
				i, SVG_NodeTemplate_Parameter_Bottom,
				primitive_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Bottom ] );
		}
	}

	if( ret )
	{
		pCurNode = GetFirstChild();
		i = 0;
		while( pCurNode )
		{
			((CFrameNode*) pCurNode)->setLeftIndent( frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Left ] );
			((CFrameNode*) pCurNode)->setTopIndent( frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Top ] );
			((CFrameNode*) pCurNode)->setRightIndent( frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Right ] );
			((CFrameNode*) pCurNode)->setBottomIndent( frames_margin_ltrb[ i * 4 + SVG_NodeTemplate_Parameter_Bottom ] );
			pCurNode = pCurNode->GetNext();
			i++;
		}
		RecalculateSizeChild();
	}

	return ret;
}
Пример #5
0
QString CPlaneText::to_mathml__get_attribute_str( QString& _tag, QString& _body, int *isDefaultMMLChanged )
{
	if( isDefaultMMLChanged ) *isDefaultMMLChanged = 0;

	QString new_attr = _T(""), tmp = _T("");

	struct HMathMLAttr mml_attr( _tag, _body );
	HMathOpAttr *opinfo = ::mml_is_token_op_tag( _tag ) ? ::getOperatorEntryByMML( _body ) : 0;
	if( opinfo ) mml_attr.setMODefault( *opinfo );

	struct HMathMLAttr mml_attr_by_this_node( getMathMLAttr() );

	FS_LogFont_Color current_lfs;
	long st = (getFStyle() == FSTYLE_NONE ? FSTYLE_DEFAULT : getFStyle());
	int wouldChangeStyle = 0;//!::isMathMLStylePriority() && ::wouldChangeStyleOnMathStyleAutodetect( this );
	if( st == FSTYLE_OTHER_STYLE )
	{
		if( isDefaultMMLChanged ) *isDefaultMMLChanged = 1;
		current_lfs = getOtherStyleFont();
	}
	else
	{
		current_lfs = ::getCurrentFormulatorStyle().getFontStyle( st );

		if( !::isMathMLStylePriority() )
		{
			FXmlBtn *btn = getCalc();
			if( btn )
			{
				if( btn->getTextStyle() != st )
					wouldChangeStyle = 1;
			}
			else
			{
				std::vector<QString> dest_str;
				std::vector<long> dest_style;
				::getMathMLChar2Style( dest_str, dest_style, _body, _tag, __GLOBAL_WORK_MODE );
				if( dest_style.size() > 1 )
					wouldChangeStyle = 1;
				else if( dest_style.size() == 1 && dest_style.at(0) != st )
					wouldChangeStyle = 1;
			}
		}
	}

	int ret;
	FS_LogFont_Color def_lfs;

	ret = ::mml_mathvariant2font( ::isMathMLStylePriority(), st, ::getCurrentFormulatorStyle().getAllFontStyles(), mml_attr, def_lfs );
	if( ret == -1 || 
		def_lfs.m_name != current_lfs.m_name || 
		def_lfs.m_isFixed != current_lfs.m_isFixed || 
		//def_lfs.m_hint != current_lfs.m_hint || 
		def_lfs.m_isBold != current_lfs.m_isBold || 
		def_lfs.m_isItalic != current_lfs.m_isItalic ||
		wouldChangeStyle )
	{
		tmp = _T("");
		::mml_getStyle2TextAttrFont( tmp, current_lfs, _tag, _body, getMathMLAttr(), (st == FSTYLE_OTHER_STYLE) || wouldChangeStyle );
		new_attr += tmp;
	}

	QColor default_color = ::isMathMLStylePriority() ? QColor( 0, 0, 0 ) : ::getCurrentFormulatorStyle().getFontStyle( st ).m_color;
	ret = ::mml_mathcolor2color( mml_attr.getFilteredAttr( FBL_ATTR_mathcolor ), def_lfs.m_color, default_color );
	if( ret == 0 || def_lfs.m_color != current_lfs.m_color )
	{
		tmp = _T("");
		::mml_getStyle2TextAttrColor( tmp, current_lfs.m_color, _tag, _body );
		new_attr += tmp; 
		if( isDefaultMMLChanged ) *isDefaultMMLChanged = 1;
	}

	if( mml_attr_by_this_node.getFilteredAttr( FBL_ATTR_mathbackground, tmp ) == 0 )
	{
		new_attr += MAKE_MATHML_ATTR( FBL_ATTR_mathbackground, tmp );
		if( isDefaultMMLChanged ) *isDefaultMMLChanged = 1;
	}

	if( getTextKeglSize() != ::getKegl( GetLevel() ) )
	{
		tmp = _T("");

		RealFde kegl = getTextKeglSize();
		if( kegl == ::getCurrentFormulatorStyle().getKegl( FTEXT_HEIGHT_CHILD1 ) )
			tmp = MAKE_MATHML_ATTR( FBL_ATTR_mathsize, FBL_VAL_small );
		else if( kegl == ::getCurrentFormulatorStyle().getKegl( FTEXT_HEIGHT_FRAME ) )
			tmp = MAKE_MATHML_ATTR( FBL_ATTR_mathsize, FBL_VAL_normal );
		else if( kegl == ::getCurrentFormulatorStyle().getKegl( FTEXT_HEIGHT_LARGEOP ) )
			tmp = MAKE_MATHML_ATTR( FBL_ATTR_mathsize, FBL_VAL_big );
		else
			::mml_getStyle2TextPointSize( tmp, kegl, _tag, _body );
		new_attr += tmp;
		if( isDefaultMMLChanged ) *isDefaultMMLChanged = 1;
	}

	tmp = _T("");
	if( mml_attr_by_this_node.getChangedAttr_2_String( ::getCurrentFormulatorStyle().getUnit2PX(), tmp, mml_attr, _tag ) )
	{
	}

	return new_attr + tmp;
}
Пример #6
0
void CalcFrame::calc()
{
    auto milkReception = m_mainWindow->database()->milkReception();
    if (!milkReception) {
        Utils::Main::showMsgIfDbNotChoosed(this);
        return;
    }

    refreshTableWidgetCalc();

    DataWorker dw(m_mainWindow->database());
    try {
        dw.loadMilkReceptions(getWhereQuery());
    } catch (const QString &err) {
        QMessageBox::critical(this, tr("Расчеты"), tr("Произошла ошибка во время подгрузки данных: ") + err);
    }
    if (dw.getMilkReceptions().empty()) {
            QMessageBox::information(this, tr("Расчеты"), tr("Отсутствуют данные для расчетов"));
            return;
    }
    const auto settings = m_mainWindow->getSettings();
    const auto deliverers = dw.getDeliverers().values();
    const auto itemsCount = dw.getMilkReceptions().size() + deliverers.size() + 1; // FIXME
    ui->tableWidgetCalc->setRowCount(itemsCount);
    int row = 0;

    TableWidgetItemBuilder itemBuilder;
    CalculatedItem::Data allResult;
    const Settings::Calc settingsCalc = settings->getCalc();
    const char f = 'f';
    const Settings::Column nameCol = settingsCalc.columns[toInt(Columns::Name)],
            mpNameCol = settingsCalc.columns[toInt(Columns::MilkPointName)],
            dateCol = settingsCalc.columns[toInt(Columns::Date)],
            priceCol = settingsCalc.columns[toInt(Columns::PriceLiter)],
            litersCol = settingsCalc.columns[toInt(Columns::Liters)],
            fatCol = settingsCalc.columns[toInt(Columns::Fat)],
            proteinCol = settingsCalc.columns[toInt(Columns::Protein)],
            fatUnitsCol = settingsCalc.columns[toInt(Columns::FatUnits)],
            rankWeightCol = settingsCalc.columns[toInt(Columns::RankWeight)],
            payCol = settingsCalc.columns[toInt(Columns::PayWithOutPrem)],
            premiumCol = settingsCalc.columns[toInt(Columns::Premium)],
            sumCol = settingsCalc.columns[toInt(Columns::Sum)];
    const auto dateFromat = settingsCalc.dateFormat;

    auto addCalcItems = [&](const QString &name, const QString &milkPoint,
            const QString &delivDate, const CalculatedItem::Data &calcItem)
    {
        int c = 0;
        if (nameCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setText(name)->get());
        if (mpNameCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setText(milkPoint)->get());
        if (dateCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setText(delivDate)->get());
        if (priceCol.isShow) {
            const QString priceValue = calcItem.price <= .0 ? "-" : QString::number(calcItem.price, f, priceCol.prec);
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setText(priceValue)->get());
        }
        if (litersCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.liters, f, litersCol.prec)->get());
        if (fatCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.fat, f, fatCol.prec)->get());
        if (proteinCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.protein, f, proteinCol.prec)->get());
        if (fatUnitsCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.fatUnits, f, fatUnitsCol.prec)->get());
        if (rankWeightCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.rankWeight, f, rankWeightCol.prec)->get());
        if (payCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.paymentWithOutPremium, f, payCol.prec)->get());
        if (premiumCol.isShow)
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.premiumForFat, f, premiumCol.prec)->get());
        if (sumCol.isShow) {
            ui->tableWidgetCalc->setItem(row, c++, itemBuilder.setNum(calcItem.sum, f, sumCol.prec)->get());
        }
    };

    for (const auto &deliverer: deliverers) {
        CalculatedItem::Data delivererResult;
        itemBuilder.setBackColor(settingsCalc.textBackColor);
        itemBuilder.setFont(settingsCalc.textFont);

        for (const auto &milkReception: deliverer->milkReceptions()) {
            const auto mr = milkReception.data();
            const CalculatedItem::Data calcItem = mr->getCalculations().data();

            addCalcItems(deliverer->name(), mr->milkPoint().data()->name(),
                         mr->deliveryDate().toString(dateFromat), calcItem);

            delivererResult += calcItem;
            ++row;
        }

        itemBuilder.setBackColor(settingsCalc.delivResultColor);
        itemBuilder.setFont(settingsCalc.delivResultFont);

        addCalcItems(deliverer->name(), "-", "-", delivererResult);

        allResult += delivererResult;
        ++row;
    }

    itemBuilder.setBackColor(settingsCalc.allResultColor);
    itemBuilder.setFont(settingsCalc.allResultFont);
    addCalcItems("Итого", "-", "-", allResult);
}