Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
Commit precedente: creata feature #2

Risolto bug: #11

Aggiunti i permessi all'app android di produzione, per accedere ad Internet (necessari per le richieste http);

ViewSettings:
+ aggiunto handle per mostrare un avviso quando il caricamento si blocca;

ViewQuestions:
+ refactor: Aggiornato il modo in cui vengono passati i parametri (e anche come viene costruito il widget);
+ Ora è possibile visualizzare la lista di domande del pool corrente (lista domande degli argomenti selezionati);
+ ora la ricerca ignora la distinzione maiuscole/minuscole;
  • Loading branch information
mikyll committed Aug 1, 2023
1 parent 5c0fed8 commit 9d55fd5
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 67 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,7 @@
android:name="flutterEmbedding"
android:value="2" />
</application>
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
</manifest>
100 changes: 50 additions & 50 deletions app-mobile/flutter_application/lib/views/ViewQuestions.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@ import 'package:roquiz/persistence/QuestionRepository.dart';
import 'package:roquiz/widget/question_widget.dart';

class ViewQuestions extends StatefulWidget {
const ViewQuestions(
{Key? key, required this.title, required this.qRepo, this.iTopic});
const ViewQuestions({Key? key, required this.title, required this.questions});

final String title;
final QuestionRepository qRepo;
final int? iTopic;
final List<Question> questions;

@override
State<StatefulWidget> createState() => ViewQuestionsState();
Expand All @@ -22,8 +20,10 @@ class ViewQuestionsState extends State<ViewQuestions> {
ScrollController _scrollController = ScrollController();
TextEditingController _textController = TextEditingController();

List<Question> questionsFullList = [];
List<Question> questions = [];
bool multipleTopics = false;

//List<Question> questionsFullList = [];
List<Question> displayedQuestions = [];
int qNum = 0;
int offset = 0;

Expand All @@ -34,52 +34,48 @@ class ViewQuestionsState extends State<ViewQuestions> {
super.initState();

setState(() {
qNum = widget.qRepo.questions.length;

if (widget.iTopic != null) {
// get starting offset
for (int i = 0;; i++) {
qNum = widget.qRepo.getQuestionNumPerTopic()[i];
if (i >= widget.iTopic!) break;
offset += qNum;
}
}
qNum = widget.questions.length;

// get question list
for (int i = offset; i < offset + qNum; i++) {
Question q = widget.qRepo.questions[i];
questionsFullList.add(q);
questions.add(q);
Question q = widget.questions[i];

if (i >= 1 && !multipleTopics) {
multipleTopics = widget.questions[i - 1].topic != q.topic;
}
displayedQuestions.add(q);
}
});
}

double _getWidth() {
return PlatformDispatcher.instance.views.first.physicalSize.width /
PlatformDispatcher.instance.views.first.devicePixelRatio;
}

void _clearSearch() {
questions.clear();
displayedQuestions.clear();
setState(() {
for (int i = offset; i < questionsFullList.length; i++) {
questions.add(questionsFullList[i]);
for (int i = offset; i < widget.questions.length; i++) {
displayedQuestions.add(widget.questions[i]);
}
});
}

void _search(String value) {
value = value.toLowerCase();

_scrollController.jumpTo(0.0);
setState(() {
questions.clear();
for (int i = 0; i < questionsFullList.length; i++) {
if (questionsFullList[i].question.contains(value)) {
questions.add(questionsFullList[i]);
displayedQuestions.clear();

// Loop over the question list
for (int i = 0; i < widget.questions.length; i++) {
// Check if contained in question
if (widget.questions[i].question.toLowerCase().contains(value)) {
displayedQuestions.add(widget.questions[i]);
continue;
}
for (int j = 0; j < questionsFullList[i].answers.length; j++) {
if (questionsFullList[i].answers[j].contains(value)) {
questions.add(questionsFullList[i]);

// Check if contained in answers
for (int j = 0; j < widget.questions[i].answers.length; j++) {
if (widget.questions[i].answers[j].toLowerCase().contains(value)) {
displayedQuestions.add(widget.questions[i]);
break;
}
}
Expand Down Expand Up @@ -126,7 +122,7 @@ class ViewQuestionsState extends State<ViewQuestions> {
onSearch: (stringToSearch) {
//print("search");
_search(stringToSearch);
if (questions.isEmpty) {
if (displayedQuestions.isEmpty) {
_clearSearch();
_textController.clear();
}
Expand All @@ -150,14 +146,14 @@ class ViewQuestionsState extends State<ViewQuestions> {
padding: const EdgeInsets.all(8.0),
child: ListView.builder(
controller: _scrollController,
itemCount: questions.length,
itemCount: displayedQuestions.length,
itemBuilder: (context, index) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5.0),
child: widget.iTopic == null &&
child: multipleTopics &&
(index == 0 ||
questions[index].topic !=
questions[index - 1].topic)
displayedQuestions[index].topic !=
displayedQuestions[index - 1].topic)
? Column(
children: [
Padding(
Expand All @@ -168,7 +164,7 @@ class ViewQuestionsState extends State<ViewQuestions> {
padding:
const EdgeInsets.only(right: 10.0),
child: Text(
questions[index].topic,
displayedQuestions[index].topic,
style:
const TextStyle(color: Colors.grey),
),
Expand All @@ -178,14 +174,17 @@ class ViewQuestionsState extends State<ViewQuestions> {
),
),
QuestionWidget(
questionNumber: questions[index].id,
questionText: questions[index].question,
questionNumber: displayedQuestions[index].id,
questionText:
displayedQuestions[index].question,
alignmentQuestion: Alignment.centerLeft,
answers: questions[index].answers,
answers: displayedQuestions[index].answers,
isOver: true,
userAnswer: questions[index].correctAnswer,
userAnswer:
displayedQuestions[index].correctAnswer,
onTapAnswer: (_) => null,
correctAnswer: questions[index].correctAnswer,
correctAnswer:
displayedQuestions[index].correctAnswer,
backgroundQuizColor:
Colors.cyan.withOpacity(0.1),
defaultAnswerColor:
Expand All @@ -202,14 +201,15 @@ class ViewQuestionsState extends State<ViewQuestions> {
],
)
: QuestionWidget(
questionNumber: questions[index].id,
questionText: questions[index].question,
questionNumber: displayedQuestions[index].id,
questionText: displayedQuestions[index].question,
alignmentQuestion: Alignment.centerLeft,
answers: questions[index].answers,
answers: displayedQuestions[index].answers,
isOver: true,
userAnswer: questions[index].correctAnswer,
userAnswer: displayedQuestions[index].correctAnswer,
onTapAnswer: (_) => null,
correctAnswer: questions[index].correctAnswer,
correctAnswer:
displayedQuestions[index].correctAnswer,
backgroundQuizColor: Colors.cyan.withOpacity(0.1),
defaultAnswerColor: Colors.indigo.withOpacity(0.2),
selectedAnswerColor: Colors.indigo.withOpacity(0.5),
Expand Down
21 changes: 17 additions & 4 deletions app-mobile/flutter_application/lib/views/ViewSettings.dart
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ class ViewSettingsState extends State<ViewSettings> {
widget.qRepo.updateQuestionsDate(QuestionRepository.CUSTOM_DATE);
await widget.qRepo.updateQuestionsFile(content);
}

_showConfirmationDialog(
context,
res > 0 ? "File Caricato" : "File Non Valido",
Expand All @@ -80,11 +81,10 @@ class ViewSettingsState extends State<ViewSettings> {
null,
() => Navigator.pop(context),
);

setState(() {
_isLoading = false;
});
}
setState(() {
_isLoading = false;
});
}

void _checkNewQuestions() {
Expand Down Expand Up @@ -130,6 +130,19 @@ class ViewSettingsState extends State<ViewSettings> {
() => Navigator.pop(context),
);
}
}).onError((error, stackTrace) {
setState(() {
_isLoading = false;
});
_showConfirmationDialog(
context,
"Errore Durante il Controllo",
error.toString(),
"",
"Ok",
null,
() => Navigator.pop(context),
);
});
}

Expand Down
71 changes: 58 additions & 13 deletions app-mobile/flutter_application/lib/views/ViewTopics.dart
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:roquiz/model/Question.dart';
import 'package:roquiz/persistence/QuestionRepository.dart';
import 'package:roquiz/persistence/Settings.dart';
import 'package:roquiz/widget/topics_widget.dart';
Expand Down Expand Up @@ -85,6 +86,36 @@ class ViewTopicsState extends State<ViewTopics> {
});
}

List<Question> _getTopicQuestions(int iTopic) {
List<Question> res = [];
String topic = widget.qRepo.topics[iTopic];

for (int i = 0; i < widget.qRepo.questions.length; i++) {
if (widget.qRepo.questions[i].topic == topic) {
res.add(widget.qRepo.questions[i]);
}
}

return res;
}

List<Question> _getPoolFromSelected() {
List<Question> res = [];
for (int i = 0, j = 0; i < widget.selectedTopics.length; i++) {
if (widget.selectedTopics[i]) {
for (int k = 0;
k < widget.qRepo.getQuestionNumPerTopic()[i];
j++, k++) {
res.add(widget.qRepo.getQuestions()[j]);
}
} else {
j += widget.qRepo.getQuestionNumPerTopic()[i];
}
}

return res;
}

@override
void initState() {
super.initState();
Expand Down Expand Up @@ -125,8 +156,9 @@ class ViewTopicsState extends State<ViewTopics> {
context,
MaterialPageRoute(
builder: (context) => ViewQuestions(
title: "Lista domande",
qRepo: widget.qRepo,
title:
"Lista domande (${widget.qRepo.questions.length})",
questions: widget.qRepo.questions,
)));
},
),
Expand All @@ -139,26 +171,39 @@ class ViewTopicsState extends State<ViewTopics> {
crossAxisAlignment: CrossAxisAlignment.center,
children: [
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ViewQuestions(
title:
"Lista domande (${widget.qRepo.questions.length})",
questions: widget.qRepo.questions,
)));
},
child: TopicsInfoWidget(
text: "Domande Totali: ",
value: widget.qRepo.questions.length,
color: Colors.indigo.withOpacity(0.35),
),
),
InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => ViewQuestions(
title: "Lista domande",
qRepo: widget.qRepo,
title:
"Pool corrente (${_getPoolFromSelected().length})",
questions: _getPoolFromSelected(),
)));
},
),
TopicsInfoWidget(
text: "Pool Corrente: ",
textWeight: FontWeight.bold,
value: _currentQuizPool,
color: Colors.indigo.withOpacity(0.35),
child: TopicsInfoWidget(
text: "Pool Corrente: ",
textWeight: FontWeight.bold,
value: _currentQuizPool,
color: Colors.indigo.withOpacity(0.35),
),
),
TopicsInfoWidget(
text: "Domande per Quiz: ",
Expand Down Expand Up @@ -188,9 +233,9 @@ class ViewTopicsState extends State<ViewTopics> {
context,
MaterialPageRoute(
builder: (context) => ViewQuestions(
title: widget.qRepo.topics[index],
qRepo: widget.qRepo,
iTopic: index)));
title: widget.qRepo.topics[index],
questions: _getTopicQuestions(index),
)));
},
text: " ${widget.qRepo.topics[index]}",
questionNum: widget.qRepo.getQuestionNumPerTopic()[index],
Expand Down

0 comments on commit 9d55fd5

Please sign in to comment.