void IngredientInputWidget::updateInputs(bool on, IngredientInput* input) { QList<IngredientInput*>::iterator curr; if (m_ingInputs.indexOf(input) == -1) curr = m_ingInputs.end(); else curr = m_ingInputs.begin()+m_ingInputs.indexOf(input); IngredientInput *prev_input = *curr; ++curr; if ( on ) { IngredientInput *new_input = new IngredientInput(database,this,false); new_input->reloadCombos(); QWidget::setTabOrder( prev_input, new_input ); new_input->updateTabOrder(); connect( new_input, SIGNAL(addIngredient()), this, SLOT(addIngredient()) ); connect( new_input, SIGNAL(orToggled(bool,IngredientInput*)), this, SLOT(updateInputs(bool,IngredientInput*)) ); new_input->show(); m_ingInputs.insert(curr,new_input); m_ingInputs[0]->enableHeader(false); } else { while ( curr != m_ingInputs.end() ) {
IngredientInputWidget::IngredientInputWidget( RecipeDB *db, QWidget *parent ) : KVBox(parent), database(db) { setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Fixed ) ); m_ingInputs.append(new IngredientInput(database,this)); // Connect signals & Slots connect( m_ingInputs[0], SIGNAL(addIngredient()), this, SLOT(addIngredient()) ); connect( m_ingInputs[0], SIGNAL(orToggled(bool,IngredientInput*)), this, SLOT(updateInputs(bool,IngredientInput*)) ); reloadCombos(); }
void IngredientInput::signalIngredient() { //validate input; if successful, emit signal if ( isHeader() ) { if ( header().isEmpty() ) return; } else { if ( !isInputValid() ) return; } emit addIngredient(); }
void Inventory::addStock(Ingredient ingredientToAdd, int quantityToAdd) { if(ifInStock(ingredientToAdd)) { ingredientsInStock.at(searchForIngredient(ingredientToAdd)).addUnits(quantityToAdd); }// if(ingredientToAdd.ifInStock()) else { addIngredient(ingredientToAdd); }// else of if(ingredientToAdd.ifInStock()) }// void Inventory::addStock(Ingredient ingredientToAdd, int quantityToAdd)
void Inventory::ingredientQuanitityAdjustment(Ingredient ingredientbeingChanged, int newQuantity) { if(ifInStock(ingredientbeingChanged)) { ingredientsInStock.at(searchForIngredient(ingredientbeingChanged)).setQuantity(newQuantity); }// if(isInStock(ingredientbeingChanged)) else { ingredientbeingChanged.setQuantity(newQuantity); addIngredient(ingredientbeingChanged); }// if(isInStock(ingredientbeingChanged)) }// void Inventory::ingredientQuanitityAdjustment(Ingredient ingredientbeingChanged, int newQuantity)
View::View(QWidget *parent, Recipe *recipe) : QWidget(parent), recipe_(recipe), grainmodel_(0), hopmodel_(0), miscmodel_(0), notepage_(0) { ui.setupUi(this); // get current font information QFont bold(font()); bold.setBold(true); QFontMetrics fm(font()); unsigned mh = (unsigned)(fm.lineSpacing() * 1.5); unsigned mw = fm.width('M'); // additional setup ui.ogreclabel->setFont(bold); ui.ogrec->setFont(bold); ui.ibureclabel->setFont(bold); ui.iburec->setFont(bold); ui.srmreclabel->setFont(bold); ui.srmrec->setFont(bold); ui.abvlabel->setFont(bold); ui.abv->setFont(bold); ui.abwlabel->setFont(bold); ui.abw->setFont(bold); ui.fglabel->setFont(bold); ui.fg->setFont(bold); // grain page QWidget *widget = new QWidget(); grainpage.setupUi(widget); ui.ingredients->addTab(widget, tr("&Grains")); grainmodel_ = new GrainModel(this, recipe_->grains()); grainpage.view->setModel(grainmodel_); QItemDelegate *delegate = new GrainDelegate(this); grainpage.view->setItemDelegate(delegate); grainpage.view->verticalHeader()->setDefaultSectionSize(mh); grainpage.view->verticalHeader()->hide(); grainpage.view->horizontalHeader()->setClickable(true); grainpage.view->horizontalHeader()->setHighlightSections(false); grainpage.view->setColumnWidth(GrainModel::NAME, 20*mw); grainpage.view->setColumnWidth(GrainModel::WEIGHT, 8*mw); grainpage.view->setColumnWidth(GrainModel::EXTRACT, 8*mw); grainpage.view->setColumnWidth(GrainModel::COLOR, 8*mw); grainpage.view->setColumnWidth(GrainModel::TYPE, 8*mw); grainpage.view->setColumnWidth(GrainModel::USE, 8*mw); // hop page widget = new QWidget(); hoppage.setupUi(widget); ui.ingredients->addTab(widget, tr("&Hops")); hopmodel_ = new HopModel(this, recipe_->hops()); hoppage.view->setModel(hopmodel_); delegate = new HopDelegate(this); hoppage.view->setItemDelegate(delegate); hoppage.view->verticalHeader()->setDefaultSectionSize(mh); hoppage.view->verticalHeader()->hide(); hoppage.view->horizontalHeader()->setClickable(true); hoppage.view->horizontalHeader()->setHighlightSections(false); hoppage.view->setColumnWidth(HopModel::NAME, 20*mw); hoppage.view->setColumnWidth(HopModel::WEIGHT, 8*mw); hoppage.view->setColumnWidth(HopModel::ALPHA, 8*mw); hoppage.view->setColumnWidth(HopModel::TIME, 8*mw); hoppage.view->setColumnWidth(HopModel::TYPE, 8*mw); // misc page widget = new QWidget(); miscpage.setupUi(widget); ui.ingredients->addTab(widget, tr("&Miscellaneous")); miscmodel_ = new MiscModel(this, recipe_->miscs()); miscpage.view->setModel(miscmodel_); delegate = new MiscDelegate(this); miscpage.view->setItemDelegate(delegate); miscpage.view->verticalHeader()->setDefaultSectionSize(mh); miscpage.view->verticalHeader()->hide(); miscpage.view->horizontalHeader()->setClickable(true); miscpage.view->horizontalHeader()->setHighlightSections(false); miscpage.view->setColumnWidth(MiscModel::NAME, 20*mw); miscpage.view->setColumnWidth(MiscModel::QUANTITY, 8*mw); miscpage.view->setColumnWidth(MiscModel::TYPE, 8*mw); miscpage.view->horizontalHeader()->setStretchLastSection(true); // note page notepage_ = new NotePage(0, recipe_); ui.ingredients->addTab(notepage_, tr("&Notes")); // set icons QIcon icon = QIcon(":/icons/22x22/list-add.png"); icon.addFile(":/icons/16x16/list-add.png"); grainpage.addbutton->setIcon(icon); hoppage.addbutton->setIcon(icon); miscpage.addbutton->setIcon(icon); icon = QIcon(":/icons/22x22/list-remove.png"); icon.addFile(":/icons/16x16/list-remove.png"); grainpage.removebutton->setIcon(icon); hoppage.removebutton->setIcon(icon); miscpage.removebutton->setIcon(icon); // widget connections connect(grainmodel_, SIGNAL(modified()), this, SLOT(modelModified())); connect(grainpage.addbutton, SIGNAL(clicked()), grainpage.view, SLOT(addIngredient())); connect(grainpage.removebutton, SIGNAL(clicked()), grainpage.view, SLOT(removeIngredient())); connect(hopmodel_, SIGNAL(modified()), this, SLOT(modelModified())); connect(hoppage.addbutton, SIGNAL(clicked()), hoppage.view, SLOT(addIngredient())); connect(hoppage.removebutton, SIGNAL(clicked()), hoppage.view, SLOT(removeIngredient())); connect(miscmodel_, SIGNAL(modified()), this, SLOT(modelModified())); connect(miscpage.addbutton, SIGNAL(clicked()), miscpage.view, SLOT(addIngredient())); connect(miscpage.removebutton, SIGNAL(clicked()), miscpage.view, SLOT(removeIngredient())); connect(ui.titleedit, SIGNAL(textChanged(const QString &)), this, SLOT(setTitle(const QString &))); connect(ui.stylecombo, SIGNAL(activated(const QString &)), this, SLOT(setStyle(const QString &))); connect(ui.breweredit, SIGNAL(textChanged(const QString &)), this, SLOT(setBrewer(const QString &))); connect(ui.sizespin, SIGNAL(valueChanged(double)), this, SLOT(setSize(double))); connect(recipe_, SIGNAL(recipeChanged()), this, SLOT(flush())); connect(recipe_, SIGNAL(recipeModified()), this, SLOT(refresh())); // start with new view flush(); }
IngredientMatcherDialog::IngredientMatcherDialog( QWidget *parent, RecipeDB *db ) : QSplitter( parent ) { // Initialize internal variables database = db; //Design the dialog setOrientation( Qt::Vertical ); setChildrenCollapsible( false ); QWidget * upperBox = new QWidget( this ); // Ingredient list QHBoxLayout *layout2 = new QHBoxLayout; layout2->setObjectName( "layout2" ); allIngListView = new KreListView( this, QString(), true, 0 ); StdIngredientListView *list_view = new StdIngredientListView(allIngListView,database); list_view->setSelectionMode( Q3ListView::Multi ); allIngListView->setListView(list_view); layout2->addWidget( allIngListView ); allIngListView->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); QVBoxLayout *layout1 = new QVBoxLayout; layout1->addStretch(); layout1->setObjectName( "layout1" ); addButton = new KPushButton; addButton->setObjectName( "addButton" ); addButton->setIcon( KIcon( "arrow-right" ) ); addButton->setFixedSize( QSize( 32, 32 ) ); layout1->addWidget( addButton ); removeButton = new KPushButton; removeButton->setObjectName( "removeButton" ); removeButton->setIcon( KIcon( "arrow-left" ) ); removeButton->setFixedSize( QSize( 32, 32 ) ); layout1->addWidget( removeButton ); layout1->addStretch(); layout2->addLayout( layout1 ); ingListView = new KreListView( this, QString(), true ); ingListView->listView() ->addColumn( i18nc( "@title:column", "Ingredient (required?)" ) ); ingListView->listView() ->addColumn( i18nc( "@title:column", "Amount Available" ) ); layout2->addWidget( ingListView ); upperBox->setLayout( layout2 ); addWidget( upperBox ); ingListView->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); KVBox * lowerBox = new KVBox( this ); // Box to select allowed number of missing ingredients missingBox = new KHBox( lowerBox ); missingNumberLabel = new QLabel( missingBox ); missingNumberLabel->setText( i18nc( "@label:spinbox Number of missing ingredients allowed when doing a search by ingredients", "Missing ingredients allowed:" ) ); missingNumberSpinBox = new KIntSpinBox( missingBox ); missingNumberSpinBox->setMinimum( -1 ); missingNumberSpinBox->setSpecialValueText( i18nc( "@item Any amount of ingredients missing when doing a search by ingredients", "Any" ) ); // Found recipe list recipeListView = new KreListView( lowerBox, i18nc( "@title", "Matching Recipes" ), false, 1, missingBox ); recipeListView->listView() ->setAllColumnsShowFocus( true ); recipeListView->listView() ->addColumn( i18nc( "@title:column Recipe Title", "Title" ) ); KConfigGroup config( KGlobal::config(), "Advanced" ); bool show_id = config.readEntry( "ShowID", false ); recipeListView->listView() ->addColumn( "Id" , show_id ? -1 : 0 ); recipeListView->listView()->addColumn( i18nc( "@title:column Missing ingredients in a search result", "Missing Ingredients" ) ); recipeListView->listView() ->setSorting( -1 ); recipeListView->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); actionHandler = new RecipeActionsHandler( recipeListView->listView(), database ); KHBox *buttonBox = new KHBox( lowerBox ); okButton = new KPushButton( buttonBox ); okButton->setIcon( KIcon( "dialog-ok" ) ); okButton->setText( i18nc( "@action:button", "Find matching recipes" ) ); //buttonBox->layout()->addItem( new QSpacerItem( 10,10, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed ) ); clearButton = new KPushButton( buttonBox ); clearButton->setIcon( KIcon( "edit-clear" ) ); clearButton->setText( i18nc( "@action:button Clear search criteria", "Clear" ) ); addWidget( lowerBox ); // Connect signals & slots connect ( okButton, SIGNAL( clicked() ), this, SLOT( findRecipes() ) ); connect ( clearButton, SIGNAL( clicked() ), recipeListView->listView(), SLOT( clear() ) ); connect ( clearButton, SIGNAL( clicked() ), this, SLOT( unselectIngredients() ) ); connect( recipeListView->listView(), SIGNAL( selectionChanged() ), this, SLOT( haveSelectedItems() ) ); connect ( actionHandler, SIGNAL( recipeSelected( int, int ) ), SIGNAL( recipeSelected( int, int ) ) ); connect( addButton, SIGNAL( clicked() ), this, SLOT( addIngredient() ) ); connect( removeButton, SIGNAL( clicked() ), this, SLOT( removeIngredient() ) ); connect( ingListView->listView(), SIGNAL( doubleClicked( Q3ListViewItem*, const QPoint &, int ) ), SLOT( itemRenamed( Q3ListViewItem*, const QPoint &, int ) ) ); }