diff --git a/swad_changelog.h b/swad_changelog.h index fffffc5e..34fafcbf 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -219,13 +219,14 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 16.187.3 (2017-04-24)" +#define Log_PLATFORM_VERSION "SWAD 16.188 (2017-04-24)" #define CSS_FILE "swad16.185.3.css" #define JS_FILE "swad16.181.js" // Number of lines (includes comments but not blank lines) has been got with the following command: // nl swad*.c swad*.h css/swad*.css py/swad*.py js/swad*.js soap/swad*?.h sql/swad*.sql | tail -1 /* + Version 16.188: Apr 24, 2017 Changes in timetable. Not finished. (218029 lines) Version 16.187.3: Apr 24, 2017 Changes in timetable. Not finished. (218040 lines) Version 16.187.2: Apr 24, 2017 Changes in timetable. Not finished. (217963 lines) Version 16.187.1: Apr 24, 2017 Changes in timetable. Not finished. (217958 lines) diff --git a/swad_global.h b/swad_global.h index 7519fc29..1744a3a4 100644 --- a/swad_global.h +++ b/swad_global.h @@ -623,11 +623,11 @@ struct Globals struct { TT_TimeTableType_t Type; - unsigned Day; - unsigned HourOld; + unsigned Weekday; + unsigned Interval; unsigned Column; TT_ClassType_t ClassType; - unsigned DurationOld; + unsigned DurationNumIntervals; char Place[TT_MAX_BYTES_PLACE + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; long GrpCod; // Group code (-1 if no group selected) diff --git a/swad_timetable.c b/swad_timetable.c index 77133ad9..116194c1 100644 --- a/swad_timetable.c +++ b/swad_timetable.c @@ -50,22 +50,29 @@ extern struct Globals Gbl; /*************************** Internal constants ******************************/ /*****************************************************************************/ +#define TT_DAYS_PER_WEEK 7 // Seven days per week + +#define TT_MINUTES_PER_HOUR 60 // Number of minutes in 1 hour +#define TT_SECONDS_PER_MINUTE 60 // Number of seconds in 1 minute + #define TT_START_HOUR 6 // Day starts at 6:00 #define TT_END_HOUR 24 // Day ends at 24:00 -#define TT_HOURS_PER_DAY (TT_END_HOUR - TT_START_HOUR) // From 6:00 to 24:00 -#define TT_INTERVALS_5_MINUTES_PER_HOUR 12 -#define TT_INTERVALS_5_MINUTES_PER_DAY (TT_HOURS_PER_DAY * TT_INTERVALS_5_MINUTES_PER_HOUR) -#define TT_INTERVALS_5_MINUTES_BEFORE_START_HOUR (TT_START_HOUR * TT_INTERVALS_5_MINUTES_PER_HOUR) -#define TT_SECONDS_IN_1_MINUTE 60 // Number of seconds in 1 minute -#define TT_SECONDS_IN_5_MINUTES (5 * TT_SECONDS_IN_1_MINUTE) // Number of seconds in 5 minutes +#define TT_HOURS_PER_DAY (TT_END_HOUR - TT_START_HOUR) // From 6:00 to 24:00 + +#define TT_MINUTES_PER_INTERVAL 5 +#define TT_SECONDS_PER_INTERVAL (TT_MINUTES_PER_INTERVAL * TT_SECONDS_PER_MINUTE) + +#define TT_INTERVALS_PER_HOUR (TT_MINUTES_PER_HOUR / TT_MINUTES_PER_INTERVAL) +#define TT_INTERVALS_PER_DAY (TT_INTERVALS_PER_HOUR * TT_HOURS_PER_DAY) +#define TT_INTERVALS_BEFORE_START_HOUR (TT_INTERVALS_PER_HOUR * TT_START_HOUR) -#define TT_DAYS 7 // Seven days per week #define TT_MAX_COLUMNS_PER_CELL 3 // Maximum number of items (i.e. classes) in a timetable cell (1, 2, 3 or 4) #define TT_NUM_MINICOLUMNS_PER_DAY 6 // Least common multiple of 1,2,3,...,TT_MAX_COLUMNS_PER_CELL + #define TT_PERCENT_WIDTH_OF_A_MINICOLUMN 2 // Width (%) of each minicolumn #define TT_PERCENT_WIDTH_OF_A_DAY (TT_PERCENT_WIDTH_OF_A_MINICOLUMN * TT_NUM_MINICOLUMNS_PER_DAY) // Width (%) of each day -#define TT_PERCENT_WIDTH_OF_ALL_DAYS (TT_PERCENT_WIDTH_OF_A_DAY * TT_DAYS) // Width (%) of all days -#define TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN 1 // Width (%) of left and right columns (frame) +#define TT_PERCENT_WIDTH_OF_ALL_DAYS (TT_PERCENT_WIDTH_OF_A_DAY * TT_DAYS_PER_WEEK) // Width (%) of all days +#define TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN 1 // Width (%) of left and right columns (frame) #define TT_PERCENT_WIDTH_OF_AN_HOUR_COLUMN ((100 - TT_PERCENT_WIDTH_OF_ALL_DAYS - TT_PERCENT_WIDTH_OF_A_SEPARATION_COLUMN * 2) / 2) // Width (%) of the separation columns #define TT_MAX_BYTES_STR_CLASS_TYPE 256 @@ -87,32 +94,13 @@ char *TimeTableStrsClassTypeDB[TT_NUM_CLASS_TYPES] = "tutoring", }; -char *TimeTableStrsClassTypeOldDB[TT_NUM_CLASS_TYPES] = // TODO: Remove - { - "libre", - "teoria", - "practicas", - "tutorias", - }; -char TimeTableCharsDaysOld[TT_DAYS] = // TODO: Remove - { - 'L', // Monday - 'M', // Tuesday - 'X', // Wednesday - 'J', // Thursday - 'V', // Friday - 'S', // Saturday - 'D', // Sunday - }; - struct TimeTableColumn { long CrsCod; // Course code (-1 if no course selected) long GrpCod; // Group code (-1 if no group selected) - TT_HourType_t HourType; + TT_IntervalType_t IntervalType; TT_ClassType_t ClassType; - unsigned DurationNumIntervals5Minutes; - unsigned DurationOld; // TODO: Remove + unsigned DurationNumIntervals; char Place[TT_MAX_BYTES_PLACE + 1]; char Group[Grp_MAX_BYTES_GROUP_NAME + 1]; }; @@ -121,15 +109,9 @@ struct { unsigned NumColumns; struct TimeTableColumn Columns[TT_MAX_COLUMNS_PER_CELL]; - } TimeTableOld[TT_DAYS][TT_HOURS_PER_DAY * TT_INTERVALS_5_MINUTES_PER_HOUR]; + } TT_TimeTable[TT_DAYS_PER_WEEK][TT_INTERVALS_PER_DAY]; -struct - { - unsigned NumColumns; - struct TimeTableColumn Columns[TT_MAX_COLUMNS_PER_CELL]; - } TT_TimeTable[TT_DAYS][TT_HOURS_PER_DAY * TT_INTERVALS_5_MINUTES_PER_HOUR]; - -bool TimeTableHoursChecked[TT_HOURS_PER_DAY * TT_INTERVALS_5_MINUTES_PER_HOUR]; +bool TimeTableHoursChecked[TT_INTERVALS_PER_DAY]; /*****************************************************************************/ /***************************** Internal prototypes **************************/ @@ -150,12 +132,12 @@ static void TT_ModifTimeTable (void); static void TT_DrawTimeTable (void); static void TT_TimeTableDrawAdjustRow (void); static void TT_TimeTableDrawDaysCells (void); -static void TT_TimeTableDrawHourCell (unsigned HourOld,unsigned Min,const char *Align); -static unsigned TT_TimeTableCalculateColsToDraw (unsigned Day,unsigned HourOld); +static void TT_TimeTableDrawHourCell (unsigned Hour,unsigned Min,const char *Align); +static unsigned TT_TimeTableCalculateColsToDraw (unsigned Weekday,unsigned Interval); static void TT_DrawCellAlignTimeTable (void); -static void TT_TimeTableDrawCell (unsigned Day,unsigned HourOld,unsigned Column,unsigned ColSpan, - long CrsCod,TT_HourType_t HourType,TT_ClassType_t ClassType, - unsigned DurationOld,char *Group,long GrpCod,char *Place); +static void TT_TimeTableDrawCell (unsigned Weekday,unsigned Interval,unsigned Column,unsigned ColSpan, + long CrsCod,TT_IntervalType_t IntervalType,TT_ClassType_t ClassType, + unsigned DurationNumIntervals,char *Group,long GrpCod,char *Place); /*****************************************************************************/ /*********** Show whether only my groups or all groups are shown *************/ @@ -192,18 +174,18 @@ static void TT_GetParamsTimeTable (void) unsigned Minutes; /***** Get day (0: monday, 1: tuesday,..., 6: sunday *****/ - Gbl.TimeTable.Day = (unsigned) - Par_GetParToUnsignedLong ("ModTTDay", - 0, - TT_DAYS - 1, - 0); + Gbl.TimeTable.Weekday = (unsigned) + Par_GetParToUnsignedLong ("ModTTDay", + 0, + TT_DAYS_PER_WEEK - 1, + 0); /***** Get hour *****/ - Gbl.TimeTable.HourOld = (unsigned) - Par_GetParToUnsignedLong ("ModTTHour", - 0, - TT_HOURS_PER_DAY * 2 - 1, - 0); + Gbl.TimeTable.Interval = (unsigned) + Par_GetParToUnsignedLong ("ModTTHour", + 0, + TT_HOURS_PER_DAY * 2 - 1, + 0); /***** Get number of column *****/ Gbl.TimeTable.Column = (unsigned) @@ -217,7 +199,7 @@ static void TT_GetParamsTimeTable (void) for (Gbl.TimeTable.ClassType = (TT_ClassType_t) 0; Gbl.TimeTable.ClassType < (TT_ClassType_t) TT_NUM_CLASS_TYPES; Gbl.TimeTable.ClassType++) - if (!strcmp (StrClassType,TimeTableStrsClassTypeOldDB[Gbl.TimeTable.ClassType])) + if (!strcmp (StrClassType,TimeTableStrsClassTypeDB[Gbl.TimeTable.ClassType])) break; if (Gbl.TimeTable.ClassType == (TT_ClassType_t) TT_NUM_CLASS_TYPES) Lay_ShowErrorAndExit ("Type of timetable cell is missing."); @@ -226,7 +208,8 @@ static void TT_GetParamsTimeTable (void) Par_GetParToText ("ModTTDur",StrDuration,TT_MAX_BYTES_STR_DURATION); if (sscanf (StrDuration,"%u:%u",&Hours,&Minutes) != 2) Lay_ShowErrorAndExit ("Duration is missing."); - Gbl.TimeTable.DurationOld = Hours * 2 + Minutes / 30; + Gbl.TimeTable.DurationNumIntervals = Hours * TT_INTERVALS_PER_HOUR + + Minutes / TT_MINUTES_PER_INTERVAL; /***** Get group code *****/ Gbl.TimeTable.GrpCod = Par_GetParToLong ("ModTTGrpCod"); @@ -485,7 +468,7 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod) TT_MAX_BYTES_PLACE + Grp_MAX_BYTES_GROUP_NAME]; unsigned Weekday; - unsigned Interval5Minutes; + unsigned Interval; unsigned Hour; unsigned Min; unsigned Column; @@ -497,18 +480,18 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod) /***** Go across the timetable inserting classes into database *****/ for (Weekday = 0; - Weekday < TT_DAYS; + Weekday < TT_DAYS_PER_WEEK; Weekday++) - for (Interval5Minutes = 0, Hour = TT_START_HOUR, Min = 0; - Interval5Minutes < TT_INTERVALS_5_MINUTES_PER_DAY; - Interval5Minutes++, - Hour += (Min + 5) / TT_SECONDS_IN_1_MINUTE, - Min = (Min + 5) % TT_SECONDS_IN_1_MINUTE) + for (Interval = 0, Hour = TT_START_HOUR, Min = 0; + Interval < TT_INTERVALS_PER_DAY; + Interval++, + Hour += (Min + TT_MINUTES_PER_INTERVAL) / TT_SECONDS_PER_MINUTE, + Min = (Min + TT_MINUTES_PER_INTERVAL) % TT_SECONDS_PER_MINUTE) for (Column = 0; Column < TT_MAX_COLUMNS_PER_CELL; Column++) - if (TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].HourType == TT_FIRST_HOUR && - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].DurationNumIntervals5Minutes) + if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FIRST_INTERVAL && + TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals) { sprintf (Query,"INSERT INTO timetable_crs" " (CrsCod,GrpCod,Weekday,StartTime,Duration," @@ -517,13 +500,13 @@ static void TT_WriteCrsTimeTableIntoDB (long CrsCod) " (%ld,%ld,%u,'%02u:%02u:00',SEC_TO_TIME(%u)," "'%s','%s','%s')", CrsCod, - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].GrpCod, + TT_TimeTable[Weekday][Interval].Columns[Column].GrpCod, Weekday, Hour,Min, - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].DurationNumIntervals5Minutes * TT_SECONDS_IN_5_MINUTES, - TimeTableStrsClassTypeOldDB[TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].ClassType], - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].Place, - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].Group); + TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals * TT_SECONDS_PER_INTERVAL, + TimeTableStrsClassTypeDB[TT_TimeTable[Weekday][Interval].Columns[Column].ClassType], + TT_TimeTable[Weekday][Interval].Columns[Column].Place, + TT_TimeTable[Weekday][Interval].Columns[Column].Group); DB_QueryINSERT (Query,"can not create course timetable"); } } @@ -537,7 +520,7 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod) char Query[512 + TT_MAX_BYTES_PLACE]; unsigned Weekday; - unsigned Interval5Minutes; + unsigned Interval; unsigned Hour; unsigned Min; unsigned Column; @@ -549,18 +532,18 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod) /***** Loop over timetable *****/ for (Weekday = 0; - Weekday < TT_DAYS; + Weekday < TT_DAYS_PER_WEEK; Weekday++) - for (Interval5Minutes = 0, Hour = TT_START_HOUR, Min = 0; - Interval5Minutes < TT_INTERVALS_5_MINUTES_PER_DAY; - Interval5Minutes++, - Hour += (Min + 5) / TT_SECONDS_IN_1_MINUTE, - Min = (Min + 5) % TT_SECONDS_IN_1_MINUTE) + for (Interval = 0, Hour = TT_START_HOUR, Min = 0; + Interval < TT_INTERVALS_PER_DAY; + Interval++, + Hour += (Min + TT_MINUTES_PER_INTERVAL) / TT_SECONDS_PER_MINUTE, + Min = (Min + TT_MINUTES_PER_INTERVAL) % TT_SECONDS_PER_MINUTE) for (Column = 0; Column < TT_MAX_COLUMNS_PER_CELL; Column++) - if (TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].HourType == TT_FIRST_HOUR && - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].DurationNumIntervals5Minutes) + if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FIRST_INTERVAL && + TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals) { sprintf (Query,"INSERT INTO timetable_tut" " (UsrCod,Weekday,StartTime,Duration,Place)" @@ -569,8 +552,8 @@ static void TT_WriteTutTimeTableIntoDB (long UsrCod) UsrCod, Weekday, Hour,Min, - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].DurationNumIntervals5Minutes * TT_SECONDS_IN_5_MINUTES, - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].Place); + TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals * TT_SECONDS_PER_INTERVAL, + TT_TimeTable[Weekday][Interval].Columns[Column].Place); DB_QueryINSERT (Query,"can not create office timetable"); } } @@ -588,9 +571,9 @@ static void TT_CreatTimeTableFromDB (long UsrCod) unsigned long NumRow; unsigned long NumRows; unsigned Weekday; - unsigned Interval5Minutes; - unsigned Interv; - unsigned DurationNumIntervals5Minutes; + unsigned Interval; + unsigned I; + unsigned DurationNumIntervals; unsigned Column; unsigned Seconds; unsigned FirstFreeColumn; @@ -602,24 +585,24 @@ static void TT_CreatTimeTableFromDB (long UsrCod) /***** Initialize timetable to all free *****/ for (Weekday = 0; - Weekday < TT_DAYS; + Weekday < TT_DAYS_PER_WEEK; Weekday++) - for (Interval5Minutes = 0; - Interval5Minutes < TT_INTERVALS_5_MINUTES_PER_DAY; - Interval5Minutes++) + for (Interval = 0; + Interval < TT_INTERVALS_PER_DAY; + Interval++) { - TT_TimeTable[Weekday][Interval5Minutes].NumColumns = 0; + TT_TimeTable[Weekday][Interval].NumColumns = 0; for (Column = 0; Column < TT_MAX_COLUMNS_PER_CELL; Column++) { - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].CrsCod = -1L; - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].GrpCod = -1L; - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].HourType = TT_FREE_HOUR; - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].ClassType = TT_FREE; - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].DurationNumIntervals5Minutes = 0; - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].Group[0] = '\0'; - TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].Place[0] = '\0'; + TT_TimeTable[Weekday][Interval].Columns[Column].CrsCod = -1L; + TT_TimeTable[Weekday][Interval].Columns[Column].GrpCod = -1L; + TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType = TT_FREE_INTERVAL; + TT_TimeTable[Weekday][Interval].Columns[Column].ClassType = TT_FREE; + TT_TimeTable[Weekday][Interval].Columns[Column].DurationNumIntervals = 0; + TT_TimeTable[Weekday][Interval].Columns[Column].Group[0] = '\0'; + TT_TimeTable[Weekday][Interval].Columns[Column].Place[0] = '\0'; } } @@ -779,23 +762,23 @@ static void TT_CreatTimeTableFromDB (long UsrCod) /* Day of week (row[0]) */ if (sscanf (row[0],"%u",&Weekday) == 1) - if (Weekday >= TT_DAYS) + if (Weekday >= TT_DAYS_PER_WEEK) Lay_ShowErrorAndExit ("Wrong day of week in timetable."); /* StartTime formatted as seconds (row[1]) - --> StartTime in number of intervals of 5 minutes */ + --> StartTime in number of intervals */ if (sscanf (row[1],"%u",&Seconds) != 1) Lay_ShowErrorAndExit ("Wrong hour in timetable."); - Interval5Minutes = Seconds / TT_SECONDS_IN_1_MINUTE; - if (Interval5Minutes < TT_INTERVALS_5_MINUTES_BEFORE_START_HOUR) + Interval = Seconds / TT_SECONDS_PER_MINUTE; + if (Interval < TT_INTERVALS_BEFORE_START_HOUR) Lay_ShowErrorAndExit ("Wrong hour in timetable."); - Interval5Minutes -= TT_INTERVALS_5_MINUTES_BEFORE_START_HOUR; + Interval -= TT_INTERVALS_BEFORE_START_HOUR; /* Duration formatted as seconds (row[2]) - --> Duration in number of intervals of 5 minutes */ + --> Duration in number of intervals */ if (sscanf (row[2],"%u",&Seconds) != 1) Lay_ShowErrorAndExit ("Wrong duration in timetable."); - DurationNumIntervals5Minutes = Seconds / TT_SECONDS_IN_5_MINUTES; + DurationNumIntervals = Seconds / TT_SECONDS_PER_INTERVAL; /* Type of class (row[4]) */ switch (Gbl.TimeTable.Type) @@ -819,7 +802,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod) } /* Cell has been read without errors */ - if (TT_TimeTable[Weekday][Interval5Minutes].NumColumns < TT_MAX_COLUMNS_PER_CELL) + if (TT_TimeTable[Weekday][Interval].NumColumns < TT_MAX_COLUMNS_PER_CELL) // If there's place for another column in this cell... { /* Find the first free column for this day-hour */ @@ -827,7 +810,7 @@ static void TT_CreatTimeTableFromDB (long UsrCod) for (Column = 0; Column < TT_MAX_COLUMNS_PER_CELL; Column++) - if (TT_TimeTable[Weekday][Interval5Minutes].Columns[Column].HourType == TT_FREE_HOUR) + if (TT_TimeTable[Weekday][Interval].Columns[Column].IntervalType == TT_FREE_INTERVAL) { FirstFreeColumn = Column; break; @@ -837,11 +820,11 @@ static void TT_CreatTimeTableFromDB (long UsrCod) { /* Check if there's place for all the rows of this class */ TimeTableHasSpaceForThisClass = true; - for (Interv = Interval5Minutes + 1; - Interv < Interval5Minutes + DurationNumIntervals5Minutes && - Interv < TT_INTERVALS_5_MINUTES_PER_DAY; - Interv++) - if (TT_TimeTable[Weekday][Interv].Columns[FirstFreeColumn].HourType != TT_FREE_HOUR) + for (I = Interval + 1; + I < Interval + DurationNumIntervals && + I < TT_INTERVALS_PER_DAY; + I++) + if (TT_TimeTable[Weekday][I].Columns[FirstFreeColumn].IntervalType != TT_FREE_INTERVAL) { TimeTableIsIncomplete = true; TimeTableHasSpaceForThisClass = false; @@ -849,16 +832,16 @@ static void TT_CreatTimeTableFromDB (long UsrCod) } if (TimeTableHasSpaceForThisClass) { - TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].ClassType = ClassType; - TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].DurationNumIntervals5Minutes = DurationNumIntervals5Minutes; - TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].HourType = TT_FIRST_HOUR; - for (Interv = Interval5Minutes + 1; - Interv < Interval5Minutes + DurationNumIntervals5Minutes && - Interv < TT_HOURS_PER_DAY * 2; - Interv++) + TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].ClassType = ClassType; + TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].DurationNumIntervals = DurationNumIntervals; + TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].IntervalType = TT_FIRST_INTERVAL; + for (I = Interval + 1; + I < Interval + DurationNumIntervals && + I < TT_HOURS_PER_DAY * 2; + I++) { - TT_TimeTable[Weekday][Interv].Columns[FirstFreeColumn].HourType = TT_NEXT_HOUR; - TT_TimeTable[Weekday][Interv].NumColumns++; + TT_TimeTable[Weekday][I].Columns[FirstFreeColumn].IntervalType = TT_NEXT_INTERVAL; + TT_TimeTable[Weekday][I].NumColumns++; } /* Course (row[7]), group (row[5]) and place (row[3])*/ @@ -866,23 +849,23 @@ static void TT_CreatTimeTableFromDB (long UsrCod) { case TT_MY_TIMETABLE: case TT_COURSE_TIMETABLE: - TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].CrsCod = + TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].CrsCod = (Gbl.TimeTable.Type == TT_MY_TIMETABLE ? Str_ConvertStrCodToLongCod (row[7]) : Gbl.CurrentCrs.Crs.CrsCod); - Str_Copy (TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].Group, + Str_Copy (TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].Group, row[5], Grp_MAX_BYTES_GROUP_NAME); - TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].GrpCod = GrpCod; + TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].GrpCod = GrpCod; // no break; case TT_TUTORING_TIMETABLE: - Str_Copy (TT_TimeTable[Weekday][Interval5Minutes].Columns[FirstFreeColumn].Place, + Str_Copy (TT_TimeTable[Weekday][Interval].Columns[FirstFreeColumn].Place, row[3], TT_MAX_BYTES_PLACE); break; } /* Increment number of items in this cell */ - TT_TimeTable[Weekday][Interval5Minutes].NumColumns++; + TT_TimeTable[Weekday][Interval].NumColumns++; } } else @@ -905,31 +888,32 @@ static void TT_CreatTimeTableFromDB (long UsrCod) static void TT_ModifTimeTable (void) { - if (TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType == TT_FIRST_HOUR) + if (TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType == TT_FIRST_INTERVAL) { /***** Free this cell *****/ - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = -1; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FREE_HOUR; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassType = TT_FREE; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = 0; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group[0] = '\0'; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place[0] = '\0'; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns--; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].GrpCod = -1; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType = TT_FREE_INTERVAL; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].ClassType = TT_FREE; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].DurationNumIntervals = 0; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Group[0] = '\0'; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Place[0] = '\0'; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].NumColumns--; } - if (Gbl.TimeTable.ClassType != TT_FREE && Gbl.TimeTable.DurationOld > 0 && - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns < TT_MAX_COLUMNS_PER_CELL) + if (Gbl.TimeTable.ClassType != TT_FREE && + Gbl.TimeTable.DurationNumIntervals > 0 && + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].NumColumns < TT_MAX_COLUMNS_PER_CELL) { /***** Change this cell *****/ - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].NumColumns++; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].HourType = TT_FIRST_HOUR; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].ClassType = Gbl.TimeTable.ClassType; - TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].DurationOld = Gbl.TimeTable.DurationOld; - Str_Copy (TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Group, + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].NumColumns++; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].GrpCod = Gbl.TimeTable.GrpCod; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].IntervalType = TT_FIRST_INTERVAL; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].ClassType = Gbl.TimeTable.ClassType; + TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].DurationNumIntervals = Gbl.TimeTable.DurationNumIntervals; + Str_Copy (TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Group, Gbl.TimeTable.Group, Grp_MAX_BYTES_GROUP_NAME); - Str_Copy (TimeTableOld[Gbl.TimeTable.Day][Gbl.TimeTable.HourOld].Columns[Gbl.TimeTable.Column].Place, + Str_Copy (TT_TimeTable[Gbl.TimeTable.Weekday][Gbl.TimeTable.Interval].Columns[Gbl.TimeTable.Column].Place, Gbl.TimeTable.Place, TT_MAX_BYTES_PLACE); } @@ -943,10 +927,10 @@ static void TT_DrawTimeTable (void) { bool Editing = false; unsigned DayColumn; // Column from left (0) to right (6) - unsigned Day; // Day of week - unsigned HourOld; + unsigned Weekday; // Day of week + unsigned Interval; unsigned Min; - unsigned H; + unsigned I; unsigned Column; unsigned ColumnsToDraw; unsigned ColumnsToDrawIncludingExtraColumn; @@ -996,36 +980,38 @@ static void TT_DrawTimeTable (void) Grp_GetListGrpTypesAndGrpsInThisCrs (Grp_ONLY_GROUP_TYPES_WITH_GROUPS); /***** Write the table row by row *****/ - for (HourOld = 0, Min = 5; - HourOld < TT_HOURS_PER_DAY * TT_INTERVALS_5_MINUTES_PER_HOUR; - HourOld++, Min = (Min + 5) % TT_SECONDS_IN_1_MINUTE) + for (Interval = 0, Min = TT_MINUTES_PER_INTERVAL; + Interval < TT_INTERVALS_PER_DAY; + Interval++, Min = (Min + TT_MINUTES_PER_INTERVAL) % TT_SECONDS_PER_MINUTE) { fprintf (Gbl.F.Out,"