1 /***************************************************************************
2                           addconstraintactivitytagsnotoverlappingform.cpp  -  description
3                              -------------------
4     begin                : 2019
5     copyright            : (C) 2019 by Lalescu Liviu
6     email                : Please see https://lalescu.ro/liviu/ for details about contacting Liviu Lalescu (in particular, you can find here the e-mail address)
7  ***************************************************************************/
8 
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software: you can redistribute it and/or modify  *
12  *   it under the terms of the GNU Affero General Public License as        *
13  *   published by the Free Software Foundation, either version 3 of the    *
14  *   License, or (at your option) any later version.                       *
15  *                                                                         *
16  ***************************************************************************/
17 
18 #include <QMessageBox>
19 
20 #include "longtextmessagebox.h"
21 
22 #include "addconstraintactivitytagsnotoverlappingform.h"
23 
24 #include <QListWidget>
25 #include <QAbstractItemView>
26 #include <QScrollBar>
27 
AddConstraintActivityTagsNotOverlappingForm(QWidget * parent)28 AddConstraintActivityTagsNotOverlappingForm::AddConstraintActivityTagsNotOverlappingForm(QWidget* parent): QDialog(parent)
29 {
30 	setupUi(this);
31 
32 	addConstraintPushButton->setDefault(true);
33 
34 	activityTagsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
35 	notOverlappingActivityTagsListWidget->setSelectionMode(QAbstractItemView::SingleSelection);
36 
37 	connect(closePushButton, SIGNAL(clicked()), this, SLOT(close()));
38 	connect(addConstraintPushButton, SIGNAL(clicked()), this, SLOT(addConstraint()));
39 	connect(activityTagsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(addActivityTag()));
40 	connect(addAllActivityTagsPushButton, SIGNAL(clicked()), this, SLOT(addAllActivityTags()));
41 	connect(notOverlappingActivityTagsListWidget, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(removeActivityTag()));
42 	connect(clearPushButton, SIGNAL(clicked()), this, SLOT(clear()));
43 
44 	centerWidgetOnScreen(this);
45 	restoreFETDialogGeometry(this);
46 
47 	for(int i=0; i<gt.rules.activityTagsList.size(); i++){
48 		ActivityTag* st=gt.rules.activityTagsList[i];
49 		activityTagsListWidget->addItem(st->name);
50 	}
51 
52 	notOverlappingActivityTagsListWidget->clear();
53 }
54 
~AddConstraintActivityTagsNotOverlappingForm()55 AddConstraintActivityTagsNotOverlappingForm::~AddConstraintActivityTagsNotOverlappingForm()
56 {
57 	saveFETDialogGeometry(this);
58 }
59 
addConstraint()60 void AddConstraintActivityTagsNotOverlappingForm::addConstraint()
61 {
62 	TimeConstraint *ctr=nullptr;
63 
64 	double weight;
65 	QString tmp=weightLineEdit->text();
66 	weight_sscanf(tmp, "%lf", &weight);
67 	if(weight<0.0 || weight>100.0){
68 		QMessageBox::warning(this, tr("FET information"),
69 			tr("Invalid weight (percentage)"));
70 		return;
71 	}
72 
73 	if(notOverlappingActivityTagsListWidget->count()==0){
74 		QMessageBox::warning(this, tr("FET information"),
75 			tr("Empty list of not overlapping activity tags"));
76 		return;
77 	}
78 	if(notOverlappingActivityTagsListWidget->count()==1){
79 		QMessageBox::warning(this, tr("FET information"),
80 			tr("Only one selected activity tag"));
81 		return;
82 	}
83 
84 	QStringList atl;
85 	for(int i=0; i<notOverlappingActivityTagsListWidget->count(); i++)
86 		atl.append(notOverlappingActivityTagsListWidget->item(i)->text());
87 
88 	ctr=new ConstraintActivityTagsNotOverlapping(weight, atl);
89 	bool tmp2=gt.rules.addTimeConstraint(ctr);
90 
91 	if(tmp2){
92 		QString s=tr("Constraint added:");
93 		s+="\n\n";
94 		s+=ctr->getDetailedDescription(gt.rules);
95 		LongTextMessageBox::information(this, tr("FET information"), s);
96 	}
97 	else{
98 		QMessageBox::warning(this, tr("FET information"),
99 			tr("Constraint NOT added - please report error"));
100 		delete ctr;
101 	}
102 }
103 
addActivityTag()104 void AddConstraintActivityTagsNotOverlappingForm::addActivityTag()
105 {
106 	if(activityTagsListWidget->currentRow()<0)
107 		return;
108 
109 	QString actTagName=activityTagsListWidget->currentItem()->text();
110 	assert(actTagName!="");
111 	int i;
112 	//duplicate?
113 	for(i=0; i<notOverlappingActivityTagsListWidget->count(); i++)
114 		if(actTagName==notOverlappingActivityTagsListWidget->item(i)->text())
115 			break;
116 	if(i<notOverlappingActivityTagsListWidget->count())
117 		return;
118 	notOverlappingActivityTagsListWidget->addItem(actTagName);
119 	notOverlappingActivityTagsListWidget->setCurrentRow(notOverlappingActivityTagsListWidget->count()-1);
120 }
121 
addAllActivityTags()122 void AddConstraintActivityTagsNotOverlappingForm::addAllActivityTags()
123 {
124 	for(int tmp=0; tmp<activityTagsListWidget->count(); tmp++){
125 		QString actTagName=activityTagsListWidget->item(tmp)->text();
126 		assert(actTagName!="");
127 		int i;
128 		//duplicate?
129 		for(i=0; i<notOverlappingActivityTagsListWidget->count(); i++)
130 			if(notOverlappingActivityTagsListWidget->item(i)->text()==actTagName)
131 				break;
132 		if(i<notOverlappingActivityTagsListWidget->count())
133 			continue;
134 
135 		notOverlappingActivityTagsListWidget->addItem(actTagName);
136 	}
137 
138 	notOverlappingActivityTagsListWidget->setCurrentRow(notOverlappingActivityTagsListWidget->count()-1);
139 }
140 
removeActivityTag()141 void AddConstraintActivityTagsNotOverlappingForm::removeActivityTag()
142 {
143 	if(notOverlappingActivityTagsListWidget->currentRow()<0 || notOverlappingActivityTagsListWidget->count()<=0)
144 		return;
145 	int tmp=notOverlappingActivityTagsListWidget->currentRow();
146 
147 	notOverlappingActivityTagsListWidget->setCurrentRow(-1);
148 	QListWidgetItem* item=notOverlappingActivityTagsListWidget->takeItem(tmp);
149 	delete item;
150 	if(tmp<notOverlappingActivityTagsListWidget->count())
151 		notOverlappingActivityTagsListWidget->setCurrentRow(tmp);
152 	else
153 		notOverlappingActivityTagsListWidget->setCurrentRow(notOverlappingActivityTagsListWidget->count()-1);
154 }
155 
clear()156 void AddConstraintActivityTagsNotOverlappingForm::clear()
157 {
158 	notOverlappingActivityTagsListWidget->clear();
159 }
160