diff --git a/Makefile b/Makefile index 224072510..0064f9a00 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ OBJS = swad_account.o swad_action.o swad_announcement.o swad_assignment.o swad_a swad_holiday.o \ swad_icon.o swad_ID.o swad_import.o swad_indicator.o swad_info.o swad_institution.o \ swad_layout.o swad_link.o \ - swad_mail.o swad_main.o swad_mark.o swad_message.o \ + swad_mail.o swad_main.o swad_mark.o swad_menu.o swad_message.o \ swad_network.o swad_nickname.o swad_notice.o swad_notification.o \ swad_pagination.o swad_parameter.o swad_password.o swad_photo.o swad_place.o swad_plugin.o swad_preference.o \ swad_QR.o \ diff --git a/css/swad_desktop.css b/css/swad_desktop.css index 53cdf82e3..b316bd0fc 100644 --- a/css/swad_desktop.css +++ b/css/swad_desktop.css @@ -658,15 +658,15 @@ a:hover img.CENTRE_PHOTO_SHOW } /********************************* Menu fonts ********************************/ -.WHITE_MENU_OFF {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.GREY_MENU_OFF {color:#707070; font-size:11pt; font-weight:bold; line-height:110%;} -.BLUE_MENU_OFF {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.YELLOW_MENU_OFF {color:#BD4815; font-size:11pt; font-weight:bold; line-height:110%;} +.WHITE_MENU_OFF {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.GREY_MENU_OFF {color:#707070; font-size:10pt; font-weight:bold; line-height:110%;} +.BLUE_MENU_OFF {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.YELLOW_MENU_OFF {color:#BD4815; font-size:10pt; font-weight:bold; line-height:110%;} -.WHITE_MENU_ON {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.GREY_MENU_ON {color:#606060; font-size:11pt; font-weight:bold; line-height:110%;} -.BLUE_MENU_ON {color:#4D88A1; font-size:11pt; font-weight:bold; line-height:110%;} -.YELLOW_MENU_ON {color:#BD4815; font-size:11pt; font-weight:bold; line-height:110%;} +.WHITE_MENU_ON {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.GREY_MENU_ON {color:#606060; font-size:10pt; font-weight:bold; line-height:110%;} +.BLUE_MENU_ON {color:#4D88A1; font-size:10pt; font-weight:bold; line-height:110%;} +.YELLOW_MENU_ON {color:#BD4815; font-size:10pt; font-weight:bold; line-height:110%;} /********************************* Form fonts ********************************/ .WHITE_FORM {color:#4D88A1; font-size:11pt;} diff --git a/icon/horizontal32x32.gif b/icon/horizontal32x32.gif new file mode 100644 index 000000000..0b2b00685 Binary files /dev/null and b/icon/horizontal32x32.gif differ diff --git a/icon/vertical32x32.gif b/icon/vertical32x32.gif new file mode 100644 index 000000000..ba83f5038 Binary files /dev/null and b/icon/vertical32x32.gif differ diff --git a/sql/cambios.sql b/sql/cambios.sql index 85b976f00..546bb6534 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -10441,4 +10441,12 @@ INSERT INTO announcements (Roles,Subject,Content) VALUES ('16','ENCUESTA AN&Oacu SELECT tst_questions.QstCod,tst_questions.AnsType,tst_questions.Shuffle,tst_questions.Stem,tst_questions.Feedback FROM tst_questions,tst_question_tags,tst_tags WHERE tst_questions.CrsCod='5432' AND tst_questions.QstCod NOT IN (SELECT tst_question_tags.QstCod FROM tst_tags,tst_question_tags WHERE tst_tags.CrsCod='5432' AND tst_tags.TagHidden='Y' AND tst_tags.TagCod=tst_question_tags.TagCod) AND tst_questions.QstCod=tst_question_tags.QstCod AND tst_question_tags.TagCod=tst_tags.TagCod AND tst_tags.CrsCod='5432' AND (UNIX_TIMESTAMP(tst_questions.EditTime)>='0' OR UNIX_TIMESTAMP(tst_tags.ChangeTime)>='0') ORDER BY QstCod; +----- 2015-01-01, swad14.51 + +ALTER TABLE usr_data ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER Comments; +ALTER TABLE usr_data ADD INDEX (Menu); +UPDATE usr_data SET Menu=1; +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1243','es','N','Cambiar menú'); +ALTER TABLE IP_prefs ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER IconSet; + diff --git a/sql/swad.sql b/sql/swad.sql index 5a2c1bfda..46401c34b 100644 --- a/sql/swad.sql +++ b/sql/swad.sql @@ -18,6 +18,7 @@ CREATE TABLE IF NOT EXISTS IP_prefs ( Layout TINYINT NOT NULL DEFAULT 0, Theme CHAR(16) NOT NULL, IconSet CHAR(16) NOT NULL, + Menu TINYINT NOT NULL DEFAULT 0, SideCols TINYINT NOT NULL, PRIMARY KEY(IP), INDEX(UsrCod), @@ -1137,6 +1138,7 @@ CREATE TABLE IF NOT EXISTS usr_data ( OriginPlace VARCHAR(127) NOT NULL, Birthday DATE NOT NULL, Comments TEXT NOT NULL, + Menu TINYINT NOT NULL DEFAULT 0, SideCols TINYINT NOT NULL DEFAULT 3, NotifNtfEvents INT NOT NULL DEFAULT 0, EmailNtfEvents INT NOT NULL DEFAULT 0, @@ -1146,12 +1148,14 @@ CREATE TABLE IF NOT EXISTS usr_data ( INDEX(Theme), INDEX(IconSet), INDEX(Language), - INDEX(SideCols), INDEX(CtyCod), INDEX(InsCtyCod), INDEX(InsCod), INDEX(DptCod), - INDEX(CtrCod)); + INDEX(CtrCod), + INDEX(Menu), + INDEX(SideCols)); +); -- -- Table usr_emails: stores the users' e-mails -- diff --git a/swad_account.c b/swad_account.c index 8db977ec5..091f3c784 100644 --- a/swad_account.c +++ b/swad_account.c @@ -434,12 +434,12 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) "Layout,Theme,IconSet,Language,PublicPhoto," "CtyCod," "LocalAddress,LocalPhone,FamilyAddress,FamilyPhone,OriginPlace,Birthday,Comments," - "SideCols,NotifNtfEvents,EmailNtfEvents)" + "Menu,SideCols,NotifNtfEvents,EmailNtfEvents)" " VALUES ('%s','%s','%s','%s','%s','%s'," "'%u','%s','%s','%s','%c'," "'%ld'," "'%s','%s','%s','%s','%s','%04u-%02u-%02u','%s'," - "'%u','-1','0')", + "'%u','%u','-1','0')", UsrDat->EncryptedUsrCod, UsrDat->Password, UsrDat->Surname1,UsrDat->Surname2,UsrDat->FirstName, @@ -457,6 +457,7 @@ void Acc_CreateNewUsr (struct UsrData *UsrDat) UsrDat->Birthday.Year,UsrDat->Birthday.Month,UsrDat->Birthday.Day, UsrDat->Comments ? UsrDat->Comments : "", + Mnu_MENU_DEFAULT, Cfg_DEFAULT_COLUMNS); UsrDat->UsrCod = DB_QueryINSERTandReturnCode (Query,"can not create user"); diff --git a/swad_action.c b/swad_action.c index 63034b807..a92b6a730 100644 --- a/swad_action.c +++ b/swad_action.c @@ -1021,6 +1021,7 @@ Profile: 875. ActShoLftCol Show left side column 876. ActShoRgtCol Show right side column 877. ActChgIco Change icon set + ---. ActChgMnu Change menu 879. ActChgNtfPrf Change whether to notify by e-mail new messages 880. ActPrnUsrQR Show my QR code ready to print 881. ActPrnMyTimTbl Show the timetable listo to impresión of all my courses @@ -2243,6 +2244,7 @@ struct Act_Actions Act_Actions[Act_NUM_ACTIONS] = /* ActShoLftCol */{ 670,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ShowLeftCol ,Prf_EditPrefs ,NULL}, /* ActShoRgtCol */{ 671,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Prf_ShowRightCol ,Prf_EditPrefs ,NULL}, /* ActChgIco */{1092,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ico_ChangeIconSet ,Prf_EditPrefs ,NULL}, + /* ActChgMnu */{1243,-1,TabPrf,ActEdiPrf ,0x1FF,0x1FF,0x1FF,Act_CONTENT_NORM,Act_MAIN_WINDOW,Mnu_ChangeMenu ,Prf_EditPrefs ,NULL}, /* ActChgNtfPrf */{ 775,-1,TabPrf,ActEdiPrf ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_MAIN_WINDOW,Ntf_ChangeNotifyEvents ,Prf_EditPrefs ,NULL}, /* ActPrnUsrQR */{1022,-1,TabPrf,ActFrmUsrAcc ,0x1FE,0x1FE,0x1FE,Act_CONTENT_NORM,Act_NEW_WINDOW ,NULL ,QR_PrintQRCode ,NULL}, @@ -3516,6 +3518,7 @@ Act_Action_t Act_FromActCodToAction[1+Act_MAX_ACTION_COD] = // Do not reuse uniq ActRemIDOth, // #1240 ActNewIDOth, // #1241 ActSeeSyl, // #1242 + ActChgMnu, // #1243 }; /*****************************************************************************/ diff --git a/swad_action.h b/swad_action.h index 41bb37e73..985b9ba46 100644 --- a/swad_action.h +++ b/swad_action.h @@ -71,9 +71,9 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica /* Related with tabs, menus, etc. */ #define Act_NUM_TABS (1+11) -#define Act_NUM_ACTIONS (7+52+15+39+22+17+206+182+94+168+28+74) +#define Act_NUM_ACTIONS (7+52+15+39+22+17+206+182+94+168+28+75) -#define Act_MAX_ACTION_COD 1242 +#define Act_MAX_ACTION_COD 1243 #define Act_MAX_OPTIONS_IN_MENU_PER_TAB 20 @@ -1088,31 +1088,32 @@ typedef int Act_Action_t; // Must be a signed type, because -1 is used to indica #define ActShoLftCol (ActSeeAllStaCrs+49) #define ActShoRgtCol (ActSeeAllStaCrs+50) #define ActChgIco (ActSeeAllStaCrs+51) -#define ActChgNtfPrf (ActSeeAllStaCrs+52) +#define ActChgMnu (ActSeeAllStaCrs+52) +#define ActChgNtfPrf (ActSeeAllStaCrs+53) -#define ActPrnUsrQR (ActSeeAllStaCrs+53) +#define ActPrnUsrQR (ActSeeAllStaCrs+54) -#define ActPrnMyTimTbl (ActSeeAllStaCrs+54) -#define ActEdiTut (ActSeeAllStaCrs+55) -#define ActChgTut (ActSeeAllStaCrs+56) -#define ActReqRemFilBrf (ActSeeAllStaCrs+57) -#define ActRemFilBrf (ActSeeAllStaCrs+58) -#define ActRemFolBrf (ActSeeAllStaCrs+59) -#define ActCopBrf (ActSeeAllStaCrs+60) -#define ActPasBrf (ActSeeAllStaCrs+61) -#define ActRemTreBrf (ActSeeAllStaCrs+62) -#define ActFrmCreBrf (ActSeeAllStaCrs+63) -#define ActCreFolBrf (ActSeeAllStaCrs+64) -#define ActCreLnkBrf (ActSeeAllStaCrs+65) -#define ActRenFolBrf (ActSeeAllStaCrs+66) -#define ActRcvFilBrfDZ (ActSeeAllStaCrs+67) -#define ActRcvFilBrfCla (ActSeeAllStaCrs+68) -#define ActExpBrf (ActSeeAllStaCrs+69) -#define ActConBrf (ActSeeAllStaCrs+70) -#define ActZIPBrf (ActSeeAllStaCrs+71) -#define ActReqDatBrf (ActSeeAllStaCrs+72) -#define ActChgDatBrf (ActSeeAllStaCrs+73) -#define ActDowBrf (ActSeeAllStaCrs+74) +#define ActPrnMyTimTbl (ActSeeAllStaCrs+55) +#define ActEdiTut (ActSeeAllStaCrs+56) +#define ActChgTut (ActSeeAllStaCrs+57) +#define ActReqRemFilBrf (ActSeeAllStaCrs+58) +#define ActRemFilBrf (ActSeeAllStaCrs+59) +#define ActRemFolBrf (ActSeeAllStaCrs+60) +#define ActCopBrf (ActSeeAllStaCrs+61) +#define ActPasBrf (ActSeeAllStaCrs+62) +#define ActRemTreBrf (ActSeeAllStaCrs+63) +#define ActFrmCreBrf (ActSeeAllStaCrs+64) +#define ActCreFolBrf (ActSeeAllStaCrs+65) +#define ActCreLnkBrf (ActSeeAllStaCrs+66) +#define ActRenFolBrf (ActSeeAllStaCrs+67) +#define ActRcvFilBrfDZ (ActSeeAllStaCrs+68) +#define ActRcvFilBrfCla (ActSeeAllStaCrs+69) +#define ActExpBrf (ActSeeAllStaCrs+70) +#define ActConBrf (ActSeeAllStaCrs+71) +#define ActZIPBrf (ActSeeAllStaCrs+72) +#define ActReqDatBrf (ActSeeAllStaCrs+73) +#define ActChgDatBrf (ActSeeAllStaCrs+74) +#define ActDowBrf (ActSeeAllStaCrs+75) /*****************************************************************************/ /******************************** Public types *******************************/ diff --git a/swad_changelog.h b/swad_changelog.h index 475b9dcdf..a294cf1bb 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -35,11 +35,20 @@ /****************************** Public constants *****************************/ /*****************************************************************************/ -#define Log_PLATFORM_VERSION "SWAD 14.50.4 (2015/01/01)" +#define Log_PLATFORM_VERSION "SWAD 14.51 (2015/01/01)" // 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 | tail -1 /* + Version 14.51 :Jan 01, 2014 Users can select horizontal or vertical menu. (172958 lines) + 1 change necessary in Makefile: +Add swad_menu.o to list of object files + 4 changes necessary in database: +ALTER TABLE usr_data ADD COLUMN Menu TINYINT NOT NULL DEFAULT 0 AFTER Comments; +ALTER TABLE usr_data ADD INDEX (Menu); +UPDATE usr_data SET Menu=1; +INSERT INTO actions (ActCod,Language,Obsolete,Txt) VALUES ('1243','es','N','Cambiar menú'); + Version 14.50.4 :Jan 01, 2014 Changes in preferences and photos. (172705 lines) Version 14.50.3 :Jan 01, 2014 Changes in layout of preferences. (172691 lines) Version 14.50.2 :Jan 01, 2014 Changes in CSS. (172739 lines) diff --git a/swad_database.c b/swad_database.c index 4e197a11a..f70e122b6 100644 --- a/swad_database.c +++ b/swad_database.c @@ -113,9 +113,10 @@ mysql> DESCRIBE IP_prefs; | Layout | tinyint(4) | NO | | 0 | | | Theme | char(16) | NO | | NULL | | | IconSet | char(16) | NO | | NULL | | +| Menu | tinyint(4) | NO | | 0 | | | SideCols | tinyint(4) | NO | | NULL | | +------------+------------+------+-----+---------+-------+ -7 rows in set (0.00 sec) +8 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS IP_prefs (" "IP CHAR(15) NOT NULL," @@ -124,6 +125,7 @@ mysql> DESCRIBE IP_prefs; "Layout TINYINT NOT NULL DEFAULT 0," "Theme CHAR(16) NOT NULL," "IconSet CHAR(16) NOT NULL," + "Menu TINYINT NOT NULL DEFAULT 0," "SideCols TINYINT NOT NULL," "PRIMARY KEY (IP),INDEX(UsrCod),INDEX(LastChange))"); @@ -2280,11 +2282,12 @@ mysql> DESCRIBE usr_data; | OriginPlace | varchar(127) | NO | | NULL | | | Birthday | date | NO | | NULL | | | Comments | text | NO | | NULL | | +| Menu | tinyint(4) | NO | MUL | 0 | | | SideCols | tinyint(4) | NO | MUL | 3 | | | NotifNtfEvents | int(11) | NO | | 0 | | | EmailNtfEvents | int(11) | NO | | 0 | | +-----------------+---------------------------------+------+-----+---------+----------------+ -33 rows in set (0.00 sec) +34 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS usr_data (" "UsrCod INT NOT NULL AUTO_INCREMENT," @@ -2317,10 +2320,11 @@ mysql> DESCRIBE usr_data; "OriginPlace VARCHAR(127) NOT NULL," "Birthday DATE NOT NULL," "Comments TEXT NOT NULL," + "Menu TINYINT NOT NULL DEFAULT 0," "SideCols TINYINT NOT NULL DEFAULT 3," "NotifNtfEvents INT NOT NULL DEFAULT 0," "EmailNtfEvents INT NOT NULL DEFAULT 0," - "PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(SideCols),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod))"); + "PRIMARY KEY(UsrCod),UNIQUE INDEX(EncryptedUsrCod),INDEX(Layout),INDEX(Theme),INDEX(IconSet),INDEX(Language),INDEX(CtyCod),INDEX(InsCtyCod),INDEX(InsCod),INDEX(DptCod),INDEX(CtrCod),INDEX(Menu),INDEX(SideCols))"); /***** Table usr_emails *****/ /* diff --git a/swad_global.c b/swad_global.c index 5087f01d2..fbc916ce0 100644 --- a/swad_global.c +++ b/swad_global.c @@ -130,6 +130,7 @@ void Gbl_InitializeGlobals (void) sprintf (Gbl.Prefs.IconsURL,"%s/%s", Cfg_HTTPS_URL_SWAD_PUBLIC,Cfg_FOLDER_PUBLIC_ICON); Gbl.Prefs.Language = Txt_Current_CGI_SWAD_Language; + Gbl.Prefs.Menu = Mnu_MENU_DEFAULT; // Default menu Gbl.Prefs.SideCols = Cfg_DEFAULT_COLUMNS; // Show both side columns, left and right sprintf (Gbl.Prefs.PathTheme,"%s/%s/%s", Gbl.Prefs.IconsURL, diff --git a/swad_global.h b/swad_global.h index 8476b8092..0bd66beb5 100644 --- a/swad_global.h +++ b/swad_global.h @@ -51,9 +51,10 @@ #include "swad_institution.h" #include "swad_layout.h" #include "swad_link.h" -#include "swad_message.h" #include "swad_mail.h" #include "swad_mark.h" +#include "swad_message.h" +#include "swad_menu.h" #include "swad_password.h" #include "swad_photo.h" #include "swad_place.h" @@ -136,6 +137,7 @@ struct Globals Ico_IconSet_t IconSet; char PathIconSet[PATH_MAX+1]; char IconsURL[PATH_MAX+1]; + Mnu_Menu_t Menu; } Prefs; struct diff --git a/swad_layout.c b/swad_layout.c index 2a65e6ad4..aee22e788 100644 --- a/swad_layout.c +++ b/swad_layout.c @@ -63,8 +63,6 @@ const char *Lay_LayoutIcons[Lay_NUM_LAYOUTS] = /****************************** Private constants ****************************/ /*****************************************************************************/ -#define HORIZONTAL_MENU 1 - const char *Lay_TabIcons[Act_NUM_TABS] = { /* TabUnk */ NULL, @@ -109,20 +107,14 @@ static void Lay_DrawTabsDeskTop (void); static void Lay_DrawTabsMobile (void); static bool Lay_CheckIfICanViewTab (Act_Tab_t Tab); static void Lay_DrawBreadcrumb (void); -#ifndef HORIZONTAL_MENU static void Lay_WriteVerticalMenuThisTabDesktop (void); -#endif -#ifdef HORIZONTAL_MENU static void Lay_WriteHorizontalMenuThisTabDesktop (void); -#endif static void Lay_WriteMenuThisTabMobile (void); static void Lay_WriteBreadcrumbHome (void); static void Lay_WriteBreadcrumbTab (void); static void Lay_WriteBreadcrumbAction (void); -#ifndef HORIZONTAL_MENU static void Lay_WriteTitleAction (void); -#endif static void Lay_ShowLeftColumn (void); static void Lay_ShowRightColumn (void); @@ -304,14 +296,14 @@ void Lay_WriteStartOfPage (void) Prf_PutLeftIconToHideShowCols (); fprintf (Gbl.F.Out,""); -#ifndef HORIZONTAL_MENU - /* Tab content, including always vertical menu (left) and always main zone (right) */ - fprintf (Gbl.F.Out,"