diff --git a/configure.ac b/configure.ac index b13bd2b0d..057e98ba0 100644 --- a/configure.ac +++ b/configure.ac @@ -213,6 +213,7 @@ data/iso-codes/Makefile data/lcd/Makefile data/lcd/icons/Makefile data/lcd/clock/Makefile +data/license/Makefile data/locale/Makefile data/scripts/Makefile data/themes/Makefile diff --git a/data/Makefile.am b/data/Makefile.am index cfa13973d..765f5960f 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = fonts icons inetradio iso-codes locale scripts themes +SUBDIRS = fonts icons inetradio iso-codes license locale scripts themes if BOXTYPE_TRIPLE SUBDIRS += lcd diff --git a/data/license/Makefile.am b/data/license/Makefile.am new file mode 100644 index 000000000..d8d198554 --- /dev/null +++ b/data/license/Makefile.am @@ -0,0 +1,5 @@ +installdir = $(DATADIR)/neutrino/license + +install_DATA = \ + deutsch.license \ + english.license diff --git a/data/license/deutsch.license b/data/license/deutsch.license new file mode 100644 index 000000000..a1ae108d3 --- /dev/null +++ b/data/license/deutsch.license @@ -0,0 +1,5 @@ +Dieses Programm ist freie Software. Sie können es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation veröffentlicht, weitergeben und/oder modifizieren, entweder gemäß Version 2 der Lizenz oder (nach Ihrer Option) jeder späteren Version. + +Die Veröffentlichung dieses Programms erfolgt in der Hoffnung, daß es Ihnen von Nutzen sein wird, aber OHNE IRGENDEINE GARANTIE, sogar ohne die implizite Garantie der MARKTREIFE oder der VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. + +Sie sollten ein Exemplar der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software Foundation, Inc, 51 Franklin St, Fifth Floor, Boston, MA 02110, USA. diff --git a/data/license/english.license b/data/license/english.license new file mode 100644 index 000000000..1388ffb16 --- /dev/null +++ b/data/license/english.license @@ -0,0 +1,5 @@ +This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/data/locale/deutsch.locale b/data/locale/deutsch.locale index 2babbebaf..db0117e0e 100644 --- a/data/locale/deutsch.locale +++ b/data/locale/deutsch.locale @@ -736,7 +736,7 @@ menu.hint_auto_subs Automatische Anzeige der Untertitel in Ihrer bevorzugten Spr menu.hint_back Zurück zum vorherigen Menü.\nDie Taste 'Menü' schließt alle Menüs menu.hint_backup Sichern von Konfigurationen und Kanallisten menu.hint_bedit Bearbeiten ihrer Favoriten und der Bouquets -menu.hint_bigwindows EPG-Informationen werden immer im großen Fenster angezeigt. Dies erreichen Sie auch mit der Taste 'Info' +menu.hint_bigwindows Kanalliste, EPG-Infos, Audioplayer und einige andere Fenster werden bildschirmfüllend angezeigt menu.hint_cache_txt Startet das Zwischenspeichern des Teletextes nach einem Kanalwechsel menu.hint_cec_mode CEC-Modus menu.hint_cec_standby CEC-Standby @@ -943,6 +943,9 @@ menu.hint_record_apid_std Schließt bei einer Aufnahme die durch den Sender defi menu.hint_record_apids Konfigurieren Sie die Tonspuren für die Aufnahme menu.hint_record_apply Hiermit werden die Aufnahmeoptionen übernommen menu.hint_record_chandir Diese Option speichert Aufnahmen mit dem Namen des Kanals in ein eigenes Verzeichnis +menu.hint_record_data Daten-Spuren (Teletext, Untertitel) für die Aufnahme +menu.hint_record_data_dvbsub Untertitel-Spur zu Aufnahme hinzufügen +menu.hint_record_data_vtxt Teletext-Spur zu Aufnahme hinzufügen menu.hint_record_dir Wählen Sie das Aufnahmeverzeichnis menu.hint_record_end Wählen Sie zwischen max. Aufnahmezeit oder einem Aufnahmeende anhand der EPG-Daten menu.hint_record_slow_warn Zeige Warnung, wenn der Aufnahmepuffer zu überlaufen droht @@ -1516,7 +1519,9 @@ recordingmenu.apids Tonspuren recordingmenu.apids_ac3 AC3 Tonspuren aufnehmen recordingmenu.apids_alt Alternative Tonspuren aufn. recordingmenu.apids_std Standard Tonspur aufnehmen +recordingmenu.data_pids Daten-Spuren recordingmenu.defdir Aufnahmeverzeichnis +recordingmenu.dvbsub_pids Untertitel aufnehmen recordingmenu.end_of_recording_epg EPG aktuelles Event recordingmenu.end_of_recording_max max. Aufnahmezeit recordingmenu.end_of_recording_name Ende der Sofortaufnahme @@ -1538,6 +1543,7 @@ recordingmenu.slow_warn Warnung bei langsamen Aufnahmemedien recordingmenu.timeshift Timeshift recordingmenu.tsdir Timeshift Aufnahmeverzeichnis recordingmenu.vcr Videorekorder +recordingmenu.vtxt_pid Teletext aufnehmen recordingmenu.zap_on_announce Umschalten bei Ankündigung recordtimer.announce Die Aufnahme beginnt in wenigen Minuten. repeatblocker.hint_1 Mindestzeit (in ms) zwischen 2 Tastendrücken diff --git a/data/locale/english.locale b/data/locale/english.locale index 066c2511a..033d6ecd6 100644 --- a/data/locale/english.locale +++ b/data/locale/english.locale @@ -736,7 +736,7 @@ menu.hint_auto_subs Auto-start subtitles for preferred language menu.hint_back Return to previous menu\nPress menu key to close all menus menu.hint_backup Backup configs and channels to selected dir menu.hint_bedit Edit favorites and bouquets -menu.hint_bigwindows Always show big epg detail window\nelse 'info' button switch big font + window size +menu.hint_bigwindows Channellist, EPG-infos, audioplayer and some other windows are displayed full screen menu.hint_cache_txt Start teletext caching after channel switch menu.hint_cec_mode CEC mode menu.hint_cec_standby CEC standby @@ -943,6 +943,9 @@ menu.hint_record_apid_std Record first audio pid menu.hint_record_apids Configure audio pids to record menu.hint_record_apply Apply record options menu.hint_record_chandir Create directory with name of channel\nto store recording +menu.hint_record_data Record (VideoText, subtitles) data streams +menu.hint_record_data_dvbsub subtitle stream +menu.hint_record_data_vtxt VideoText stream menu.hint_record_dir Select directory to store recordings menu.hint_record_end Stop direct record after max. time\nor after current event end time menu.hint_record_slow_warn Show warning, when record buffer is close to overflow @@ -1516,7 +1519,9 @@ recordingmenu.apids Audio streams recordingmenu.apids_ac3 record AC3 streams recordingmenu.apids_alt record alternative streams recordingmenu.apids_std record standard stream +recordingmenu.data_pids Data streams recordingmenu.defdir Recording directory +recordingmenu.dvbsub_pids record dvbsub stream recordingmenu.end_of_recording_epg EPG act. Event recordingmenu.end_of_recording_max max. Recordingtime recordingmenu.end_of_recording_name Endtime of Recording @@ -1538,6 +1543,7 @@ recordingmenu.slow_warn Enable slow record warning recordingmenu.timeshift Timeshift recordingmenu.tsdir Timeshift directory recordingmenu.vcr vcr +recordingmenu.vtxt_pid record teletext recordingmenu.zap_on_announce zap on recording announce recordtimer.announce Recording starts in a few minutes repeatblocker.hint_1 Shortest time (in ms) to recognize 2 keystrokes diff --git a/data/satellites.xml b/data/satellites.xml index 3c9add451..c2ec02bce 100755 --- a/data/satellites.xml +++ b/data/satellites.xml @@ -1179,33 +1179,43 @@ + - + - + - + + - + + + + + - - - - + + + + + + + + diff --git a/src/Makefile.am b/src/Makefile.am index a2302b11c..87ce9e1a7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -52,7 +52,6 @@ endif neutrino_LDADD = \ daemonc/libneutrino_daemonc.a \ gui/bedit/libneutrino_gui_bedit.a \ - gui/components/libneutrino_gui_components.a \ gui/libtimerlist.a \ gui/libneutrino_gui.a \ gui/widget/libneutrino_gui_widget.a \ @@ -61,6 +60,7 @@ neutrino_LDADD = \ system/libneutrino_system.a \ gui/movieinfo.o \ gui/libneutrino_gui2.a \ + gui/components/libneutrino_gui_components.a \ eitd/libsectionsd.a \ driver/libneutrino_driver.a \ driver/audiodec/libneutrino_driver_audiodec.a \ diff --git a/src/driver/framebuffer.cpp b/src/driver/framebuffer.cpp index 74924ccec..fc265dee9 100644 --- a/src/driver/framebuffer.cpp +++ b/src/driver/framebuffer.cpp @@ -489,6 +489,17 @@ unsigned int CFrameBuffer::getScreenHeight(bool real) return g_settings.screen_EndY - g_settings.screen_StartY; } +unsigned int CFrameBuffer::getScreenWidthRel() +{ + // always reduce a possible detailline + return (g_settings.screen_EndX - g_settings.screen_StartX - 2*ConnectLineBox_Width) * (g_settings.big_windows ? 100 : NON_BIG_WINDOWS) / 100; +} + +unsigned int CFrameBuffer::getScreenHeightRel() +{ + return (g_settings.screen_EndY - g_settings.screen_StartY) * (g_settings.big_windows ? 100 : NON_BIG_WINDOWS) / 100; +} + unsigned int CFrameBuffer::getScreenX() { return g_settings.screen_StartX; diff --git a/src/driver/framebuffer.h b/src/driver/framebuffer.h index 14d58c96c..0a510c7e6 100644 --- a/src/driver/framebuffer.h +++ b/src/driver/framebuffer.h @@ -57,6 +57,9 @@ typedef struct fb_var_screeninfo t_fb_var_screeninfo; #define FADE_STEP 5 #define FADE_RESET 0xFFFF +#define NON_BIG_WINDOWS 85 // % +#define ConnectLineBox_Width 16 // px + #if HAVE_GENERIC_HARDWARE #define USE_OPENGL 1 #endif @@ -160,6 +163,8 @@ class CFrameBuffer unsigned int getStride() const; // size of a single line in the framebuffer (in bytes) unsigned int getScreenWidth(bool real = false); unsigned int getScreenHeight(bool real = false); + unsigned int getScreenWidthRel(); + unsigned int getScreenHeightRel(); unsigned int getScreenX(); unsigned int getScreenY(); diff --git a/src/driver/genpsi.cpp b/src/driver/genpsi.cpp index 266b727fd..cd350cf22 100644 --- a/src/driver/genpsi.cpp +++ b/src/driver/genpsi.cpp @@ -1,6 +1,7 @@ /* Copyright (c) 2004 gmo18t, Germany. All rights reserved. Copyright (C) 2012 CoolStream International Ltd + Copyright (C) 2013 Jacek Jendrzej This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published @@ -124,8 +125,15 @@ CGenPsi::CGenPsi() nba = 0; vpid = 0; vtype = 0; + + vtxtpid = 0; + vtxtlang[0] = 'g'; + vtxtlang[1] = 'e'; + vtxtlang[2] = 'r'; memset(apid, 0, sizeof(apid)); memset(atypes, 0, sizeof(atypes)); + nsub = 0; + memset(dvbsubpid, 0, sizeof(dvbsubpid)); } uint32_t CGenPsi::calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len) @@ -147,7 +155,7 @@ uint32_t CGenPsi::calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len) return crc; } -void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3) +void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3, const char *data) { switch(pidtype) { @@ -165,8 +173,22 @@ void CGenPsi::addPid(uint16_t pid, uint16_t pidtype, short isAC3) nba++; break; case EN_TYPE_TELTEX: + vtxtpid = pid; + if(data != NULL){ + vtxtlang[0] = data[0]; + vtxtlang[1] = data[1]; + vtxtlang[2] = data[2]; + } + break; + case EN_TYPE_DVBSUB: + dvbsubpid[nsub] = pid; + if(data != NULL){ + dvbsublang[nsub][0] = data[0]; + dvbsublang[nsub][1] = data[1]; + dvbsublang[nsub][2] = data[2]; + } + nsub++; break; - default: break; } @@ -232,6 +254,8 @@ int CGenPsi::genpsi(int fd) //-- (II) build PAT -- data_len = COPY_TEMPLATE(pkt, pkt_pat); +// pkt[0xf]= 0xE0 | (pmtpid>>8); +// pkt[0x10] = pmtpid & 0xFF; //-- calculate CRC -- calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 ); //-- write TS packet -- @@ -241,6 +265,12 @@ int CGenPsi::genpsi(int fd) data_len = COPY_TEMPLATE(pkt, pkt_pmt); //-- adjust len dependent to count of audio streams -- data_len += (SIZE_STREAM_TAB_ROW * (nba-1)); + if(vtxtpid){ + data_len += (SIZE_STREAM_TAB_ROW * (1))+10;//add teletext row length + } + if(nsub){ + data_len += ((SIZE_STREAM_TAB_ROW+10) * nsub);//add dvbsub row length + } patch_len = data_len - OFS_HDR_2 + 1; pkt[OFS_HDR_2+1] |= (patch_len>>8); pkt[OFS_HDR_2+2] = (patch_len & 0xFF); @@ -266,13 +296,61 @@ int CGenPsi::genpsi(int fd) pkt[ofs+3] = 0xF0; pkt[ofs+4] = 0x00; } + + //teletext + if(vtxtpid){ + ofs += SIZE_STREAM_TAB_ROW; + pkt[ofs] = 0x06; //teletext stream type; + pkt[ofs+1] = 0xE0 | vtxtpid>>8; + pkt[ofs+2] = vtxtpid&0xff; + pkt[ofs+3] = 0xf0; + pkt[ofs+4] = 0x0A; // ES_info_length + pkt[ofs+5] = 0x52; //DVB-DescriptorTag: 82 (0x52) [= stream_identifier_descriptor] + pkt[ofs+6] = 0x01; // descriptor_length + pkt[ofs+7] = 0x03; //component_tag + pkt[ofs+8] = 0x56; // DVB teletext tag + pkt[ofs+9] = 0x05; // descriptor length + pkt[ofs+10] = vtxtlang[0]; //language code[0] + pkt[ofs+11] = vtxtlang[1]; //language code[1] + pkt[ofs+12] = vtxtlang[2]; //language code[2] + pkt[ofs+13] = (/*descriptor_magazine_number*/ 0x01 & 0x06) | ((/*descriptor_type*/ 0x01 << 3) & 0xF8); + pkt[ofs+14] = 0x00 ; //Teletext_page_number + } + + //dvbsub + for (i=0; i 0 || vtxtpid) + ofs += 10; + + pkt[ofs] = 0x06;//subtitle stream type; + pkt[ofs+1] = 0xE0 | dvbsubpid[i]>>8; + pkt[ofs+2] = dvbsubpid[i] & 0xFF; + pkt[ofs+3] = 0xF0; + pkt[ofs+4] = 0x0A; // es info length + pkt[ofs+5] = 0x59; // DVB sub tag + pkt[ofs+6] = 0x08; // descriptor length + pkt[ofs+7] = dvbsublang[i][0]; //language code[0] + pkt[ofs+8] = dvbsublang[i][1]; //language code[1] + pkt[ofs+9] = dvbsublang[i][2]; //language code[2] + pkt[ofs+10] = 0x20; //subtitle_stream.subtitling_type + pkt[ofs+11] = 0x01>>8; //composition_page_id + pkt[ofs+12] = 0x01&0xff; //composition_page_id + pkt[ofs+13] = 0x01>>8; //ancillary_page_id + pkt[ofs+14] = 0x01&0xff; //ancillary_page_id + } + //-- calculate CRC -- calc_crc32psi(&pkt[data_len], &pkt[OFS_HDR_2], data_len-OFS_HDR_2 ); //-- write TS packet -- write(fd, pkt, SIZE_TS_PKT); + //-- finish -- vpid=0; nba=0; + nsub = 0; + vtxtpid = 0; fdatasync(fd); return 1; } diff --git a/src/driver/genpsi.h b/src/driver/genpsi.h index 3e5c0a051..1fce949d6 100644 --- a/src/driver/genpsi.h +++ b/src/driver/genpsi.h @@ -28,21 +28,26 @@ #define EN_TYPE_TELTEX 0x02 #define EN_TYPE_PCR 0x03 #define EN_TYPE_AVC 0x04 +#define EN_TYPE_DVBSUB 0x06 class CGenPsi { private: - short nba; + short nba, nsub; uint16_t vpid; uint8_t vtype; + uint16_t vtxtpid; + char vtxtlang[3]; uint16_t apid[10]; short atypes[10]; + uint16_t dvbsubpid[10]; + char dvbsublang[10][3]; static int copy_template(uint8_t *dst, uint8_t *src, int len); uint32_t calc_crc32psi(uint8_t *dst, const uint8_t *src, uint32_t len); public: CGenPsi(); - void addPid(uint16_t pid,uint16_t pidtype, short isAC3); + void addPid(uint16_t pid,uint16_t pidtype, short isAC3, const char *data = NULL); int genpsi(int fd); }; #endif diff --git a/src/driver/record.cpp b/src/driver/record.cpp index b1d4cb1c7..97fdf84f5 100644 --- a/src/driver/record.cpp +++ b/src/driver/record.cpp @@ -72,7 +72,7 @@ extern "C" { } //------------------------------------------------------------------------- -CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift, bool stream_vtxt_pid, bool stream_pmt_pid) +CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift, bool stream_vtxt_pid, bool stream_pmt_pid, bool stream_subtitle_pids ) { channel_id = eventinfo->channel_id; epgid = eventinfo->epgID; @@ -86,6 +86,8 @@ CRecordInstance::CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, StreamVTxtPid = stream_vtxt_pid; StreamPmtPid = stream_pmt_pid; + StreamSubtitlePids = stream_subtitle_pids; + Directory = dir; autoshift = timeshift; numpids = 0; @@ -166,10 +168,26 @@ record_error_msg_t CRecordInstance::Start(CZapitChannel * channel) apids[numpids++] = recMovieInfo->audioPids[i].epgAudioPid; psi.addPid(recMovieInfo->audioPids[i].epgAudioPid, EN_TYPE_AUDIO, recMovieInfo->audioPids[i].atype); } + if ((StreamVTxtPid) && (allpids.PIDs.vtxtpid != 0)){ + apids[numpids++] = allpids.PIDs.vtxtpid; + psi.addPid(allpids.PIDs.vtxtpid, EN_TYPE_TELTEX, 0, channel->getTeletextLang()); + } + if (StreamSubtitlePids){ + for (int i = 0 ; i < (int)channel->getSubtitleCount() ; ++i) { + CZapitAbsSub* s = channel->getChannelSub(i); + if (s->thisSubType == CZapitAbsSub::DVB) { + if(i>9)//max sub pids + break; + + CZapitDVBSub* sd = reinterpret_cast(s); + apids[numpids++] = sd->pId; + psi.addPid( sd->pId, EN_TYPE_DVBSUB, 0, sd->ISO639_language_code.c_str() ); + } + } + + } psi.genpsi(fd); - if ((StreamVTxtPid) && (allpids.PIDs.vtxtpid != 0)) - apids[numpids++] = allpids.PIDs.vtxtpid; if ((StreamPmtPid) && (allpids.PIDs.pmtpid != 0)) apids[numpids++] = allpids.PIDs.pmtpid; @@ -666,6 +684,7 @@ CRecordManager::CRecordManager() { StreamVTxtPid = false; StreamPmtPid = false; + StreamSubtitlePids = false; StopSectionsd = false; //recordingstatus = 0; recmap.clear(); @@ -879,7 +898,7 @@ bool CRecordManager::Record(const CTimerd::RecordingInfo * const eventinfo, cons else newdir = Directory; - inst = new CRecordInstance(eventinfo, newdir, timeshift, StreamVTxtPid, StreamPmtPid); + inst = new CRecordInstance(eventinfo, newdir, timeshift, StreamVTxtPid, StreamPmtPid, StreamSubtitlePids); inst->frontend = frontend; error_msg = inst->Record(); diff --git a/src/driver/record.h b/src/driver/record.h index 6c8f914da..7d0b01854 100644 --- a/src/driver/record.h +++ b/src/driver/record.h @@ -88,6 +88,7 @@ class CRecordInstance time_t epg_time; time_t start_time; bool StreamVTxtPid; + bool StreamSubtitlePids; bool StreamPmtPid; unsigned short apids[REC_MAX_APIDS]; unsigned int numpids; @@ -112,7 +113,7 @@ class CRecordInstance record_error_msg_t Start(CZapitChannel * channel); void WaitRecMsg(time_t StartTime, time_t WaitTime); public: - CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift = false, bool stream_vtxt_pid = false, bool stream_pmt_pid = false); + CRecordInstance(const CTimerd::RecordingInfo * const eventinfo, std::string &dir, bool timeshift = false, bool stream_vtxt_pid = false, bool stream_pmt_pid = false, bool stream_subtitle_pids = false); ~CRecordInstance(); record_error_msg_t Record(); @@ -151,6 +152,7 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/ std::string Directory; std::string TimeshiftDirectory; bool StreamVTxtPid; + bool StreamSubtitlePids; bool StreamPmtPid; bool StopSectionsd; int last_mode; @@ -206,11 +208,12 @@ class CRecordManager : public CMenuTarget /*, public CChangeObserver*/ bool RunStartScript(void); bool RunStopScript(void); - void Config(const bool stopsectionsd, const bool stream_vtxt_pid, const bool stream_pmt_pid) + void Config(const bool stopsectionsd, const bool stream_vtxt_pid, const bool stream_pmt_pid, bool stream_subtitle_pids ) { - StopSectionsd = stopsectionsd; - StreamVTxtPid = stream_vtxt_pid; - StreamPmtPid = stream_pmt_pid; + StopSectionsd = stopsectionsd; + StreamVTxtPid = stream_vtxt_pid; + StreamSubtitlePids = stream_subtitle_pids; + StreamPmtPid = stream_pmt_pid; }; void SetDirectory(const char * const directory) { Directory = directory; }; void SetTimeshiftDirectory(const char * const directory) { TimeshiftDirectory = directory; }; diff --git a/src/gui/audioplayer.cpp b/src/gui/audioplayer.cpp index 58185a4dd..92e931bac 100644 --- a/src/gui/audioplayer.cpp +++ b/src/gui/audioplayer.cpp @@ -98,11 +98,6 @@ #include extern cVideo * videoDecoder; -#ifdef ConnectLineBox_Width -#undef ConnectLineBox_Width -#endif -#define ConnectLineBox_Width 16 - #define AUDIOPLAYERGUI_SMSKEY_TIMEOUT 1000 #define SHOW_FILE_LOAD_LIMIT 50 @@ -275,9 +270,10 @@ int CAudioPlayerGui::exec(CMenuTarget* parent, const std::string &actionKey) m_current = 0; m_selected = 0; - m_width=(g_settings.screen_EndX - g_settings.screen_StartX) - 2*ConnectLineBox_Width - 5; - m_height = (g_settings.screen_EndY - g_settings.screen_StartY - 5); + m_width = m_frameBuffer->getScreenWidthRel(); + m_height = m_frameBuffer->getScreenHeightRel(); + m_sheight = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight(); m_buttonHeight = std::max(25, m_sheight); @@ -1935,9 +1931,10 @@ void CAudioPlayerGui::paintItemID3DetailsLine (int pos) // paint id3 infobox if (ibox == NULL) - ibox = new CComponentsInfoBox(m_x, ypos2, m_width, m_info_height, false); + ibox = new CComponentsInfoBox(m_x, ypos2, m_width, m_info_height); + ibox->setCornerRadius(RADIUS_LARGE); ibox->setYPos(ypos2); - ibox->paint(false, true); + ibox->paint(false); g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->RenderString(m_x + 10, ypos2 + 2 + 1*m_fheight, m_width- 80, m_playlist[m_selected].MetaData.title, COL_MENUCONTENTDARK, 0, true); // UTF-8 diff --git a/src/gui/bedit/bouqueteditor_bouquets.cpp b/src/gui/bedit/bouqueteditor_bouquets.cpp index 8b51e269a..da06d8320 100644 --- a/src/gui/bedit/bouqueteditor_bouquets.cpp +++ b/src/gui/bedit/bouqueteditor_bouquets.cpp @@ -122,6 +122,7 @@ void CBEBouquetWidget::paint() int sbc= ((Bouquets->size()- 1)/ listmaxshow)+ 1; int sbs= (selected/listmaxshow); + //scrollbar frameBuffer->paintBoxRel(x+ width- 13, ypos+ 2+ sbs * (sb-4)/sbc, 11, (sb-4)/sbc, COL_MENUCONTENT_PLUS_3); } @@ -228,14 +229,12 @@ int CBEBouquetWidget::exec(CMenuTarget* parent, const std::string & /*actionKey* iheight = std::max(iheight, icol_h+2); iconoffset = std::max(iconoffset, icol_w); - int fw = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getWidth(); - int fh = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight(); - width = w_max (64 * fw, 20); - height = h_max (20 * fh, 50); + width = frameBuffer->getScreenWidthRel(); + height = frameBuffer->getScreenHeightRel() - ButtonHeight; listmaxshow = (height-theight-0)/iheight; height = theight+0+listmaxshow*iheight; // recalc height - x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; - y = frameBuffer->getScreenY() + (frameBuffer->getScreenHeight() - height) / 2; + x = getScreenStartX(width); + y = getScreenStartY(height + ButtonHeight); Bouquets = &g_bouquetManager->Bouquets; paintHead(); diff --git a/src/gui/bedit/bouqueteditor_channels.cpp b/src/gui/bedit/bouqueteditor_channels.cpp index 687b53400..430ff1d94 100644 --- a/src/gui/bedit/bouqueteditor_channels.cpp +++ b/src/gui/bedit/bouqueteditor_channels.cpp @@ -106,7 +106,7 @@ void CBEChannelWidget::paintItem(int pos) bgcolor = COL_MENUCONTENTSELECTED_PLUS_0; if(current < Channels->size()) { - paintItem2DetailsLine (pos, current); + initItem2DetailsLine (pos, current); paintDetails(current); } @@ -183,59 +183,82 @@ void CBEChannelWidget::paintFoot() ::paintButtons(x, y + (height-footerHeight), width, 4, CBEChannelWidgetButtons, width, footerHeight); } -void CBEChannelWidget::paintDetails(int index) +std::string CBEChannelWidget::getInfoText(int index) { + std::string res = ""; + std::string satname = CServiceManager::getInstance()->GetSatelliteName((*Channels)[index]->getSatellitePosition()); transponder t; CServiceManager::getInstance()->GetTransponder((*Channels)[index]->getTransponderId(), t); std::string desc = t.description(); if((*Channels)[index]->pname) desc = desc + " (" + std::string((*Channels)[index]->pname) + ")"; - else + else desc = desc + " (" + satname + ")"; - - g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->RenderString(x+ 10, y+ height+ 5+ fheight+INFO_BOX_Y_OFFSET, width - 30, satname.c_str(), COL_MENUCONTENTDARK, 0, true); - g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->RenderString(x+ 10, y+ height+ 5+ 2*fheight+INFO_BOX_Y_OFFSET, width - 30, desc.c_str(), COL_MENUCONTENTDARK, 0, true); + + res = satname + "\n" + desc; + + return res; } -void CBEChannelWidget::paintItem2DetailsLine (int pos, int /*ch_index*/) +void CBEChannelWidget::paintDetails(int index) { -#define ConnectLineBox_Width 16 + //details line + dline->paint(); + + std::string str = getInfoText(index); + + //info box + ibox->setText(str, CTextBox::AUTO_WIDTH | CTextBox::NO_AUTO_LINEBREAK, g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]); + ibox->paint(CC_SAVE_SCREEN_YES); +} +void CBEChannelWidget::initItem2DetailsLine (int pos, int /*ch_index*/) +{ int xpos = x - ConnectLineBox_Width; int ypos1 = y + theight+0 + pos*fheight; int ypos2 = y + height + INFO_BOX_Y_OFFSET; int ypos1a = ypos1 + (fheight/2)-2; int ypos2a = ypos2 + (info_height/2)-2; - - clearItem2DetailsLine(); - - // paint Line if detail info (and not valid list pos) + + if (dline) + dline->kill(); //kill details line + + // init Line if detail info (and not valid list pos) if (pos >= 0) { if (dline == NULL) dline = new CComponentsDetailLine(xpos, ypos1a, ypos2a, fheight/2+1, info_height-RADIUS_LARGE*2); dline->setYPos(ypos1a); - dline->paint(); - + //infobox if (ibox == NULL) - ibox = new CComponentsInfoBox(x, ypos2, width, info_height, false); + ibox = new CComponentsInfoBox(); + + if (ibox->isPainted()) + ibox->hide(CC_SAVE_SCREEN_NO); + + ibox->setDimensionsAll(x, ypos2, width, info_height); + ibox->setFrameThickness(2); +#if 0 ibox->paint(false,true); +#endif + ibox->setCornerRadius(RADIUS_LARGE); + ibox->setShadowOnOff(CC_SHADOW_OFF); } } void CBEChannelWidget::clearItem2DetailsLine() { - if (dline != NULL) - dline->hide(); - if (ibox != NULL) - ibox->hide(); + if (dline) + dline->kill(); //kill details line + if (ibox) + ibox->kill(); //kill info box } void CBEChannelWidget::hide() { - frameBuffer->paintBackgroundBoxRel(x,y, width,height+footerHeight+info_height); + frameBuffer->paintBackgroundBoxRel(x,y, width,height+footerHeight); clearItem2DetailsLine (); frameBuffer->blit(); } @@ -272,15 +295,16 @@ int CBEChannelWidget::exec(CMenuTarget* parent, const std::string & /*actionKey* if (parent) parent->hide(); - int fw = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getWidth(); - width = w_max ((frameBuffer->getScreenWidth() / 20 * (fw+6)), 100); - height = h_max ((frameBuffer->getScreenHeight() / 20 * 17), (frameBuffer->getScreenHeight() / 20 * 2)); + width = frameBuffer->getScreenWidthRel(); + info_height = 2*iheight + 4; + height = frameBuffer->getScreenHeightRel() - info_height; listmaxshow = (height-theight-footerHeight-0)/iheight; height = theight+footerHeight+listmaxshow*iheight; // recalc height - info_height = 2*iheight + 10; - x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; - y = frameBuffer->getScreenY() + (frameBuffer->getScreenHeight() - (height + info_height)) / 2; + x = getScreenStartX(width); + if (x < ConnectLineBox_Width) + x = ConnectLineBox_Width; + y = getScreenStartY(height + info_height); Channels = mode == CZapitClient::MODE_TV ? &(g_bouquetManager->Bouquets[bouquet]->tvChannels) : &(g_bouquetManager->Bouquets[bouquet]->radioChannels); paintHead(); diff --git a/src/gui/bedit/bouqueteditor_channels.h b/src/gui/bedit/bouqueteditor_channels.h index d3132af0d..90d4d03d4 100644 --- a/src/gui/bedit/bouqueteditor_channels.h +++ b/src/gui/bedit/bouqueteditor_channels.h @@ -84,7 +84,7 @@ class CBEChannelWidget : public CMenuTarget void paintItem(int pos); void paintDetails(int index); - void paintItem2DetailsLine (int pos, int ch_index); + void initItem2DetailsLine (int pos, int ch_index); void clearItem2DetailsLine (); void paint(); void paintHead(); @@ -99,6 +99,7 @@ class CBEChannelWidget : public CMenuTarget void cancelMoveChannel(); void internalMoveChannel( unsigned int fromPosition, unsigned int toPosition); + std::string getInfoText(int index); public: CBEChannelWidget( const std::string & Caption, unsigned int Bouquet); ~CBEChannelWidget(); diff --git a/src/gui/bedit/bouqueteditor_chanselect.cpp b/src/gui/bedit/bouqueteditor_chanselect.cpp index 7587b47ef..5e2432668 100644 --- a/src/gui/bedit/bouqueteditor_chanselect.cpp +++ b/src/gui/bedit/bouqueteditor_chanselect.cpp @@ -45,7 +45,6 @@ #include #include - extern CBouquetManager *g_bouquetManager; CBEChannelSelectWidget::CBEChannelSelectWidget(const std::string & Caption, unsigned int Bouquet, CZapitClient::channelsMode Mode) @@ -73,18 +72,12 @@ CBEChannelSelectWidget::CBEChannelSelectWidget(const std::string & Caption, unsi liststart = 0; bouquetChannels = NULL; dline = NULL; - ibox = NULL; + ibox = new CComponentsInfoBox(); } CBEChannelSelectWidget::~CBEChannelSelectWidget() { - // clear details line - if (dline != NULL) - dline->hide(); delete dline; - // clear infobox - if (ibox != NULL) - ibox->hide(); delete ibox; } @@ -120,7 +113,7 @@ void CBEChannelSelectWidget::paintItem(uint32_t itemNr, int paintNr, bool pselec bgcolor = COL_MENUCONTENTSELECTED_PLUS_0; if(itemNr < getItemCount()) { - paintItem2DetailsLine (paintNr, itemNr); + initItem2DetailsLine (paintNr, itemNr); paintDetails(itemNr); } @@ -169,15 +162,16 @@ void CBEChannelSelectWidget::onOkKeyPressed() int CBEChannelSelectWidget::exec(CMenuTarget* parent, const std::string & actionKey) { - int fw = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getWidth(); - width = w_max ((frameBuffer->getScreenWidth() / 20 * (fw+6)), 100); - height = h_max ((frameBuffer->getScreenHeight() / 20 * 17), (frameBuffer->getScreenHeight() / 20 * 2)); + width = frameBuffer->getScreenWidthRel(); + height = frameBuffer->getScreenHeightRel(); listmaxshow = (height-theight-footerHeight-0)/iheight; height = theight+footerHeight+listmaxshow*iheight; // recalc height - info_height = 2*iheight + 10; + info_height = 2*iheight + 4; - x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - width) / 2; - y = frameBuffer->getScreenY() + (frameBuffer->getScreenHeight() - (height + info_height)) / 2; + x = getScreenStartX(width); + if (x < ConnectLineBox_Width) + x = ConnectLineBox_Width; + y = getScreenStartY(height + info_height); bouquetChannels = mode == CZapitClient::MODE_TV ? &(g_bouquetManager->Bouquets[bouquet]->tvChannels) : &(g_bouquetManager->Bouquets[bouquet]->radioChannels); @@ -212,8 +206,10 @@ void CBEChannelSelectWidget::paintFoot() #endif } -void CBEChannelSelectWidget::paintDetails(int index) +std::string CBEChannelSelectWidget::getInfoText(int index) { + std::string res = ""; + std::string satname = CServiceManager::getInstance()->GetSatelliteName(Channels[index]->getSatellitePosition()); transponder t; CServiceManager::getInstance()->GetTransponder(Channels[index]->getTransponderId(), t); @@ -222,41 +218,49 @@ void CBEChannelSelectWidget::paintDetails(int index) desc = desc + " (" + std::string(Channels[index]->pname) + ")"; else desc = desc + " (" + satname + ")"; - - g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->RenderString(x+ 10, y+ height+ 5+ fheight+INFO_BOX_Y_OFFSET, width - 30, satname.c_str(), COL_MENUCONTENTDARK, 0, true); - g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->RenderString(x+ 10, y+ height+ 5+ 2*fheight+INFO_BOX_Y_OFFSET, width - 30, desc.c_str(), COL_MENUCONTENTDARK, 0, true); + + res = satname + "\n" + desc; + + return res; } -void CBEChannelSelectWidget::paintItem2DetailsLine (int pos, int /*ch_index*/) +void CBEChannelSelectWidget::paintDetails(int index) { -#define ConnectLineBox_Width 16 + //details line + dline->paint(); + + std::string str = getInfoText(index); + + //info box + ibox->setText(str, CTextBox::AUTO_WIDTH | CTextBox::NO_AUTO_LINEBREAK, g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]); + ibox->paint(false); +} +void CBEChannelSelectWidget::initItem2DetailsLine (int pos, int /*ch_index*/) +{ int xpos = x - ConnectLineBox_Width; int ypos1 = y + theight+0 + pos*fheight; int ypos2 = y + height + INFO_BOX_Y_OFFSET; int ypos1a = ypos1 + (fheight/2)-2; int ypos2a = ypos2 + (info_height/2)-2; - // clear details line - if (dline != NULL) - dline->hide(); + if (dline) + dline->kill(); //kill details line - // clear infobox - if (ibox != NULL) - ibox->hide(); - - // paint Line if detail info (and not valid list pos) + // init Line if detail info (and not valid list pos) if (pos >= 0) { if (dline == NULL) dline = new CComponentsDetailLine(xpos, ypos1a, ypos2a, fheight/2+1, info_height-RADIUS_LARGE*2); dline->setYPos(ypos1a); - dline->paint(false); //infobox - if (ibox == NULL) - ibox = new CComponentsInfoBox(x, ypos2, width, info_height, false); - ibox->paint(false,true); + if (ibox){ + ibox->setDimensionsAll(x, ypos2, width, info_height); + ibox->setFrameThickness(2); + ibox->setCornerRadius(RADIUS_LARGE); + ibox->setShadowOnOff(CC_SHADOW_OFF); + } } } diff --git a/src/gui/bedit/bouqueteditor_chanselect.h b/src/gui/bedit/bouqueteditor_chanselect.h index 58ad2ebf3..729c3d7af 100644 --- a/src/gui/bedit/bouqueteditor_chanselect.h +++ b/src/gui/bedit/bouqueteditor_chanselect.h @@ -54,13 +54,14 @@ class CBEChannelSelectWidget : public CListBox uint getItemCount(); void paintItem(uint32_t itemNr, int paintNr, bool selected); void paintDetails(int index); - void paintItem2DetailsLine (int pos, int ch_index); + void initItem2DetailsLine (int pos, int ch_index); void paintFoot(); void onOkKeyPressed(); int footerHeight; int info_height; - + + std::string getInfoText(int index); public: ZapitChannelList Channels; ZapitChannelList * bouquetChannels; diff --git a/src/gui/bouquetlist.cpp b/src/gui/bouquetlist.cpp index a810861e5..58524cc80 100644 --- a/src/gui/bouquetlist.cpp +++ b/src/gui/bouquetlist.cpp @@ -326,6 +326,7 @@ int CBouquetList::show(bool bShowChannelList) int icol_w, icol_h; int w_max_text = 0; int w_max_icon = 0; + int h_max_icon = 0; favonly = !bShowChannelList; for(unsigned int count = 0; count < sizeof(CBouquetListButtons)/sizeof(CBouquetListButtons[0]);count++){ @@ -333,6 +334,7 @@ int CBouquetList::show(bool bShowChannelList) w_max_text = std::max(w_max_text, w_text); frameBuffer->getIconSize(CBouquetListButtons[count].button, &icol_w, &icol_h); w_max_icon = std::max(w_max_icon, icol_w); + h_max_icon = std::max(h_max_icon, icol_h); } int need_width = sizeof(CBouquetListButtons)/sizeof(CBouquetListButtons[0])*(w_max_icon + w_max_text + 20); @@ -342,10 +344,7 @@ int CBouquetList::show(bool bShowChannelList) width = w_max (need_width, 20);//500 height = h_max (16 * fheight, 40); - /* assuming all color icons must have same size */ - frameBuffer->getIconSize(NEUTRINO_ICON_BUTTON_RED, &icol_w, &icol_h); - - footerHeight = std::max(icol_h+8, g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight()+8); //TODO get footerHeight from buttons + footerHeight = std::max(h_max_icon+8, g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight()+8); theight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); listmaxshow = (height - theight - footerHeight)/fheight; height = theight + footerHeight + listmaxshow * fheight; // recalc height diff --git a/src/gui/channellist.cpp b/src/gui/channellist.cpp index 800835167..5f970e3ea 100644 --- a/src/gui/channellist.cpp +++ b/src/gui/channellist.cpp @@ -94,8 +94,6 @@ extern int old_b_id; extern cVideo * videoDecoder; -#define ConnectLineBox_Width 16 - CChannelList::CChannelList(const char * const pName, bool phistoryMode, bool _vlist) { frameBuffer = CFrameBuffer::getInstance(); @@ -113,8 +111,10 @@ CChannelList::CChannelList(const char * const pName, bool phistoryMode, bool _vl selected_chid = 0; footerHeight = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight()+6; //initial height value for buttonbar theight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); + fheight = g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->getHeight(); previous_channellist_additional = -1; eventFont = SNeutrinoSettings::FONT_TYPE_CHANNELLIST_EVENT; + dline = NULL; //printf("************ NEW LIST %s : %x\n", name.c_str(), (int) this);fflush(stdout); } @@ -122,6 +122,7 @@ CChannelList::~CChannelList() { //printf("************ DELETE LIST %s : %x\n", name.c_str(), this);fflush(stdout); chanlist.clear(); + delete dline; } void CChannelList::ClearList(void) @@ -484,9 +485,17 @@ int CChannelList::exec() void CChannelList::calcSize() { - const int pic_h = 39; + CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8, name.c_str()); - full_width = frameBuffer->getScreenWidth() - frameBuffer->getScreenX() - 2*ConnectLineBox_Width; + // recalculate theight, fheight and footerHeight for a possilble change of fontsize factor + theight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); + fheight = g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->getHeight(); + if (fheight == 0) + fheight = 1; /* avoid div-by-zero crash on invalid font */ + footerHeight = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight()+6; + + // calculate width + full_width = frameBuffer->getScreenWidthRel(); if (g_settings.channellist_additional) width = full_width / 3 * 2; else @@ -496,23 +505,20 @@ void CChannelList::calcSize() width = full_width; } - height = h_max ((frameBuffer->getScreenHeight() / 20 * 16), 0); + // calculate height (the infobox below mainbox is handled outside height) + info_height = 2*fheight + g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST_DESCR]->getHeight() + 10; + height = frameBuffer->getScreenHeightRel() - info_height; - x = frameBuffer->getScreenX() + (frameBuffer->getScreenWidth() - full_width) / 2; + // calculate x position + x = getScreenStartX(full_width); if (x < ConnectLineBox_Width) x = ConnectLineBox_Width; - y = frameBuffer->getScreenY(); - - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8, name.c_str()); - - /* assuming all color icons must have same size */ - int icol_w, icol_h; - frameBuffer->getIconSize(NEUTRINO_ICON_BUTTON_RED, &icol_w, &icol_h); - - theight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); + // calculate header height + const int pic_h = 39; theight = std::max(theight, pic_h); + int icol_w, icol_h; frameBuffer->getIconSize(NEUTRINO_ICON_BUTTON_HELP, &icol_w, &icol_h); theight = std::max(theight, icol_h); @@ -525,18 +531,16 @@ void CChannelList::calcSize() theight = std::max(theight, icol_h); } - fheight = g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST]->getHeight(); - if (fheight == 0) - fheight = 1; /* avoid crash on invalid font */ + // calculate max entrys in mainbox + listmaxshow = (height - theight - footerHeight) / fheight; - listmaxshow = (height - theight - footerHeight -0)/fheight; - height = theight + footerHeight + listmaxshow * fheight; - info_height = 2*fheight + g_Font[SNeutrinoSettings::FONT_TYPE_CHANNELLIST_DESCR]->getHeight() + 10; + // recalculate height to avoid spaces between last entry in mainbox and footer + height = theight + listmaxshow*fheight + footerHeight; - int sh = frameBuffer->getScreenHeight(); - int ytmp = (sh - height - info_height) / 2; - y += ytmp; + // calculate y position + y = getScreenStartY(height + info_height); + // calculate width/height of right info_zone and pip-box infozone_width = full_width - width; pig_width = infozone_width; if (g_settings.channellist_additional == 2) // with miniTV @@ -635,9 +639,9 @@ int CChannelList::show() } else loop=false; } - else if( msg == CRCInput::RC_record) { //start direct recording from channellist + else if( msg == CRCInput::RC_record) { //start direct recording from channellist #if 0 - if(!CRecordManager::getInstance()->RecordingStatus(chanlist[selected]->channel_id)) + if(!CRecordManager::getInstance()->RecordingStatus(chanlist[selected]->channel_id)) { printf("[neutrino channellist] start direct recording...\n"); hide(); @@ -649,10 +653,10 @@ int CChannelList::show() loop=false; } else - DisplayInfoMessage(g_Locale->getText(LOCALE_CHANNELLIST_RECORDING_NOT_POSSIBLE)); // UTF-8 + DisplayInfoMessage(g_Locale->getText(LOCALE_CHANNELLIST_RECORDING_NOT_POSSIBLE)); // UTF-8 } - - } + + } #endif if(SameTP()) { printf("[neutrino channellist] start direct recording...\n"); @@ -662,7 +666,7 @@ int CChannelList::show() paint(); } else loop=false; - + } } else if( msg == CRCInput::RC_stop ) { //stopp recording @@ -748,6 +752,8 @@ int CChannelList::show() } else if (msg == (neutrino_msg_t)g_settings.key_bouquet_up || msg == (neutrino_msg_t)g_settings.key_bouquet_down) { + if (dline) + dline->kill(); //kill details line on change to next page if (!bouquetList->Bouquets.empty()) { bool found = true; int dir = msg == (neutrino_msg_t)g_settings.key_bouquet_up ? 1 : -1; @@ -800,7 +806,7 @@ int CChannelList::show() zapOnExit = true; loop = false; } - else if(g_settings.sms_channel) { + else if(g_settings.sms_channel) { unsigned char smsKey = 0; SMSKeyInput smsInput; smsInput.setTimeout(CHANNEL_SMSKEY_TIMEOUT); @@ -936,7 +942,7 @@ void CChannelList::hide() { videoDecoder->Pig(-1, -1, -1, -1); } - frameBuffer->paintBackgroundBoxRel(x, y, full_width, height+ info_height+ 5); + frameBuffer->paintBackgroundBoxRel(x, y, full_width, height + info_height); clearItem2DetailsLine(); frameBuffer->blit(); } @@ -1402,7 +1408,7 @@ CZapitChannel* CChannelList::getPrevNextChannel(int key, unsigned int &sl) bactive--; bouquetList->activateBouquet(bactive, false); cactive = bouquetList->Bouquets[bactive]->channelList->getSize() - 1; - } else + } else --cactive; } else if ((key == g_settings.key_quickzap_up) || (key == CRCInput::RC_right)) { @@ -1632,22 +1638,29 @@ void CChannelList::clearItem2DetailsLine() void CChannelList::paintItem2DetailsLine (int pos) { int xpos = x - ConnectLineBox_Width; - int ypos1 = y + theight+0 + pos*fheight; + int ypos1 = y + theight + pos*fheight; int ypos2 = y + height; int ypos1a = ypos1 + (fheight/2)-2; int ypos2a = ypos2 + (info_height/2)-2; fb_pixel_t col1 = COL_MENUCONTENT_PLUS_6; - // Clear - frameBuffer->paintBackgroundBoxRel(xpos,y, ConnectLineBox_Width, height+info_height + 1); + + if (dline){ + dline->kill(); //kill details line + delete dline; + dline = NULL; + } +// // Clear +// frameBuffer->paintBackgroundBoxRel(xpos,y, ConnectLineBox_Width, height+info_height + 1); // paint Line if detail info (and not valid list pos) if (pos >= 0) { //pos >= 0 && chanlist[ch_index]->currentEvent.description != "") { if(1) // FIXME why -> ? (!g_settings.channellist_extended) { //details line - CComponentsDetailLine details_line(xpos, ypos1a, ypos2a, fheight/2+1, info_height-RADIUS_LARGE*2); - details_line.paint(); - + if (dline == NULL) + dline = new CComponentsDetailLine(xpos, ypos1a, ypos2a, fheight/2+1, info_height-RADIUS_LARGE*2); + dline->paint(); + //info box frame frameBuffer->paintBoxFrame(x, ypos2, full_width, info_height, 2, col1, RADIUS_LARGE); } @@ -1729,7 +1742,7 @@ void CChannelList::paintButtonBar(bool is_current) Bindex++; //manage record button bool do_record = CRecordManager::getInstance()->RecordingStatus(getActiveChannel_ChannelID()); - + if (g_settings.recording_type != RECORDING_OFF && !displayNext){ if (is_current && !do_record){ Button[Bindex].locale = LOCALE_MAINMENU_RECORDING; @@ -1773,7 +1786,7 @@ void CChannelList::paintButtonBar(bool is_current) void CChannelList::paintItem(int pos) { - int ypos = y+ theight+0 + pos*fheight; + int ypos = y+ theight + pos*fheight; uint8_t color; fb_pixel_t bgcolor; bool iscurrent = true; @@ -1859,34 +1872,34 @@ void CChannelList::paintItem(int pos) //record check rec_mode = CRecordManager::getInstance()->GetRecordMode(chanlist[curr]->channel_id); - + //set recording icon const char * rec_icon = ""; if (rec_mode & CRecordManager::RECMODE_REC) rec_icon = NEUTRINO_ICON_REC; else if (rec_mode & CRecordManager::RECMODE_TSHIFT) rec_icon = NEUTRINO_ICON_AUTO_SHIFT; - + //calculating icons int icon_x = (x+width-15-2) - RADIUS_LARGE/2; int r_icon_w=0; int s_icon_h=0; int s_icon_w=0; frameBuffer->getIconSize(NEUTRINO_ICON_SCRAMBLED, &s_icon_w, &s_icon_h); r_icon_w = ChannelList_Rec; int r_icon_x = icon_x; - + //paint scramble icon if(chan->scrambled) if (frameBuffer->paintIcon(NEUTRINO_ICON_SCRAMBLED, icon_x - s_icon_w, ypos, fheight))//ypos + (fheight - 16)/2); r_icon_x = r_icon_x - s_icon_w; - + //paint recording icon if (rec_mode != CRecordManager::RECMODE_OFF) frameBuffer->paintIcon(rec_icon, r_icon_x - r_icon_w, ypos, fheight);//ypos + (fheight - 16)/2); - + //paint buttons if (paintbuttons) paintButtonBar(iscurrent); - + int icon_space = r_icon_w+s_icon_w; //number @@ -1910,7 +1923,7 @@ void CChannelList::paintItem(int pos) int max_desc_len = width - numwidth - prg_offset - ch_name_len - 15 - 20; // 15 = scrollbar, 20 = spaces if (chan->scrambled || (g_settings.channellist_extended ||g_settings.channellist_epgtext_align_right)) max_desc_len -= icon_space; /* do we need space for the lock/rec icon? */ - + if (max_desc_len < 0) max_desc_len = 0; if ((int) ch_desc_len > max_desc_len) @@ -2050,7 +2063,7 @@ void CChannelList::paint() paintItem(count); } const int ypos = y+ theight; - const int sb = fheight* listmaxshow; + const int sb = height - theight - footerHeight; // paint scrollbar over full height of main box frameBuffer->paintBoxRel(x+ width- 15,ypos, 15, sb, COL_MENUCONTENT_PLUS_1); const int sbc= ((chanlist.size()- 1)/ listmaxshow)+ 1; @@ -2184,7 +2197,7 @@ void CChannelList::paint_events(int index) } while ( dif > 0 ); } - if (e == evtlist.end()) + if (e == evtlist.end()) break; //Display the remaining events diff --git a/src/gui/channellist.h b/src/gui/channellist.h index ea9688cec..1dd633d35 100644 --- a/src/gui/channellist.h +++ b/src/gui/channellist.h @@ -35,6 +35,7 @@ #include #include +#include #include #include @@ -74,10 +75,12 @@ private: std::string name; ZapitChannelList chanlist; CZapProtection* zapProtection; - + CComponentsDetailLine *dline; + int full_width; int width; int height; + int info_height; // the infobox below mainbox is handled outside height int x; int y; int logo_off; @@ -93,7 +96,6 @@ private: bool displayNext; bool displayList; - int info_height; int ChannelList_Rec; void paintDetails(int index); diff --git a/src/gui/components/Makefile.am b/src/gui/components/Makefile.am index 6b215175c..d72c0396f 100644 --- a/src/gui/components/Makefile.am +++ b/src/gui/components/Makefile.am @@ -22,4 +22,16 @@ noinst_LIBRARIES = libneutrino_gui_components.a libneutrino_gui_components_a_SOURCES = \ - components.cpp + cc_base.cpp \ + cc_detailsline.cpp \ + cc_frm.cpp \ + cc_frm_header.cpp \ + cc_frm_icons.cpp \ + cc_frm_window.cpp \ + cc_item.cpp \ + cc_item_box.cpp \ + cc_item_infobox.cpp \ + cc_item_picture.cpp \ + cc_item_shapes.cpp \ + cc_item_text.cpp \ + cc_item_tvpig.cpp diff --git a/src/gui/components/cc.h b/src/gui/components/cc.h index 522146dfc..644457254 100644 --- a/src/gui/components/cc.h +++ b/src/gui/components/cc.h @@ -2,23 +2,23 @@ Based up Neutrino-GUI - Tuxbox-Project Copyright (C) 2001 by Steffen Hehn 'McClean' - Classes for generic for GUI-related components. + Classes for generic GUI-related components. Copyright (C) 2012, 2013, Thilo Graf 'dbt' License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ @@ -26,85 +26,532 @@ #ifndef __COMPONENTS__ #define __COMPONENTS__ -#include -#include -#include +#include "cc_types.h" +#include #include +#include +#include -//required typedefs -typedef struct comp_fbdata_t -{ - int x; - int y; - int dx; - int dy; - fb_pixel_t color; - int r; - void * data; - fb_pixel_t* pixbuf; - bool is_frame; - int frame_thickness; -} comp_fbdata_struct_t; +// #define DEBUG_CC class CComponents { protected: - int x, y, height, width, sw; + int x, y, height, width, corner_type, shadow_w; + int corner_rad, fr_thickness; CFrameBuffer * frameBuffer; - std::vector v_screen_val; - - void paintFbItems(struct comp_fbdata_t * fbdata, const int items_count, bool do_save_bg = true); - fb_pixel_t* saveScreen(int ax, int ay, int dx, int dy); - void clear(); + std::vector v_fbdata; + fb_pixel_t col_body, col_shadow, col_frame; + bool firstPaint, shadow, is_painted, paint_bg; + + void initVarBasic(); + void paintFbItems(bool do_save_bg = true); + fb_pixel_t* getScreen(int ax, int ay, int dx, int dy); + comp_screen_data_t saved_screen; + void clearSavedScreen(); + virtual void clear(); public: - CComponents(const int x_pos = 0, const int y_pos = 0, const int h = 0, const int w = 0); + CComponents(); virtual~CComponents(); - virtual void setXPos(const int& xpos){x = xpos;}; - virtual void setYPos(const int& ypos){y = ypos;}; - virtual void setHeight(const int& h){height = h;}; - virtual void setWidth(const int& w){width = w;}; - virtual void restore(); + inline virtual void setXPos(const int& xpos){x = xpos;}; + inline virtual void setYPos(const int& ypos){y = ypos;}; + inline virtual void setHeight(const int& h){height = h;}; + inline virtual void setWidth(const int& w){width = w;}; + inline virtual void setDimensionsAll(const int& xpos, const int& ypos, const int& w, const int& h){x = xpos; y = ypos; width = w; height = h;}; + + inline virtual int getXPos(){return x;}; + inline virtual int getYPos(){return y;}; + inline virtual int getHeight(){return height;}; + inline virtual int getWidth(){return width;}; + inline virtual void getDimensions(int* xpos, int* ypos, int* w, int* h){*xpos=x; *ypos=y; *w=width; *h=height;}; + +/// set colors: Possible color values are defined in "gui/color.h" and "gui/customcolor.h" + inline virtual void setColorFrame(fb_pixel_t color){col_frame = color;}; + inline virtual void setColorBody(fb_pixel_t color){col_body = color;}; + inline virtual void setColorShadow(fb_pixel_t color){col_shadow = color;}; + inline virtual void setColorAll(fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow){col_frame = color_frame; col_body = color_body; col_shadow = color_shadow;}; +/// get colors + inline virtual fb_pixel_t getColorFrame(){return col_frame;}; + inline virtual fb_pixel_t getColorBody(){return col_body;}; + inline virtual fb_pixel_t getColorShadow(){return col_shadow;}; + +/// set corner types: Possible corner types are defined in CFrameBuffer (see: driver/framebuffer.h). + inline virtual void setCornerType(const int& type){corner_type = type;}; + inline virtual void setCornerRadius(const int& radius){corner_rad = radius;}; +/// get corner types: + inline virtual int getCornerType(){return corner_type;}; + inline virtual int getCornerRadius(){return corner_rad;}; + + inline virtual void setFrameThickness(const int& thickness){fr_thickness = thickness;}; + inline virtual void setShadowOnOff(bool has_shadow){shadow = has_shadow;}; + + virtual void hide(); + virtual bool isPainted(){return is_painted;} + virtual void doPaintBg(bool do_paint){paint_bg = do_paint;}; }; +class CComponentsItem : public CComponents +{ + protected: + int cc_item_type; + int cc_item_index; + + void hideCCItem(bool no_restore = false); + void paintInit(bool do_save_bg); + void initVarItem(); + + public: + enum + { + CC_ITEMTYPE_BASE, + CC_ITEMTYPE_PICTURE, + CC_ITEMTYPE_TEXT, + CC_ITEMTYPE_TEXT_INFOBOX, + CC_ITEMTYPE_SHAPE_SQUARE, + CC_ITEMTYPE_SHAPE_CIRCLE, + CC_ITEMTYPE_PIP, + CC_ITEMTYPE_FRM, + CC_ITEMTYPE_FRM_HEADER, + CC_ITEMTYPE_FRM_ICONFORM, + CC_ITEMTYPE_FRM_WINDOW, + CC_ITEMTYPE_LABEL, + + CC_ITEMTYPES + }; + CComponentsItem(); + + virtual void paint(bool do_save_bg = CC_SAVE_SCREEN_YES) = 0; + virtual void hide(bool no_restore = false); + virtual void kill(); + virtual int getItemType(); + virtual void syncSysColors(); +}; + +class CComponentsPicture : public CComponentsItem +{ + private: + enum + { + CC_PIC_IMAGE_MODE_OFF = 0, //paint pictures in icon mode, mainly not scaled + CC_PIC_IMAGE_MODE_ON = 1, //paint pictures in image mode, paint scaled if required + CC_PIC_IMAGE_MODE_AUTO = 2 + }; + + std::string pic_name; + unsigned char pic_offset; + bool pic_paint, pic_paintBg, pic_painted, do_paint; + int pic_align, pic_x, pic_y, pic_width, pic_height; + int pic_max_w, pic_max_h, pic_paint_mode; + + void initVarPicture(); + void init( const int x_pos, const int y_pos, const std::string& image_name, const int alignment, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_background, fb_pixel_t color_shadow); + + public: + CComponentsPicture( const int x_pos, const int y_pos, const int w, const int h, + const std::string& image_name, const int alignment = CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER, bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_background = 0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + + inline void setPictureOffset(const unsigned char offset){pic_offset = offset;}; + inline void setPicturePaint(bool paint_p){pic_paint = paint_p;}; + inline void setPicturePaintBackground(bool paintBg){pic_paintBg = paintBg;}; + void setPicture(const std::string& picture_name); + void setPictureAlign(const int alignment); + + inline bool isPicPainted(){return pic_painted;}; + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void hide(bool no_restore = false); + inline void getPictureSize(int *pwidth, int *pheight){*pwidth=pic_width; *pheight=pic_height;}; + void setMaxWidth(const int w_max){pic_max_w = w_max;}; + void setMaxHeight(const int h_max){pic_max_h = h_max;}; +}; + +class CComponentsText : public CComponentsItem +{ + protected: + CTextBox * ct_textbox; + CBox * ct_box; + Font * ct_font; + + fb_pixel_t ct_col_text; + int ct_text_mode; //see textbox.h for possible modes + const char* ct_text; + bool ct_text_sent; + + void initVarText(); + void clearCCText(); + void initCCText(); + void paintText(bool do_save_bg = CC_SAVE_SCREEN_YES); + public: + CComponentsText(); + CComponentsText( const int x_pos, const int y_pos, const int w, const int h, + const char* text = "", const int mode = CTextBox::AUTO_WIDTH, Font* font_text = NULL, + bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_text = COL_MENUCONTENT, fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + virtual ~CComponentsText(); + + void hide(bool no_restore = false); + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + + virtual inline void setTextFont(Font* font_text){ct_font = font_text;}; + virtual inline void setTextColor(fb_pixel_t color_text){ ct_col_text = color_text;}; + virtual inline void setTextMode(const int mode){ct_text_mode = mode;};//see textbox.h for possible modes + virtual void setText(const char* ctext, const int mode = ~CTextBox::AUTO_WIDTH, Font* font_text = NULL); + virtual void setText(const std::string& stext, const int mode = ~CTextBox::AUTO_WIDTH, Font* font_text = NULL); + virtual void setText(neutrino_locale_t locale_text, const int mode = ~CTextBox::AUTO_WIDTH, Font* font_text = NULL); + virtual void removeLineBreaks(std::string& str); + + //get a Text Box object, so it's possible to get access directly to its methods + CTextBox* getCTextBoxObject() { return ct_textbox; }; +}; + +class CComponentsLabel : public CComponentsText +{ + public: + CComponentsLabel( const int x_pos, const int y_pos, const int w, const int h, + const char* text = "", const int mode = CTextBox::AUTO_WIDTH, Font* font_text = NULL, + bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_text = COL_MENUCONTENTINACTIVE, fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0) + :CComponentsText(x_pos, y_pos, w, h, text, mode, font_text, has_shadow, color_text, color_frame, color_body, color_shadow) + { + cc_item_type = CC_ITEMTYPE_LABEL; + }; + CComponentsLabel():CComponentsText() + { + initVarText(); + cc_item_type = CC_ITEMTYPE_LABEL; + ct_col_text = COL_MENUCONTENTINACTIVE; + }; +}; + +#define INFO_BOX_Y_OFFSET 2 +class CComponentsInfoBox : public CComponentsText +{ + private: + int x_text, x_offset; + CComponentsPicture * pic; + std::string pic_default_name; + + void paintPicture(); + void initVarInfobox(); + std::string pic_name; + + public: + CComponentsText * cctext; + + CComponentsInfoBox(); + CComponentsInfoBox( const int x_pos, const int y_pos, const int w, const int h, + const char* info_text = NULL, const int mode = CTextBox::AUTO_WIDTH, Font* font_text = NULL, + bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_text = COL_MENUCONTENT, fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + + ~CComponentsInfoBox(); + + inline void setSpaceOffset(const int offset){x_offset = offset;}; + inline void setPicture(const std::string& picture_name){pic_name = picture_name;}; + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); +}; + + +class CComponentsShapeCircle : public CComponentsItem +{ + private: + int d; + public: + CComponentsShapeCircle( const int x_pos, const int y_pos, const int diam, bool has_shadow = CC_SHADOW_ON, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + + inline void setDiam(const int& diam){d=width=height=diam, corner_rad=d/2;}; + inline int getDiam(){return d;}; + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); +}; + +class CComponentsShapeSquare : public CComponentsItem +{ + public: + CComponentsShapeSquare( const int x_pos, const int y_pos, const int w, const int h, bool has_shadow = CC_SHADOW_ON, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); +}; + +class CComponentsPIP : public CComponentsItem +{ + private: + int screen_w, screen_h; + std::string pic_name; //alternate picture if is no tv picture available + public: + CComponentsPIP( const int x_pos, const int y_pos, const int percent = 30, bool has_shadow = CC_SHADOW_OFF); + ~CComponentsPIP(); + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void hide(bool no_restore = false); + void setScreenWidth(int screen_width){screen_w = screen_width;}; + void setScreenHeight(int screen_heigth){screen_h = screen_heigth;}; + void setPicture(const std::string& image){pic_name = image;}; +}; + + class CComponentsDetailLine : public CComponents { private: int thickness, y_down, h_mark_top, h_mark_down; - fb_pixel_t col_line, col_shadow; + + void initVarDline(); public: + CComponentsDetailLine(); CComponentsDetailLine( const int x_pos,const int y_pos_top, const int y_pos_down, - const int h_mark_up =16 , const int h_mark_down = 16, + const int h_mark_up = CC_HEIGHT_MIN , const int h_mark_down = CC_HEIGHT_MIN, fb_pixel_t color_line = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); ~CComponentsDetailLine(); - void paint(bool do_save_bg = false); - void hide(); - void setColor(fb_pixel_t color_line, fb_pixel_t color_shadow){col_line = color_line; col_shadow = color_shadow;}; - void setYPosDown(const int& y_pos_down){y_down = y_pos_down;}; - void setHMarkDown(const int& h_mark_down_){h_mark_down = h_mark_down_;}; + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void kill(); + inline void setColors(fb_pixel_t color_line, fb_pixel_t color_shadow){col_body = color_line; col_shadow = color_shadow;}; + void syncSysColors(); + inline void setYPosDown(const int& y_pos_down){y_down = y_pos_down;}; + inline void setHMarkTop(const int& h_mark_top_){h_mark_top = h_mark_top_;}; + inline void setHMarkDown(const int& h_mark_down_){h_mark_down = h_mark_down_;}; }; -#define INFO_BOX_Y_OFFSET 2 -class CComponentsInfoBox : public CComponents +#define FIRST_ELEMENT_INIT 10000 +#define LOGO_MAX_WIDTH width/4 +class CComponentsItemBox : public CComponentsItem { - private: - int rad,fr_thickness; - bool shadow; - fb_pixel_t col_frame, col_body, col_shadow; - bool firstPaint; - std::vector v_infobox_val; + protected: + int hSpacer; + int hOffset; + int vOffset; + int digit_offset, digit_h; + bool paintElements; + bool onlyOneTextElement; + fb_pixel_t it_col_text; + Font* font_text; + int hMax; + bool has_TextElement; + size_t firstElementLeft; + size_t firstElementRight; + size_t prevElementLeft; + size_t prevElementRight; + std::vector v_element_data; + bool isCalculated; + + void clearElements(); + void initVarItemBox(); + void calSizeOfElements(); + void calPositionOfElements(); + void paintItemBox(bool do_save_bg = CC_SAVE_SCREEN_YES); + void calculateElements(); + bool addElement(int align, int type, const std::string& element="", size_t *index=NULL); + void paintImage(size_t index, bool newElement); + void paintText(size_t index, bool newElement); public: - CComponentsInfoBox( const int x_pos, const int y_pos, const int w, const int h, bool has_shadow = true, - fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENTDARK_PLUS_0,fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + CComponentsItemBox(); + virtual ~CComponentsItemBox(); - void paint(bool do_save_bg = false, bool fullPaint = false); - void hide(); - void restore(bool clear_ = true); - void setColor(fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow){col_frame = color_frame; col_body = color_body; col_shadow = color_shadow;}; + inline virtual void setTextFont(Font* font){font_text = font;}; + inline virtual void setTextColor(fb_pixel_t color_text){ it_col_text = color_text;}; + + virtual void refreshElement(size_t index, const std::string& element); + virtual void paintElement(size_t index, bool newElement= false); + virtual bool addLogoOrText(int align, const std::string& logo, const std::string& text, size_t *index=NULL); + virtual void clearTitlebar(); + virtual void addText(const std::string& s_text, const int align=CC_ALIGN_LEFT, size_t *index=NULL); + virtual void addText(neutrino_locale_t locale_text, const int align=CC_ALIGN_LEFT, size_t *index=NULL); + virtual void addIcon(const std::string& s_icon_name, const int align=CC_ALIGN_LEFT, size_t *index=NULL); + virtual void addPicture(const std::string& s_picture_path, const int align=CC_ALIGN_LEFT, size_t *index=NULL); + virtual void addClock(const int align=CC_ALIGN_RIGHT, size_t *index=NULL); + virtual int getHeight(); +}; + +class CComponentsTitleBar : public CComponentsItemBox +{ + private: + const char* tb_c_text; + std::string tb_s_text, tb_icon_name; + neutrino_locale_t tb_locale_text; + int tb_text_align, tb_icon_align; + + void initText(); + void initIcon(); + void initElements(); + void initVarTitleBar(); + + public: + CComponentsTitleBar(); + CComponentsTitleBar( const int x_pos, const int y_pos, const int w, const int h, const char* c_text = NULL, const std::string& s_icon ="", + fb_pixel_t color_text = COL_MENUHEAD, fb_pixel_t color_body = COL_MENUHEAD_PLUS_0); + CComponentsTitleBar( const int x_pos, const int y_pos, const int w, const int h, const std::string& s_text ="", const std::string& s_icon ="", + fb_pixel_t color_text = COL_MENUHEAD, fb_pixel_t color_body = COL_MENUHEAD_PLUS_0); + CComponentsTitleBar( const int x_pos, const int y_pos, const int w, const int h, neutrino_locale_t locale_text = NONEXISTANT_LOCALE, const std::string& s_icon ="", + fb_pixel_t color_text = COL_MENUHEAD, fb_pixel_t color_body = COL_MENUHEAD_PLUS_0); + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + +}; + + +class CComponentsForm : public CComponentsItem +{ + protected: + std::vector v_cc_items; + void initVarForm(); + void paintForm(bool do_save_bg); + public: + + CComponentsForm(); + CComponentsForm(const int x_pos, const int y_pos, const int w, const int h, bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUCONTENT_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + virtual ~CComponentsForm(); + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void hide(bool no_restore = false); + virtual void addCCItem(CComponentsItem* cc_Item); + virtual void insertCCItem(const uint& cc_item_id, CComponentsItem* cc_Item); + virtual void removeCCItem(const uint& cc_item_id); + virtual void replaceCCItem(const uint& cc_item_id, CComponentsItem* new_cc_Item); + virtual void replaceCCItem(CComponentsItem* old_cc_Item, CComponentsItem* new_cc_Item); + virtual int getCCItemId(CComponentsItem* cc_Item); + virtual CComponentsItem* getCCItem(const uint& cc_item_id); + virtual void paintCCItems(); + virtual void clearCCItems(); + virtual void cleanCCForm(); +}; + +class CComponentsIconForm : public CComponentsForm +{ + private: + std::vector v_icons; + int ccif_offset, ccif_icon_align; + void initMaxHeight(int *pheight); + + protected: + void initVarIconForm(); + + public: + CComponentsIconForm(); + CComponentsIconForm(const int x_pos, const int y_pos, const int w, const int h, const std::vector v_icon_names, bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUHEAD_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); +// ~CComponentsIconForm(); //inherited from CComponentsForm + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void initCCIcons(); + void addIcon(const std::string& icon_name); + void addIcon(std::vector icon_name); + void removeIcons(){v_icons.clear();}; + void insertIcon(const uint& icon_id, const std::string& icon_name); + void removeIcon(const uint& icon_id); + void removeIcon(const std::string& icon_name); + void removeAllIcons(); + void setIconOffset(const int offset){ccif_offset = offset;}; + + enum //alignements + { + CC_ICONS_FRM_ALIGN_RIGHT , + CC_ICONS_FRM_ALIGN_LEFT + }; + void setIconAlign(int alignment){ccif_icon_align = alignment;}; + + int getIconId(const std::string& icon_name); +}; + + + +class CComponentsHeader : public CComponentsForm +{ + private: + CComponentsPicture * cch_icon_obj; + CComponentsText * cch_text_obj; + CComponentsIconForm * cch_btn_obj; + std::string cch_text; + const char* cch_icon_name; + neutrino_locale_t cch_locale_text; + fb_pixel_t cch_col_text; + Font* cch_font; + int cch_icon_x, cch_items_y, cch_text_x, ccif_width, cch_icon_w, cch_buttons, cch_btn_offset; + std::vector v_cch_btn; + + void initCCHeaderIcon(); + void initCCHeaderText(); + void initCCHeaderButtons(); + void initCCHDefaultButtons(); + void initCCButtonFormSize(); + + protected: + void initVarHeader(); + + public: + enum + { + CC_BTN_HELP = 0x02, + CC_BTN_INFO = 0x04, + CC_BTN_MENU = 0x40, + CC_BTN_EXIT = 0x80 + + }; + + enum + { + CC_HEADER_ITEM_ICON = 0, + CC_HEADER_ITEM_TEXT = 1, + CC_HEADER_ITEM_BUTTONS = 2 + }; + CComponentsHeader(); + CComponentsHeader(const int x_pos, const int y_pos, const int w, const int h = 0, const std::string& caption = "header", const char* icon_name = NULL, const int buttons = 0, bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUHEAD_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + CComponentsHeader(const int x_pos, const int y_pos, const int w, const int h = 0, neutrino_locale_t caption_locale = NONEXISTANT_LOCALE, const char* icon_name = NULL, const int buttons = 0,bool has_shadow = CC_SHADOW_OFF, + fb_pixel_t color_frame = COL_MENUCONTENT_PLUS_6, fb_pixel_t color_body = COL_MENUHEAD_PLUS_0, fb_pixel_t color_shadow = COL_MENUCONTENTDARK_PLUS_0); + ~CComponentsHeader(); + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void setHeaderText(const std::string& caption); + void setHeaderText(neutrino_locale_t caption_locale); + void setColorHeaderBody(fb_pixel_t text_color){cch_col_text = text_color;}; + void setHeaderButtonOffset(const int offset){cch_btn_offset = offset;}; + void setHeaderIcon(const char* icon_name); + void addHeaderButton(const std::string& button_name); + void removeHeaderButtons(); + void setHeaderDefaultButtons(const int buttons); + void initCCHeaderItems(); +}; + +class CComponentsWindow : public CComponentsForm +{ + private: + CComponentsHeader * ccw_head; + std::string ccw_caption; + const char* ccw_icon_name; + int ccw_start_y; + int ccw_buttons; + + void initHeader(); + void initCCWItems(); + + protected: + void initVarWindow(); + + public: + enum + { + CC_WINDOW_ITEM_HEADER = 0 + }; + CComponentsWindow(); + CComponentsWindow(const std::string& caption, const char* iconname = NULL); + CComponentsWindow(neutrino_locale_t locale_caption, const char* iconname = NULL); + ~CComponentsWindow(); + + void paint(bool do_save_bg = CC_SAVE_SCREEN_YES); + void setWindowCaption(const std::string& text){ccw_caption = text;}; + void setWindowCaption(neutrino_locale_t locale_text); + void setWindowIcon(const char* iconname){ccw_icon_name = iconname;}; + void setWindowHeaderButtons(const int& buttons){ccw_buttons = buttons;}; + + int getStartY(); //y value for start of the area below header }; #endif diff --git a/src/gui/components/cc_base.cpp b/src/gui/components/cc_base.cpp new file mode 100644 index 000000000..7655019b9 --- /dev/null +++ b/src/gui/components/cc_base.cpp @@ -0,0 +1,160 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//abstract basic class CComponents +CComponents::CComponents() +{ + initVarBasic(); +} + +CComponents::~CComponents() +{ + hide(); + clearSavedScreen(); + clear(); +} + +void CComponents::clearSavedScreen() +{ + if (saved_screen.pixbuf) + delete[] saved_screen.pixbuf; + saved_screen.pixbuf = NULL; +} + +void CComponents::initVarBasic() +{ + x = saved_screen.x = 0; + y = saved_screen.y = 0; + height = saved_screen.dy = CC_HEIGHT_MIN; + width = saved_screen.dx = CC_WIDTH_MIN; + + col_body = COL_MENUCONTENT_PLUS_0; + col_shadow = COL_MENUCONTENTDARK_PLUS_0; + col_frame = COL_MENUCONTENT_PLUS_6; + corner_type = CORNER_ALL; + corner_rad = 0; + shadow = CC_SHADOW_OFF; + shadow_w = SHADOW_OFFSET; + fr_thickness = 0; + + firstPaint = true; + is_painted = false; + paint_bg = true; + frameBuffer = CFrameBuffer::getInstance(); + v_fbdata.clear(); + saved_screen.pixbuf = NULL; +} + +//paint framebuffer stuff and fill buffer +void CComponents::paintFbItems(bool do_save_bg) +{ + if (firstPaint && do_save_bg) { + for(size_t i=0; isave screen: %d, fbdata_type: %d\n", __FUNCTION__, __LINE__, firstPaint, v_fbdata[i].fbdata_type); +#endif + saved_screen.x = v_fbdata[i].x; + saved_screen.y = v_fbdata[i].y; + saved_screen.dx = v_fbdata[i].dx; + saved_screen.dy = v_fbdata[i].dy; + clearSavedScreen(); + saved_screen.pixbuf = getScreen(saved_screen.x, saved_screen.y, saved_screen.dx, saved_screen.dy); + firstPaint = false; + break; + } + } + } + + for(size_t i=0; i< v_fbdata.size() ;i++){ + int fbtype = v_fbdata[i].fbdata_type; +#ifdef DEBUG_CC + printf(" [CComponents]\n [%s - %d], fbdata_[%d] \n x = %d\n y = %d\n dx = %d\n dy = %d\n", __FUNCTION__, __LINE__, i, v_fbdata[i].x, v_fbdata[i].y, v_fbdata[i].dx, v_fbdata[i].dy); +#endif + if (firstPaint){ + + if (do_save_bg && fbtype == CC_FBDATA_TYPE_LINE) + v_fbdata[i].pixbuf = getScreen(v_fbdata[i].x, v_fbdata[i].y, v_fbdata[i].dx, v_fbdata[i].dy); + + //ensure painting of all line fb items with saved screens + if (fbtype == CC_FBDATA_TYPE_LINE) + firstPaint = true; + else + firstPaint = false; + } + if (fbtype != CC_FBDATA_TYPE_BGSCREEN){ + if (fbtype == CC_FBDATA_TYPE_FRAME && v_fbdata[i].frame_thickness > 0) + frameBuffer->paintBoxFrame(v_fbdata[i].x, v_fbdata[i].y, v_fbdata[i].dx, v_fbdata[i].dy, v_fbdata[i].frame_thickness, v_fbdata[i].color, v_fbdata[i].r); + else if (fbtype == CC_FBDATA_TYPE_BACKGROUND) + frameBuffer->paintBackgroundBoxRel(x, y, v_fbdata[i].dx, v_fbdata[i].dy); + else + frameBuffer->paintBoxRel(v_fbdata[i].x, v_fbdata[i].y, v_fbdata[i].dx, v_fbdata[i].dy, v_fbdata[i].color, v_fbdata[i].r, corner_type); + } + } + + is_painted = true; +} + +//screen area save +inline fb_pixel_t* CComponents::getScreen(int ax, int ay, int dx, int dy) +{ + fb_pixel_t* pixbuf = new fb_pixel_t[dx * dy]; + frameBuffer->SaveScreen(ax, ay, dx, dy, pixbuf); + return pixbuf; +} + +//restore screen from buffer +inline void CComponents::hide() +{ + for(size_t i =0; i< v_fbdata.size() ;i++) { + if (v_fbdata[i].pixbuf != NULL){ + frameBuffer->RestoreScreen(v_fbdata[i].x, v_fbdata[i].y, v_fbdata[i].dx, v_fbdata[i].dy, v_fbdata[i].pixbuf); + delete[] v_fbdata[i].pixbuf; + v_fbdata[i].pixbuf = NULL; + } + } + v_fbdata.clear(); + is_painted = false; +} + +//clean old screen buffer +inline void CComponents::clear() +{ + for(size_t i =0; i< v_fbdata.size() ;i++) + if (v_fbdata[i].pixbuf != NULL) + delete[] v_fbdata[i].pixbuf; + v_fbdata.clear(); +} diff --git a/src/gui/components/cc_detailsline.cpp b/src/gui/components/cc_detailsline.cpp new file mode 100644 index 000000000..bae3e163b --- /dev/null +++ b/src/gui/components/cc_detailsline.cpp @@ -0,0 +1,168 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//sub class CComponentsDetailLine from CComponents +CComponentsDetailLine::CComponentsDetailLine() +{ + initVarDline(); + + //CComponents + x = 0; + y = 0; + col_shadow = COL_MENUCONTENTDARK_PLUS_0; + col_body = COL_MENUCONTENT_PLUS_6; + + //CComponentsDetailLine + y_down = 0; + h_mark_top = CC_HEIGHT_MIN; + h_mark_down = CC_HEIGHT_MIN; +} + +CComponentsDetailLine::CComponentsDetailLine(const int x_pos, const int y_pos_top, const int y_pos_down, const int h_mark_top_, const int h_mark_down_, fb_pixel_t color_line, fb_pixel_t color_shadow) +{ + initVarDline(); + + //CComponents + x = x_pos; + y = y_pos_top; + col_shadow = color_shadow; + col_body = color_line; + + //CComponentsDetailLine + y_down = y_pos_down; + h_mark_top = h_mark_top_; + h_mark_down = h_mark_down_; +} + +void CComponentsDetailLine::initVarDline() +{ + //CComponents + initVarBasic(); + + shadow_w = 1; + + //CComponentsDetailLine + thickness = 4; +} + +CComponentsDetailLine::~CComponentsDetailLine() +{ + hide(); //restore background + clear(); +} + +// y_top (=y) +// xpos +--|h_mark_up +// | +// | +// | +// | +// | +// | +// | +// | +// | +// +--|h_mark_down +// y_down + + +//paint details line with current parameters +void CComponentsDetailLine::paint(bool do_save_bg) +{ + clear(); + + int y_mark_top = y-h_mark_top/2+thickness/2; + int y_mark_down = y_down-h_mark_down/2+thickness/2; + + int sw = shadow_w; + + comp_fbdata_t fbdata[] = + { + /* vertical item mark | */ + {CC_FBDATA_TYPE_LINE, x+width-thickness-sw, y_mark_top, thickness, h_mark_top, col_body, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x+width-sw, y_mark_top, sw, h_mark_top, col_shadow, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x+width-thickness-sw, y_mark_top+h_mark_top, thickness+sw, sw , col_shadow, 0, 0, NULL, NULL}, + + /* horizontal item line - */ + {CC_FBDATA_TYPE_LINE, x, y, width-thickness-sw, thickness, col_body, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x+thickness, y+thickness, width-2*thickness-sw, sw, col_shadow, 0, 0, NULL, NULL}, + + /* vertical connect line [ */ + {CC_FBDATA_TYPE_LINE, x, y+thickness, thickness, y_down-y-thickness, col_body, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x+thickness, y+thickness+sw, sw, y_down-y-thickness-sw, col_shadow, 0, 0, NULL, NULL}, + + /* horizontal info line - */ + {CC_FBDATA_TYPE_LINE, x, y_down, width-thickness-sw, thickness, col_body, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x, y_down+thickness, width-thickness-sw, sw, col_shadow, 0, 0, NULL, NULL}, + + /* vertical info mark | */ + {CC_FBDATA_TYPE_LINE, x+width-thickness-sw, y_mark_down, thickness, h_mark_down, col_body, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x+width-sw, y_mark_down, sw, h_mark_down, col_shadow, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_LINE, x+width-thickness-sw, y_mark_down+h_mark_down,thickness+sw, sw, col_shadow, 0, 0, NULL, NULL}, + }; + + for(size_t i =0; i< (sizeof(fbdata) / sizeof(fbdata[0])) ;i++) + v_fbdata.push_back(fbdata[i]); + + paintFbItems(do_save_bg); +} + +//remove painted fb items from screen +void CComponentsDetailLine::kill() +{ + //save current colors + fb_pixel_t c_tmp1, c_tmp2; + c_tmp1 = col_body; + c_tmp2 = col_shadow; + + //set background color + col_body = col_shadow = COL_BACKGROUND; + + //paint with background and restore, set last used colors + paint(CC_SAVE_SCREEN_NO); + col_body = c_tmp1; + col_shadow = c_tmp2; + firstPaint = true; +} + +//synchronize colors for details line +//This is usefull if the system colors are changed during runtime +//so you can ensure correct applied system colors in relevant objects with unchanged instances. +void CComponentsDetailLine::syncSysColors() +{ + col_body = COL_MENUCONTENT_PLUS_6; + col_shadow = COL_MENUCONTENTDARK_PLUS_0; +} diff --git a/src/gui/components/cc_frm.cpp b/src/gui/components/cc_frm.cpp new file mode 100644 index 000000000..34d38c361 --- /dev/null +++ b/src/gui/components/cc_frm.cpp @@ -0,0 +1,296 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsForm from CComponentsItem +CComponentsForm::CComponentsForm() +{ + //CComponentsForm + initVarForm(); +} + +CComponentsForm::CComponentsForm(const int x_pos, const int y_pos, const int w, const int h, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponentsForm + initVarForm(); + + //CComponents + x = x_pos; + y = y_pos; + width = w; + height = h; + + shadow = has_shadow; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; +} + +CComponentsForm::~CComponentsForm() +{ + cleanCCForm(); +} + +void CComponentsForm::cleanCCForm() +{ +#ifdef DEBUG_CC + printf("[CComponentsForm] [%s - %d] clean up...\n", __FUNCTION__, __LINE__); +#endif +// hide(); + clearCCItems(); + clearSavedScreen(); + clear(); +} + + + +void CComponentsForm::clearCCItems() +{ + if (v_cc_items.empty()) + return; +#ifdef DEBUG_CC + printf(" [CComponentsForm] %s... delete %d cc-item(s) \n", __FUNCTION__, v_cc_items.size()); +#endif + + for(size_t i=0; igetItemType()); +#endif + delete v_cc_items[i]; + v_cc_items[i] = NULL; + } + } + v_cc_items.clear(); +} + + +void CComponentsForm::initVarForm() +{ + //CComponentsItem + initVarItem(); + + + //simple default dimensions + x = 0; + y = 0; + width = 150; + height = 150; + shadow = CC_SHADOW_OFF; + shadow_w = SHADOW_OFFSET; + col_frame = COL_MENUCONTENT_PLUS_6; + col_body = COL_MENUCONTENT_PLUS_0; + col_shadow = COL_MENUCONTENTDARK_PLUS_0; + corner_rad = RADIUS_LARGE; + corner_type = CORNER_ALL; + + //CComponentsForm + v_cc_items.clear(); + +} + +void CComponentsForm::addCCItem(CComponentsItem* cc_Item) +{ + if (cc_Item){ +#ifdef DEBUG_CC + printf(" [CComponentsForm] %s-%d add cc_Item [type %d] [current count %d] \n", __FUNCTION__, __LINE__, cc_Item->getItemType(), v_cc_items.size()); +#endif + v_cc_items.push_back(cc_Item); + } +#ifdef DEBUG_CC + else + printf(" [CComponentsForm] %s-%d tried to add an empty or invalide cc_item !!!\n", __FUNCTION__, __LINE__); +#endif +} + +int CComponentsForm::getCCItemId(CComponentsItem* cc_Item) +{ + for (size_t i= 0; i< v_cc_items.size(); i++) + if (v_cc_items[i] == cc_Item) + return i; + return -1; +} + +CComponentsItem* CComponentsForm::getCCItem(const uint& cc_item_id) +{ + if (v_cc_items[cc_item_id]) + return v_cc_items[cc_item_id]; + return NULL; +} + +void CComponentsForm::replaceCCItem(const uint& cc_item_id, CComponentsItem* new_cc_Item) +{ + if (!v_cc_items.empty()){ + if (v_cc_items[cc_item_id]){ + delete v_cc_items[cc_item_id]; + v_cc_items[cc_item_id] = NULL; + v_cc_items[cc_item_id] = new_cc_Item; + } + } +#ifdef DEBUG_CC + else + printf("[CComponentsForm] %s replace cc_Item not possible, v_cc_items is empty\n", __FUNCTION__); +#endif + +} + +void CComponentsForm::replaceCCItem(CComponentsItem* old_cc_Item, CComponentsItem* new_cc_Item) +{ + replaceCCItem(getCCItemId(old_cc_Item), new_cc_Item); +} + +void CComponentsForm::insertCCItem(const uint& cc_item_id, CComponentsItem* cc_Item) +{ + + if (cc_Item == NULL){ +#ifdef DEBUG_CC + printf("[CComponentsForm] %s parameter: cc_Item = %d...\n", __FUNCTION__, (int)cc_Item); +#endif + return; + } + + if (v_cc_items.empty()){ + v_cc_items.push_back(cc_Item); +#ifdef DEBUG_CC + printf("[CComponentsForm] %s insert cc_Item not possible, v_cc_items is empty, cc_Item added\n", __FUNCTION__); +#endif + }else + v_cc_items.insert(v_cc_items.begin()+cc_item_id, cc_Item); +} + +void CComponentsForm::removeCCItem(const uint& cc_item_id) +{ + if (!v_cc_items.empty()){ + if (v_cc_items[cc_item_id]) { + delete v_cc_items[cc_item_id]; + v_cc_items[cc_item_id] = NULL; + v_cc_items.erase(v_cc_items.begin()+cc_item_id); + } + } +#ifdef DEBUG_CC + else + printf("[CComponentsForm] %s removing cc_Item not possible, v_cc_items is empty...\n", __FUNCTION__); +#endif +} + +void CComponentsForm::paintForm(bool do_save_bg) +{ + //paint body + paintInit(do_save_bg); + + //paint + paintCCItems(); +} + +void CComponentsForm::paint(bool do_save_bg) +{ + paintForm(do_save_bg); +} + +void CComponentsForm::paintCCItems() +{ + size_t items_count = v_cc_items.size(); + int x_frm_left = x+fr_thickness; //left form border + int y_frm_top = y+fr_thickness; //top form border + int x_frm_right = x+width-fr_thickness; //right form border + int y_frm_bottom = y+height-fr_thickness; //bottom form border + + for(size_t i=0; igetDimensions(&x_item, &y_item, &w_item, &h_item); + + + int xy_ref = 0+fr_thickness; //allowed minimal x and y start position + if (x_item < xy_ref){ +#ifdef DEBUG_CC + printf("[CComponentsForm] %s: item %d position is out of form dimensions\ndefinied x=%d\nallowed x>=%d\n", __FUNCTION__, i, x_item, xy_ref); +#endif + x_item = xy_ref; + } + if (y_item < xy_ref){ +#ifdef DEBUG_CC + printf("[CComponentsForm] %s: item %d position is out of form dimensions\ndefinied y=%d\nallowed y>=%d\n", __FUNCTION__, i, y_item, xy_ref); +#endif + y_item = xy_ref; + } + + //set adapted position onto form + v_cc_items[i]->setXPos(x_frm_left+x_item); + v_cc_items[i]->setYPos(y_frm_top+y_item); + + //watch horizontal x dimensions of items + int x_item_right = v_cc_items[i]->getXPos()+w_item; //right item border + if (x_item_right > x_frm_right){ + v_cc_items[i]->setWidth(w_item-(x_item_right-x_frm_right)); +#ifdef DEBUG_CC + printf("[CComponentsForm] %s: item %d too large, definied width=%d, possible width=%d \n", __FUNCTION__, i, w_item, v_cc_items[i]->getWidth()); +#endif + } + + //watch vertical y dimensions + int y_item_bottom = v_cc_items[i]->getYPos()+h_item; //bottom item border + if (y_item_bottom > y_frm_bottom){ + v_cc_items[i]->setHeight(h_item-(y_item_bottom-y_frm_bottom)); +#ifdef DEBUG_CC + printf("[CComponentsForm] %s: item %d too large, definied height=%d, possible height=%d \n", __FUNCTION__, i, h_item, v_cc_items[i]->getHeight()); +#endif + } + + //paint element without saved screen! + v_cc_items[i]->paint(CC_SAVE_SCREEN_NO); + + //restore dimensions and position + v_cc_items[i]->setDimensionsAll(x_item, y_item, w_item, h_item); + } +} + +void CComponentsForm::hide(bool no_restore) +{ + // hack: ensure hiding of minitv during hide of forms and inherited classes, + // because the handling of minitv items are different to other item types + // and need an explizit call of hide() + for(size_t i=0; igetItemType() == CComponentsItem::CC_ITEMTYPE_PIP){ + v_cc_items[i]->hide(); + break; + } + } + + //hide body + hideCCItem(no_restore); +} diff --git a/src/gui/components/cc_frm_header.cpp b/src/gui/components/cc_frm_header.cpp new file mode 100644 index 000000000..72d3168c6 --- /dev/null +++ b/src/gui/components/cc_frm_header.cpp @@ -0,0 +1,322 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsHeader inherit from CComponentsForm +CComponentsHeader::CComponentsHeader() +{ + //CComponentsHeader + initVarHeader(); +} + +CComponentsHeader::CComponentsHeader( const int x_pos, const int y_pos, const int w, const int h, const std::string& caption, const char* icon_name, const int buttons, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponentsHeader + initVarHeader(); + + x = x_pos; + y = y_pos; + width = w; + height = h > 0 ? h : g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); + shadow = has_shadow; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; + + cch_text = caption; + cch_icon_name = icon_name; + cch_buttons = buttons; + initCCHDefaultButtons(); + initCCHeaderItems(); +} + +CComponentsHeader::CComponentsHeader( const int x_pos, const int y_pos, const int w, const int h, neutrino_locale_t caption_locale, const char* icon_name, const int buttons, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponentsHeader + initVarHeader(); + + x = x_pos; + y = y_pos; + width = w; + height = h; + shadow = has_shadow; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; + + cch_locale_text = caption_locale; + cch_icon_name = icon_name; + cch_buttons = buttons; + + initCCHDefaultButtons(); + initCCHeaderItems(); +} + +void CComponentsHeader::initVarHeader() +{ + //CComponentsForm + initVarForm(); + cc_item_type = CC_ITEMTYPE_FRM_HEADER; + col_body = COL_MENUHEAD_PLUS_0; + corner_rad = RADIUS_LARGE, + corner_type = CORNER_TOP; + + //init header height + cch_font = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]; + height = cch_font->getHeight(); + + //CComponentsHeader + cch_icon_obj = NULL; + cch_text_obj = NULL; + cch_icon_name = NULL; + cch_btn_obj = NULL; + cch_text = "header"; + cch_locale_text = NONEXISTANT_LOCALE; + cch_col_text = COL_MENUHEAD; + cch_items_y = 0; + cch_icon_x = 0; + cch_icon_w = 5; + cch_text_x = 0; + ccif_width = 0; + cch_buttons = 0; + cch_btn_offset = 8; + v_cch_btn.clear(); + + +} + +CComponentsHeader::~CComponentsHeader() +{ +#ifdef DEBUG_CC + printf("[~CComponentsHeader] [%s - %d] delete...\n", __FUNCTION__, __LINE__); +#endif + v_cch_btn.clear(); + cleanCCForm(); +} + +void CComponentsHeader::setHeaderText(const std::string& caption) +{ + cch_text = caption; +} + +void CComponentsHeader::setHeaderText(neutrino_locale_t caption_locale) +{ + cch_text = g_Locale->getText(caption_locale); +} + +void CComponentsHeader::setHeaderIcon(const char* icon_name) +{ + cch_icon_name = icon_name; +} + +void CComponentsHeader::initCCHeaderIcon() +{ + //reset cch_icon_w + cch_icon_w = cch_btn_offset; + + //init cch_icon_obj only if an icon available + if (cch_icon_name == NULL) { + cch_icon_w = cch_btn_offset; + if (cch_icon_obj) + delete cch_icon_obj; + cch_icon_obj = NULL; + return; + } + + //create instance for cch_icon_obj + if (cch_icon_obj == NULL){ +#ifdef DEBUG_CC + printf(" [CComponentsHeader]\n [%s - %d] init header icon: %s\n", __FUNCTION__, __LINE__, cch_icon_name); +#endif + cch_icon_obj = new CComponentsPicture(cch_icon_x, cch_items_y, 0, 0, cch_icon_name); + //add item only one time + addCCItem(cch_icon_obj); //icon + } + + //set properties for icon object + if (cch_icon_obj){ + cch_icon_obj->setWidth(height-2*fr_thickness); + cch_icon_obj->setHeight(height); + cch_icon_obj->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER); + cch_icon_obj->doPaintBg(false); + + //set corner mode of icon item + cch_icon_obj->setCornerRadius(corner_rad-fr_thickness); + int cc_icon_corner_type = corner_type; + if (corner_type == CORNER_TOP_LEFT || corner_type == CORNER_TOP) + cc_icon_corner_type = CORNER_TOP_LEFT; + else + cc_icon_corner_type = CORNER_LEFT; + cch_icon_obj->setCornerType(cc_icon_corner_type); + + //set width of icon object + cch_icon_w = cch_icon_obj->getWidth(); + + //adapt height + height = max(height, cch_icon_obj->getHeight()); + } +} + +void CComponentsHeader::addHeaderButton(const std::string& button_name) +{ + v_cch_btn.push_back(button_name); + initCCHeaderButtons(); +} + +void CComponentsHeader::removeHeaderButtons() +{ + v_cch_btn.clear(); + cch_btn_obj->removeAllIcons(); + initCCHeaderButtons(); + +} + +void CComponentsHeader::initCCHDefaultButtons() +{ + if (cch_buttons & CC_BTN_EXIT) + v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_HOME); + if (cch_buttons & CC_BTN_HELP) + v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_HELP); + if (cch_buttons & CC_BTN_INFO) + v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_INFO); + if (cch_buttons & CC_BTN_MENU) + v_cch_btn.push_back(NEUTRINO_ICON_BUTTON_MENU); +#ifdef DEBUG_CC + printf("[CComponentsHeader] %s added %d default buttons...\n", __FUNCTION__, v_cch_btn.size()); +#endif +} + +void CComponentsHeader::setHeaderDefaultButtons(const int buttons) +{ + cch_buttons = buttons; + v_cch_btn.clear(); + initCCHDefaultButtons(); +} + +// calculate minimal width of icon form +void CComponentsHeader::initCCButtonFormSize() +{ + ccif_width = 0; + for(size_t i=0; igetIconSize(v_cch_btn[i].c_str(), &bw, &bh); + ccif_width += (bw + cch_btn_offset); + } +} + +void CComponentsHeader::initCCHeaderButtons() +{ + //exit if no button defined + if (v_cch_btn.empty()) + return; + + initCCButtonFormSize(); + + if (cch_btn_obj == NULL){ + cch_btn_obj = new CComponentsIconForm(); +#ifdef DEBUG_CC + printf(" [CComponentsHeader]\n [%s - %d] init header buttons...\n", __FUNCTION__, __LINE__); +#endif + //add button form + addCCItem(cch_btn_obj); //buttons + } + + //set button form properties + if (cch_btn_obj){ + cch_btn_obj->setDimensionsAll(0+width-ccif_width, 0, ccif_width-cch_btn_offset, height); + cch_btn_obj->doPaintBg(false); + cch_btn_obj->setIconOffset(cch_btn_offset); + cch_btn_obj->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT); + cch_btn_obj->removeAllIcons(); + cch_btn_obj->addIcon(v_cch_btn); + height = max(height, cch_btn_obj->getHeight()); + } +} + +void CComponentsHeader::initCCHeaderText() +{ + //reset header text position first + cch_text_x = cch_icon_x+cch_icon_w; + + //create cch_text_obj and add to collection + if (cch_text_obj == NULL){ +#ifdef DEBUG_CC + printf(" [CComponentsHeader]\n [%s - %d] init header text: %s\n", __FUNCTION__, __LINE__, cch_text.c_str()); +#endif + cch_text_obj = new CComponentsText(); + //add text item + addCCItem(cch_text_obj); //text + } + + //set header text properties + if (cch_text_obj){ + cch_text_obj->setText(cch_text, CTextBox::AUTO_WIDTH, cch_font); + cch_text_obj->setDimensionsAll(cch_text_x, cch_items_y, width-cch_icon_w-fr_thickness, height-2*fr_thickness); + cch_text_obj->setTextColor(cch_col_text); + cch_text_obj->setColorBody(col_body); + cch_text_obj->doPaintBg(false); + + //corner of text item + cch_text_obj->setCornerRadius(corner_rad-fr_thickness); + cch_text_obj->setCornerType(corner_type); + + //get height + height = max(height, cch_text_obj->getHeight()); + } +} + +void CComponentsHeader::initCCHeaderItems() +{ + //init icon + initCCHeaderIcon(); + + //init text + initCCHeaderText(); + + //init buttons + initCCHeaderButtons(); +} + +void CComponentsHeader::paint(bool do_save_bg) +{ + //prepare items + initCCHeaderItems(); + + //paint form contents + paintForm(do_save_bg); +} diff --git a/src/gui/components/cc_frm_icons.cpp b/src/gui/components/cc_frm_icons.cpp new file mode 100644 index 000000000..5d484a0d7 --- /dev/null +++ b/src/gui/components/cc_frm_icons.cpp @@ -0,0 +1,197 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//sub class CComponentsIconForm inherit from CComponentsForm +CComponentsIconForm::CComponentsIconForm() +{ + initVarIconForm(); +} + + +CComponentsIconForm::CComponentsIconForm(const int x_pos, const int y_pos, const int w, const int h, const std::vector v_icon_names, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + initVarIconForm(); + + x = x_pos; + y = y_pos; + width = w; + height = h; + shadow = has_shadow; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; + + v_icons = v_icon_names; +} + +void CComponentsIconForm::initVarIconForm() +{ + //CComponentsForm + initVarForm(); + cc_item_type = CC_ITEMTYPE_FRM_ICONFORM; + + //set default width and height to 0, this causes a dynamic adaptation of width and height of form + width = 0; + height = 0; + + v_icons.clear(); + ccif_offset = 2; + ccif_icon_align = CC_ICONS_FRM_ALIGN_LEFT; +} + +void CComponentsIconForm::addIcon(const std::string& icon_name) +{ + v_icons.push_back(icon_name); +} + +void CComponentsIconForm::addIcon(std::vector icon_name) +{ + for (size_t i= 0; i< icon_name.size(); i++) + v_icons.push_back(icon_name[i]); +} + +void CComponentsIconForm::insertIcon(const uint& icon_id, const std::string& icon_name) +{ + v_icons.insert(v_icons.begin()+icon_id, icon_name); +} + +void CComponentsIconForm::removeIcon(const uint& icon_id) +{ + v_icons.erase(v_icons.begin()+icon_id); +} + +void CComponentsIconForm::removeIcon(const std::string& icon_name) +{ + int id = getIconId(icon_name); + removeIcon(id); +} + +int CComponentsIconForm::getIconId(const std::string& icon_name) +{ + for (size_t i= 0; i< v_icons.size(); i++) + if (v_icons[i] == icon_name) + return i; + return -1; +} + +//For existing instances it's recommended +//to remove old items before add new icons, otherwise icons will be appended. +void CComponentsIconForm::removeAllIcons() +{ + clearCCItems(); + v_icons.clear(); +} + +//get maximal form height depends of biggest icon height, but don't touch defined form height +void CComponentsIconForm::initMaxHeight(int *pheight) +{ + for (size_t i= 0; i< v_icons.size(); i++){ + int dummy, htmp; + frameBuffer->getIconSize(v_icons[i].c_str(), &dummy, &htmp); + *pheight = max(htmp, height)/*+2*fr_thickness*/; + } +} + +void CComponentsIconForm::initCCIcons() +{ + int ccp_y = 0; + int ccp_h = 0; + int ccp_w = 0; + //calculate start pos of first icon + int ccp_x = 0 + fr_thickness; //CC_ICONS_FRM_ALIGN_LEFT; + + if (ccif_icon_align == CC_ICONS_FRM_ALIGN_RIGHT) + ccp_x += (width - fr_thickness); + + //get width of first icon + frameBuffer->getIconSize(v_icons[0].c_str(), &ccp_w, &ccp_h); + + //get maximal form height + int h = 0; + initMaxHeight(&h); + + //set xpos of first icon with right alignment, icon must positionized on the right border reduced with icon width + if (ccif_icon_align == CC_ICONS_FRM_ALIGN_RIGHT) + ccp_x -= ccp_w; + + //init and add item objects + size_t i_cnt = v_icons.size(); //icon count + + for (size_t i= 0; i< i_cnt; i++){ + //create new cc-picture item object + CComponentsPicture *ccp = new CComponentsPicture(ccp_x, ccp_y, ccp_w, h, v_icons[i]); + ccp->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER); + ccp->doPaintBg(false); + //add item to form + addCCItem(ccp); + + //reset current width for next object + ccp_w = 0; + //get next icon size if available + size_t next_i = i+1; + if (next_i != i_cnt) + frameBuffer->getIconSize(v_icons[next_i].c_str(), &ccp_w, &ccp_h); + + //set next icon position + int tmp_offset = ( igetWidth() + tmp_offset); + if (ccif_icon_align == CC_ICONS_FRM_ALIGN_RIGHT) + ccp_x -= (ccp_w + tmp_offset); + } + + //calculate width and height of form + int w_tmp = 0; + int h_tmp = 0; + for (size_t i= 0; i< i_cnt; i++){ + w_tmp += v_cc_items[i]->getWidth()+ccif_offset+fr_thickness; + h_tmp = max(h_tmp, v_cc_items[i]->getHeight()+2*fr_thickness); + + } + width = max(w_tmp, width); + height = max(h_tmp, height); +} + +void CComponentsIconForm::paint(bool do_save_bg) +{ + //init and add icons + initCCIcons(); + + //paint form contents + paintForm(do_save_bg); +} diff --git a/src/gui/components/cc_frm_window.cpp b/src/gui/components/cc_frm_window.cpp new file mode 100644 index 000000000..6a46ade97 --- /dev/null +++ b/src/gui/components/cc_frm_window.cpp @@ -0,0 +1,138 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" +#include + +using namespace std; + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsWindow inherit from CComponentsForm +CComponentsWindow::CComponentsWindow() +{ + initVarWindow(); +} + +CComponentsWindow::CComponentsWindow(const std::string& caption, const char* iconname) +{ + initVarWindow(); + + ccw_caption = caption; + ccw_icon_name = iconname; +} + +CComponentsWindow::CComponentsWindow(neutrino_locale_t locale_caption, const char* iconname) +{ + initVarWindow(); + + ccw_caption = g_Locale->getText(locale_caption); + ccw_icon_name = iconname; +} + +CComponentsWindow::~CComponentsWindow() +{ +#ifdef DEBUG_CC + printf("[~CComponentsWindow] [%s - %d] delete...\n", __FUNCTION__, __LINE__); +#endif + cleanCCForm(); +} + +void CComponentsWindow::initVarWindow() +{ + //CComponentsForm + initVarForm(); + cc_item_type = CC_ITEMTYPE_FRM_WINDOW; + + //using current screen settings for default dimensions + width = frameBuffer->getScreenWidth(); + height = frameBuffer->getScreenHeight(); + x=getScreenStartX(width); + y=getScreenStartY(height); + + ccw_head = NULL; + ccw_caption = ""; + ccw_icon_name = NULL; + ccw_start_y = 0; + ccw_buttons = 0; //no header buttons + + setShadowOnOff(true); +} + +void CComponentsWindow::setWindowCaption(neutrino_locale_t locale_text) +{ + ccw_caption = g_Locale->getText(locale_text); +} + +void CComponentsWindow::initHeader() +{ + if (ccw_head == NULL){ + ccw_head = new CComponentsHeader(); + initHeader(); + //add header item only one time + addCCItem(ccw_head); + } + + //set header properties + if (ccw_head){ + ccw_head->setXPos(0); + ccw_head->setYPos(0); + ccw_head->setWidth(width); + ccw_head->setHeaderIcon(ccw_icon_name); + ccw_head->setHeaderText(ccw_caption); + ccw_head->initCCHeaderItems(); + ccw_start_y = ccw_head->getHeight(); + ccw_head->setHeaderDefaultButtons(ccw_buttons); + } +} + +int CComponentsWindow::getStartY() +{ + initHeader(); + return ccw_start_y; +} + +void CComponentsWindow::initCCWItems() +{ +#ifdef DEBUG_CC + printf("[CComponentsWindow] [%s - %d] init items...\n", __FUNCTION__, __LINE__); +#endif + initHeader(); +} + +void CComponentsWindow::paint(bool do_save_bg) +{ + //prepare items before paint + initCCWItems(); + + //paint form contents + paintForm(do_save_bg); +} diff --git a/src/gui/components/cc_item.cpp b/src/gui/components/cc_item.cpp new file mode 100644 index 000000000..92fd55c7c --- /dev/null +++ b/src/gui/components/cc_item.cpp @@ -0,0 +1,153 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//abstract sub class CComponentsItem from CComponents +CComponentsItem::CComponentsItem() +{ + //CComponentsItem + initVarItem(); + cc_item_type = CC_ITEMTYPE_BASE; +} + +// y +// x+------f-r-a-m-e-------+ +// | | +// height body | +// | | +// +--------width---------+ + +void CComponentsItem::initVarItem() +{ + //CComponents + initVarBasic(); + cc_item_index = CC_NO_INDEX; +} + +// Paint container background in cc-items with shadow, background and frame. +// This member must be called first in all paint() members before paint other items into the container. +// If backround is not required, it's possible to override this with variable paint_bg=false, use doPaintBg(true/false) to set this! +void CComponentsItem::paintInit(bool do_save_bg) +{ + clear(); + + if(!paint_bg) + return; + + int sw = shadow ? shadow_w : 0; + int th = fr_thickness; + + comp_fbdata_t fbdata[] = + { + {CC_FBDATA_TYPE_BGSCREEN, x, y, width+sw, height+sw, 0, 0, 0, NULL, NULL}, + {CC_FBDATA_TYPE_SHADOW, x+sw, y+sw, width, height, col_shadow, corner_rad, 0, NULL, NULL}, + {CC_FBDATA_TYPE_FRAME, x, y, width, height, col_frame, corner_rad, th, NULL, NULL}, + {CC_FBDATA_TYPE_BOX, x+th, y+th, width-2*th, height-2*th, col_body, corner_rad-th, 0, NULL, NULL}, + }; + + for(size_t i =0; i< (sizeof(fbdata) / sizeof(fbdata[0])) ;i++) + v_fbdata.push_back(fbdata[i]); +#ifdef DEBUG_CC + printf("[CComponentsItem] %s:\ncc_item_type: %d\ncc_item_index = %d\nheight = %d\nwidth = %d\n", __FUNCTION__, cc_item_type, cc_item_index, height, width); +#endif + paintFbItems(do_save_bg); +} + +//restore last saved screen behind form box, +//Do use parameter 'no restore' to override temporarly the restore funtionality. +//This could help to avoid ugly flicker efffects if it is necessary e.g. on often repaints, without changed contents. +void CComponentsItem::hideCCItem(bool no_restore) +{ + is_painted = false; + + if (saved_screen.pixbuf) { + frameBuffer->RestoreScreen(saved_screen.x, saved_screen.y, saved_screen.dx, saved_screen.dy, saved_screen.pixbuf); + if (no_restore) { + delete[] saved_screen.pixbuf; + saved_screen.pixbuf = NULL; + firstPaint = true; + } + } +} + +void CComponentsItem::hide(bool no_restore) +{ + hideCCItem(no_restore); +} + + +//hide rendered objects +void CComponentsItem::kill() +{ + //save current colors + fb_pixel_t c_tmp1, c_tmp2, c_tmp3; + c_tmp1 = col_body; + c_tmp2 = col_shadow; + c_tmp3 = col_frame; + + //set background color + col_body = col_frame = col_shadow = COL_BACKGROUND; + + //paint with background and restore last used colors + paint(CC_SAVE_SCREEN_NO); + col_body = c_tmp1; + col_shadow = c_tmp2; + col_frame = c_tmp3; + firstPaint = true; + is_painted = false; +} + +//synchronize colors for forms +//This is usefull if the system colors are changed during runtime +//so you can ensure correct applied system colors in relevant objects with unchanged instances. +void CComponentsItem::syncSysColors() +{ + col_body = COL_MENUCONTENT_PLUS_0; + col_shadow = COL_MENUCONTENTDARK_PLUS_0; + col_frame = COL_MENUCONTENT_PLUS_6; +} + +//returns current item element type, if no available, return -1 as unknown type +int CComponentsItem::getItemType() +{ + for(int i =0; i< (CC_ITEMTYPES) ;i++){ + if (i == cc_item_type) + return i; + } +#ifdef DEBUG_CC + printf("[CComponentsItem] %s: unknown item type requested...\n", __FUNCTION__); +#endif + return -1; +} diff --git a/src/gui/components/cc_item_box.cpp b/src/gui/components/cc_item_box.cpp new file mode 100644 index 000000000..4c95cb168 --- /dev/null +++ b/src/gui/components/cc_item_box.cpp @@ -0,0 +1,615 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//sub class CComponentsItemBox from CComponentsItem +CComponentsItemBox::CComponentsItemBox() +{ + //CComponentsItemBox + initVarItemBox(); +} + +CComponentsItemBox::~CComponentsItemBox() +{ + hide(); + clearElements(); + clearSavedScreen(); + clear(); +} + +void CComponentsItemBox::initVarItemBox() +{ + //CComponents, CComponentsItem + initVarItem(); + + //CComponentsItemBox + it_col_text = COL_MENUCONTENT; + hSpacer = 2; + hOffset = 4; + vOffset = 1; + digit_h = 0; + digit_offset = 0; + font_text = NULL; + paintElements = true; + hMax = 0; + has_TextElement = false; + firstElementLeft = FIRST_ELEMENT_INIT; + firstElementRight = FIRST_ELEMENT_INIT; + prevElementLeft = 0; + prevElementRight = 0; + onlyOneTextElement = false; + isCalculated = false; + v_element_data.clear(); +} + +int CComponentsItemBox::getHeight() +{ + if (!isCalculated) + calculateElements(); + return height; +} + +void CComponentsItemBox::clearElements() +{ + for(size_t i = 0; i < v_element_data.size(); i++) { + switch (v_element_data[i].type) { + case CC_ITEMBOX_ICON: + case CC_ITEMBOX_PICTURE: + if (v_element_data[i].handler1 != NULL) + delete static_cast(v_element_data[i].handler1); + break; + case CC_ITEMBOX_TEXT: + if (v_element_data[i].handler1 != NULL) + delete static_cast(v_element_data[i].handler1); + if (v_element_data[i].handler2 != NULL) + delete static_cast(v_element_data[i].handler2); + break; + default: + break; + } + } + isCalculated = false; + v_element_data.clear(); +} +extern CPictureViewer * g_PicViewer; +bool CComponentsItemBox::addLogoOrText(int align, const std::string& logo, const std::string& text, size_t *index) +{ + comp_element_data_t data; + int dx=0, dy=0; + + data.align = align; + data.x = x; + data.y = y; + data.width = 0; + data.height = 0; + data.handler1 = NULL; + data.handler2 = NULL; + + g_PicViewer->getSize(logo.c_str(), &dx, &dy); + if ((dx != 0) && (dy != 0)) { + // logo OK + data.type = CC_ITEMBOX_PICTURE; + data.element = logo; + } + else { + // no logo + if ((text == "") || ((onlyOneTextElement) && (has_TextElement))) + return false; + else + has_TextElement = true; + if (font_text != NULL) + data.height = font_text->getHeight(); + data.type = CC_ITEMBOX_TEXT; + data.element = text; + } + + v_element_data.push_back(data); + if (index != NULL) + *index = v_element_data.size()-1; + isCalculated = false; + return true; +} + +void CComponentsItemBox::addText(const std::string& s_text, const int align, size_t *index) +{ + addElement(align, CC_ITEMBOX_TEXT, s_text, index); +} + +void CComponentsItemBox::addText(neutrino_locale_t locale_text, const int align, size_t *index) +{ + addElement(align, CC_ITEMBOX_TEXT, g_Locale->getText(locale_text), index); +} + +void CComponentsItemBox::addIcon(const std::string& s_icon_name, const int align, size_t *index) +{ + addElement(align, CC_ITEMBOX_ICON, s_icon_name, index); +} + +void CComponentsItemBox::addPicture(const std::string& s_picture_path, const int align, size_t *index) +{ + addElement(align, CC_ITEMBOX_PICTURE, s_picture_path, index); +} + +void CComponentsItemBox::addClock(const int align, size_t *index) +{ + addElement(align, CC_ITEMBOX_CLOCK, "", index); +} + +bool CComponentsItemBox::addElement(int align, int type, const std::string& element, size_t *index) +{ + comp_element_data_t data; + int dx=0, dy=0; + + switch (type) + { + case CC_ITEMBOX_ICON: + frameBuffer->getIconSize(element.c_str(), &dx, &dy); + if ((dx == 0) || (dy == 0)) + return false; + break; + case CC_ITEMBOX_TEXT: + if ((element == "") || ((onlyOneTextElement) && (has_TextElement))) + return false; + else + has_TextElement = true; + break; + default: + break; + } + + data.type = type; + data.align = align; + data.element = element; + data.x = x; + data.y = y; + data.width = 0; + data.height = 0; + data.handler1 = NULL; + data.handler2 = NULL; + + v_element_data.push_back(data); + if (index != NULL) + *index = v_element_data.size()-1; + isCalculated = false; + return true; +} + +void CComponentsItemBox::refreshElement(size_t index, const std::string& element) +{ + CComponentsPicture* pic = NULL; + switch (v_element_data[index].type) { + case CC_ITEMBOX_PICTURE: + pic = static_cast(v_element_data[index].handler1); + if (pic != NULL) { + pic->hide(); + delete pic; + } + v_element_data[index].element = element; + v_element_data[index].x = x; + v_element_data[index].y = y; + v_element_data[index].width = 0; + v_element_data[index].height = 0; + v_element_data[index].handler1 = NULL; + v_element_data[index].handler2 = NULL; + break; + default: + break; + } + calculateElements(); +} + +//paint image into item box +void CComponentsItemBox::paintImage(size_t index, bool newElement) +{ + CComponentsPicture* pic = NULL; + pic = static_cast(v_element_data[index].handler1); + + int pw = 0, ph = 0; + + if ((newElement) || (pic == NULL)) { + if (pic != NULL) { + pic->hide(); + delete pic; + pic = NULL; + } + if ((v_element_data[index].type) == CC_ITEMBOX_PICTURE) + pic = new CComponentsPicture( v_element_data[index].x, v_element_data[index].y, v_element_data[index].width, + v_element_data[index].height, v_element_data[index].element); + else + pic = new CComponentsPicture( v_element_data[index].x, v_element_data[index].y, 0, 0, v_element_data[index].element); + v_element_data[index].handler1 = (void*)pic; + } + + pic->getPictureSize(&pw, &ph); + pic->setHeight(ph); + pic->setWidth(pw); + pic->setColorBody(col_body); + pic->paint(); +} + +//paint text into item box +void CComponentsItemBox::paintText(size_t index, bool newElement) +{ + //prepare textbox dimension instances + CBox* box = NULL; + box = static_cast(v_element_data[index].handler1); + + if ((newElement) || (box == NULL)) { + if (box != NULL) { + delete box; + box = NULL; + } + box = new CBox(); + v_element_data[index].handler1 = (void*)box; + } + + box->iX = v_element_data[index].x; + box->iY = v_element_data[index].y; + box->iWidth = v_element_data[index].width; + box->iHeight = v_element_data[index].height; + + + //prepare text + CTextBox* textbox = NULL; + textbox = static_cast(v_element_data[index].handler2); + + if ((newElement) || (textbox == NULL)) { + if (textbox != NULL) { + textbox->hide(); + delete textbox; + textbox = NULL; + } + textbox = new CTextBox(v_element_data[index].element.c_str(), font_text, CTextBox::AUTO_WIDTH|CTextBox::AUTO_HIGH, box, col_body); + v_element_data[index].handler2 = (void*)textbox; + } + + textbox->setTextBorderWidth(0); + textbox->enableBackgroundPaint(false); + textbox->setTextFont(font_text); + textbox->movePosition(box->iX, box->iY); + textbox->setTextColor(it_col_text); + + if (textbox->setText(&v_element_data[index].element)) + textbox->paint(); +} + + +//paint available elements at one task +void CComponentsItemBox::paintElement(size_t index, bool newElement) +{ + switch (v_element_data[index].type) { + case CC_ITEMBOX_ICON: + case CC_ITEMBOX_PICTURE: + paintImage(index,newElement); + break; + case CC_ITEMBOX_TEXT: + paintText(index,newElement); + break; + case CC_ITEMBOX_CLOCK: + font_text->RenderString(v_element_data[index].x, v_element_data[index].y, v_element_data[index].width, + v_element_data[index].element.c_str(), it_col_text); + break; + default: + break; + } +} + +void CComponentsItemBox::calSizeOfElements() +{ + size_t i; + + // Set element size + for (i = 0; i < v_element_data.size(); i++) { + switch (v_element_data[i].type) + { + case CC_ITEMBOX_ICON: + frameBuffer->getIconSize(v_element_data[i].element.c_str(), &v_element_data[i].width, &v_element_data[i].height); + break; + case CC_ITEMBOX_PICTURE: + g_PicViewer->getSize(v_element_data[i].element.c_str(), &v_element_data[i].width, &v_element_data[i].height); + break; + case CC_ITEMBOX_TEXT: + if (font_text != NULL) + v_element_data[i].height = font_text->getHeight(); + break; + case CC_ITEMBOX_CLOCK: { + if (!g_Sectionsd->getIsTimeSet()) + break; + if (font_text != NULL) { + char timestr[10] = {0}; + time_t now = time(NULL); + struct tm *tm = localtime(&now); + strftime(timestr, sizeof(timestr)-1, "%H:%M", tm); + + digit_h = font_text->getDigitHeight(); + digit_offset = font_text->getDigitOffset(); + v_element_data[i].height = digit_h + (int)((float)digit_offset*1.5); +// v_element_data[i].width = font_text->getRenderWidth(widest_number)*4 + font->getRenderWidth(":"); + v_element_data[i].width = font_text->getRenderWidth(timestr); + v_element_data[i].element = timestr; + } + } + break; + default: + break; + } + } + + // Calculate largest height without CC_ITEMBOX_PICTURE + firstElementLeft = FIRST_ELEMENT_INIT; + firstElementRight = FIRST_ELEMENT_INIT; + for (i = 0; i < v_element_data.size(); i++) { + if ((firstElementLeft == FIRST_ELEMENT_INIT) && (v_element_data[i].align == CC_ALIGN_LEFT)) + firstElementLeft = i; + if ((firstElementRight == FIRST_ELEMENT_INIT) && (v_element_data[i].align == CC_ALIGN_RIGHT)) + firstElementRight = i; + if (v_element_data[i].type != CC_ITEMBOX_PICTURE) + hMax = max(v_element_data[i].height, hMax); + } +} + +void CComponentsItemBox::calPositionOfElements() +{ + size_t i; + + // Calculate y-positions + height = hMax + 2*vOffset; + for (i = 0; i < v_element_data.size(); i++) { + v_element_data[i].y = y + (height - v_element_data[i].height) / 2; + if (v_element_data[i].type == CC_ITEMBOX_CLOCK) + v_element_data[i].y += v_element_data[i].height + digit_offset/4; + } + + // Calculate x-positions + for (i = 0; i < v_element_data.size(); i++) { + if (firstElementLeft == i){ + prevElementLeft = i; + v_element_data[i].x = x + hOffset + corner_rad/2; + } + else if (firstElementRight == i){ + prevElementRight = i; + v_element_data[i].x = x + width - v_element_data[i].width - hOffset - corner_rad/2; + } + else { + if (v_element_data[i].align == CC_ALIGN_LEFT) { + // left elements + v_element_data[i].x = v_element_data[prevElementLeft].x + v_element_data[prevElementLeft].width + hSpacer; + prevElementLeft = i; + } + else { + // right elements + v_element_data[i].x = v_element_data[prevElementRight].x - v_element_data[i].width - hSpacer; + prevElementRight = i; + } + } + } +} + +void CComponentsItemBox::calculateElements() +{ + if (v_element_data.empty()) + return; + + size_t i; + + calSizeOfElements(); + + // hMax correction if no text element. + if (!has_TextElement) + hMax = max(font_text->getHeight(), hMax); + + // Calculate logo + for (i = 0; i < v_element_data.size(); i++) { + if (v_element_data[i].type == CC_ITEMBOX_PICTURE) { + if ((v_element_data[i].width > LOGO_MAX_WIDTH) || (v_element_data[i].height > hMax)) + g_PicViewer->rescaleImageDimensions(&v_element_data[i].width, &v_element_data[i].height, LOGO_MAX_WIDTH, hMax); + } + } + + // Calculate text width + int allWidth = 0; + for (i = 0; i < v_element_data.size(); i++) { + if (v_element_data[i].type != CC_ITEMBOX_TEXT) + allWidth += v_element_data[i].width + hSpacer; + } + for (i = 0; i < v_element_data.size(); i++) { + if (v_element_data[i].type == CC_ITEMBOX_TEXT) { + v_element_data[i].width = width - (allWidth + 2*hSpacer); + // If text is too long, number of rows = 2 + if (font_text->getRenderWidth(v_element_data[i].element) > v_element_data[i].width) { + v_element_data[i].height = font_text->getHeight() * 2; + hMax = max(v_element_data[i].height, hMax); + } + break; + } + } + + calPositionOfElements(); + isCalculated = true; +} + +void CComponentsItemBox::paintItemBox(bool do_save_bg) +{ + // paint background + paintInit(do_save_bg); + + if ((v_element_data.empty()) || (!paintElements)) + return; + + // paint elements + for (size_t i = 0; i < v_element_data.size(); i++) + paintElement(i); +} + +void CComponentsItemBox::clearTitlebar() +{ + clearElements(); + paintElements = false; + paint(false); + paintElements = true; +} + + + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsTitleBar from CComponentsItemBox +CComponentsTitleBar::CComponentsTitleBar() +{ + //CComponentsTitleBar + initVarTitleBar(); +} + +void CComponentsTitleBar::initVarTitleBar() +{ + //CComponentsItemBox + initVarItemBox(); + onlyOneTextElement = true; + + font_text = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]; + it_col_text = COL_MENUHEAD; + + //CComponents + x = 0; + y = 0; + height = font_text->getHeight() + 2*hSpacer; + width = frameBuffer->getScreenWidth(true);; + col_body = COL_MENUHEAD_PLUS_0; + corner_type = CORNER_TOP; + corner_rad = RADIUS_LARGE; + + //CComponentsTitleBar + tb_text_align = CC_ALIGN_LEFT; + tb_icon_align = CC_ALIGN_LEFT; + tb_c_text = NULL; + tb_s_text = ""; + tb_locale_text = NONEXISTANT_LOCALE; + tb_icon_name = ""; +} + +CComponentsTitleBar::CComponentsTitleBar(const int x_pos, const int y_pos, const int w, const int h, const char* c_text, const std::string& s_icon, + fb_pixel_t color_text, fb_pixel_t color_body) +{ + //CComponentsItemBox + initVarTitleBar(); + it_col_text = color_text; + + //CComponents + x = x_pos; + y = y_pos; + height = h; + width = w; + col_body = color_body; + + //CComponentsTitleBar + tb_c_text = c_text; + tb_icon_name = s_icon; + + initElements(); +} + +CComponentsTitleBar::CComponentsTitleBar(const int x_pos, const int y_pos, const int w, const int h, const string& s_text, const std::string& s_icon, + fb_pixel_t color_text, fb_pixel_t color_body) +{ + //CComponentsItemBox + initVarTitleBar(); + it_col_text = color_text; + + //CComponents + x = x_pos; + y = y_pos; + height = h; + width = w; + col_body = color_body; + + //CComponentsTitleBar + tb_s_text = s_text; + tb_icon_name = s_icon; + + initElements(); +} + +CComponentsTitleBar::CComponentsTitleBar(const int x_pos, const int y_pos, const int w, const int h, neutrino_locale_t locale_text, const std::string& s_icon, + fb_pixel_t color_text, fb_pixel_t color_body) +{ + //CComponentsItemBox + initVarTitleBar(); + it_col_text = color_text; + + //CComponents + x = x_pos; + y = y_pos; + height = h; + width = w; + col_body = color_body; + + //CComponentsTitleBar + tb_locale_text = locale_text; + tb_s_text = g_Locale->getText(tb_locale_text); + tb_icon_name = s_icon; + + initElements(); +} + +///basic init methodes for constructors *************************************** +void CComponentsTitleBar::initIcon() +{ + if (!tb_icon_name.empty()) + addElement (tb_icon_align, CC_ITEMBOX_ICON, tb_icon_name); +} + +void CComponentsTitleBar::initText() +{ + if (tb_c_text){ + addElement (tb_text_align, CC_ITEMBOX_TEXT, tb_c_text); + return; + } + else if (!tb_s_text.empty()){ + addElement (tb_text_align, CC_ITEMBOX_TEXT, tb_s_text); + return; + } +} + +void CComponentsTitleBar::initElements() +{ + initIcon(); + initText(); +} +///***************************************************************************** + +void CComponentsTitleBar::paint(bool do_save_bg) +{ + calculateElements(); + paintItemBox(do_save_bg); +} diff --git a/src/gui/components/cc_item_infobox.cpp b/src/gui/components/cc_item_infobox.cpp new file mode 100644 index 000000000..04eac2e54 --- /dev/null +++ b/src/gui/components/cc_item_infobox.cpp @@ -0,0 +1,133 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//sub class CComponentsInfoBox from CComponentsItem +CComponentsInfoBox::CComponentsInfoBox() +{ + //CComponentsInfoBox + initVarInfobox(); +} + +CComponentsInfoBox::CComponentsInfoBox(const int x_pos, const int y_pos, const int w, const int h, + const char* info_text, const int mode, Font* font_text, + bool has_shadow, + fb_pixel_t color_text, fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponentsInfoBox + initVarInfobox(); + + x = x_pos; + y = y_pos; + width = w; + height = h; + shadow = has_shadow; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; + + ct_text = info_text; + ct_text_mode = mode; + ct_font = font_text; + ct_col_text = color_text; +} + +CComponentsInfoBox::~CComponentsInfoBox() +{ + hide(); + clearSavedScreen(); + clearCCText(); + delete pic; + delete cctext; + clear(); +} + +void CComponentsInfoBox::initVarInfobox() +{ + //CComponents, CComponentsItem, CComponentsText + initVarText(); + cc_item_type = CC_ITEMTYPE_TEXT_INFOBOX; + + //CComponentsInfoBox + pic = NULL; + cctext = NULL; + pic_name = ""; + x_offset = 10; + x_text = x+fr_thickness+x_offset;; + +} + +void CComponentsInfoBox::paintPicture() +{ + //init and set icon paint position + if (pic) + delete pic; + pic = new CComponentsPicture(x+fr_thickness+x_offset, y+fr_thickness/*+y_offset*/, 0, 0, ""); + + //define icon + pic->setPicture(pic_name); + + //fit icon into infobox + pic->setHeight(height-2*fr_thickness); + pic->setColorBody(col_body); + + pic->paint(CC_SAVE_SCREEN_NO); +} + +void CComponentsInfoBox::paint(bool do_save_bg) +{ + paintInit(do_save_bg); + paintPicture(); + + //define text x position + x_text = x+fr_thickness+x_offset; + + //set text to the left border if picture is not painted + if (pic->isPicPainted()){ + int pic_w = pic->getWidth(); + x_text += pic_w+x_offset; + } + + //set text and paint text lines + if (ct_text){ + if (cctext) + delete cctext; + + cctext = new CComponentsText(); + cctext->setText(ct_text, ct_text_mode, ct_font); + cctext->setDimensionsAll(x_text, y+fr_thickness, width-(x_text-x+x_offset+fr_thickness), height-2*fr_thickness); + cctext->paint(CC_SAVE_SCREEN_NO); + } +} diff --git a/src/gui/components/cc_item_picture.cpp b/src/gui/components/cc_item_picture.cpp new file mode 100644 index 000000000..1857ac0fe --- /dev/null +++ b/src/gui/components/cc_item_picture.cpp @@ -0,0 +1,186 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" +#include + +extern CPictureViewer * g_PicViewer; + +using namespace std; + + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsPicture from CComponentsItem +CComponentsPicture::CComponentsPicture( const int x_pos, const int y_pos, const int w, const int h, + const std::string& image_name, const int alignment, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_background, fb_pixel_t color_shadow) +{ + init(x_pos, y_pos, image_name, alignment, has_shadow, color_frame, color_background, color_shadow); + + width = w; + height = h; + pic_paint_mode = CC_PIC_IMAGE_MODE_AUTO, + + initVarPicture(); +} + +void CComponentsPicture::init( int x_pos, int y_pos, const string& image_name, const int alignment, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_background, fb_pixel_t color_shadow) +{ + //CComponents, CComponentsItem + initVarItem(); + cc_item_type = CC_ITEMTYPE_PICTURE; + + //CComponentsPicture + pic_name = image_name; + pic_align = alignment; + pic_offset = 1; + pic_paint = true; + pic_paintBg = false; + pic_painted = false; + do_paint = false; + pic_max_w = 0; + pic_max_h = 0; + if (pic_name.empty()) + pic_width = pic_height = 0; + + //CComponents + x = pic_x = x_pos; + y = pic_y = y_pos; + height = 0; + width = 0; + shadow = has_shadow; + shadow_w = SHADOW_OFFSET; + col_frame = color_frame; + col_body = color_background; + col_shadow = color_shadow; +} + +void CComponentsPicture::setPicture(const std::string& picture_name) +{ + pic_name = picture_name; + initVarPicture(); +} + + +void CComponentsPicture::setPictureAlign(const int alignment) +{ + pic_align = alignment; + initVarPicture(); +} + + +void CComponentsPicture::initVarPicture() +{ + pic_width = pic_height = 0; + pic_painted = false; + do_paint = false; + + if (pic_max_w == 0) + pic_max_w = width-2*fr_thickness; + + if (pic_max_h == 0) + pic_max_h = height-2*fr_thickness; + + //set the image mode depends of name syntax, icon names contains no path, + //so we can detect the required image mode + if (pic_paint_mode == CC_PIC_IMAGE_MODE_AUTO){ + if (!access(pic_name.c_str(), F_OK )) + pic_paint_mode = CC_PIC_IMAGE_MODE_ON; + else + pic_paint_mode = CC_PIC_IMAGE_MODE_OFF; + } + + if (pic_paint_mode == CC_PIC_IMAGE_MODE_OFF){ + frameBuffer->getIconSize(pic_name.c_str(), &pic_width, &pic_height); +#if 0 + pic_width = max(pic_width, pic_max_w); + pic_height = max(pic_height, pic_max_h); +#endif + } + + if (pic_paint_mode == CC_PIC_IMAGE_MODE_ON) { + g_PicViewer->getSize(pic_name.c_str(), &pic_width, &pic_height); + if((pic_width > pic_max_w) || (pic_height > pic_max_h)) + g_PicViewer->rescaleImageDimensions(&pic_width, &pic_height, pic_max_w, pic_max_h); + } + +#ifdef DEBUG_CC + if (pic_width == 0 || pic_height == 0) + printf("[CComponentsPicture] %s file: %s, no icon dimensions found! width = %d, height = %d\n", __FUNCTION__, pic_name.c_str(), pic_width, pic_height); +#endif + + pic_x += fr_thickness; + pic_y += fr_thickness; + + if (pic_height>0 && pic_width>0){ + if (pic_align & CC_ALIGN_LEFT) + pic_x = x+fr_thickness; + if (pic_align & CC_ALIGN_RIGHT) + pic_x = x+width-pic_width-fr_thickness; + if (pic_align & CC_ALIGN_TOP) + pic_y = y+fr_thickness; + if (pic_align & CC_ALIGN_BOTTOM) + pic_y = y+height-pic_height-fr_thickness; + if (pic_align & CC_ALIGN_HOR_CENTER) + pic_x = x+width/2-pic_width/2; + if (pic_align & CC_ALIGN_VER_CENTER) + pic_y = y+height/2-pic_height/2; + + do_paint = true; + } + + int sw = (shadow ? shadow_w :0); + width = max(max(pic_width, pic_max_w), width) + sw ; + height = max(max(pic_height, pic_max_h), height) + sw ; +} + +void CComponentsPicture::paint(bool do_save_bg) +{ + initVarPicture(); + paintInit(do_save_bg); + pic_painted = false; + + if (do_paint){ + if (pic_paint_mode == CC_PIC_IMAGE_MODE_OFF) + pic_painted = frameBuffer->paintIcon(pic_name, pic_x, pic_y, 0 /*pic_max_h*/, pic_offset, pic_paint, pic_paintBg, col_body); + else if (pic_paint_mode == CC_PIC_IMAGE_MODE_ON) + pic_painted = g_PicViewer->DisplayImage(pic_name, pic_x, pic_y, pic_width, pic_height); + do_paint = false; + } +} + +void CComponentsPicture::hide(bool no_restore) +{ + hideCCItem(no_restore); + pic_painted = false; +} diff --git a/src/gui/components/cc_item_shapes.cpp b/src/gui/components/cc_item_shapes.cpp new file mode 100644 index 000000000..abe5826d2 --- /dev/null +++ b/src/gui/components/cc_item_shapes.cpp @@ -0,0 +1,101 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//sub class CComponentsShapeSquare from CComponentsItem +CComponentsShapeSquare::CComponentsShapeSquare(const int x_pos, const int y_pos, const int w, const int h, bool has_shadow, fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponentsItem + initVarItem(); + cc_item_type = CC_ITEMTYPE_SHAPE_SQUARE; + + x = x_pos; + y = y_pos; + width = w; + height = h; + shadow = has_shadow; + shadow_w = SHADOW_OFFSET; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; +} + +void CComponentsShapeSquare::paint(bool do_save_bg) +{ + paintInit(do_save_bg); +} + + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsShapeCircle from CComponentsItem +CComponentsShapeCircle::CComponentsShapeCircle( int x_pos, int y_pos, int diam, bool has_shadow, + fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponents, CComponentsItem + initVarItem(); + cc_item_type = CC_ITEMTYPE_SHAPE_CIRCLE; + + //CComponents + x = x_pos; + y = y_pos; + //width = height = d = diam; + shadow = has_shadow; + shadow_w = SHADOW_OFFSET; + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; + + //CComponentsShapeCircle + width = height = d = diam; + + //CComponentsItem + corner_rad = d/2; +} + +// y +// x+ - + +// +// +// +// |----d-i-a-m----| +// +// +// +// + - + + +void CComponentsShapeCircle::paint(bool do_save_bg) +{ + paintInit(do_save_bg); +} diff --git a/src/gui/components/cc_item_text.cpp b/src/gui/components/cc_item_text.cpp new file mode 100644 index 000000000..432abfda0 --- /dev/null +++ b/src/gui/components/cc_item_text.cpp @@ -0,0 +1,207 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +using namespace std; + +//sub class CComponentsText from CComponentsItem +CComponentsText::CComponentsText() +{ + //CComponentsText + initVarText(); +} + +CComponentsText::CComponentsText( const int x_pos, const int y_pos, const int w, const int h, + const char* text, const int mode, Font* font_text, + bool has_shadow, + fb_pixel_t color_text, fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) +{ + //CComponentsText + initVarText(); + + //CComponents + x = x_pos, + y = y_pos, + width = w; + height = h; + + col_frame = color_frame; + col_body = color_body; + col_shadow = color_shadow; + shadow = has_shadow; + + ct_font = font_text; + ct_text = text; + ct_text_mode = mode; + ct_col_text = color_text; +} + + + +CComponentsText::~CComponentsText() +{ + hide(); + clearSavedScreen(); + clearCCText(); + clear(); +} + + +void CComponentsText::initVarText() +{ + //CComponents, CComponentsItem + initVarItem(); + cc_item_type = CC_ITEMTYPE_TEXT; + + //CComponentsText + ct_font = NULL; + ct_box = NULL; + ct_textbox = NULL; + ct_text = NULL; + ct_text_mode = CTextBox::AUTO_WIDTH; + ct_col_text = COL_MENUCONTENT; + ct_text_sent = false; +} + + +void CComponentsText::initCCText() +{ + //set default font, if is no font definied + if (ct_font == NULL) + ct_font = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]; + + //define height from font size + height = max(height, ct_font->getHeight()); + + //text box dimensions + if (ct_box== NULL){ + //ensure that we have a new instance + delete ct_box; + ct_box = NULL; + } + ct_box = new CBox(); + ct_box->iX = x+fr_thickness; + ct_box->iY = y+fr_thickness; + ct_box->iWidth = width-2*fr_thickness; + ct_box->iHeight = height-2*fr_thickness; + + //init textbox + if (ct_textbox == NULL) + ct_textbox = new CTextBox(); + + //set text box properties + ct_textbox->setTextFont(ct_font); + ct_textbox->setTextMode(ct_text_mode); + ct_textbox->setWindowPos(ct_box); + ct_textbox->setTextBorderWidth(0); + ct_textbox->enableBackgroundPaint(false); + ct_textbox->setBackGroundColor(col_body); + ct_textbox->setBackGroundRadius(corner_rad-fr_thickness, corner_type); + ct_textbox->setTextColor(ct_col_text); + ct_textbox->setWindowMaxDimensions(ct_box->iWidth, ct_box->iHeight); + ct_textbox->setWindowMinDimensions(ct_box->iWidth, ct_box->iHeight); + + //set text + string new_text = static_cast (ct_text); + ct_text_sent = ct_textbox->setText(&new_text, ct_box->iWidth); +#ifdef DEBUG_CC + printf(" [CComponentsText] [%s - %d] init text: %s [x %d, y %d, h %d, w %d]\n", __FUNCTION__, __LINE__, ct_text, ct_box->iX, ct_box->iY, height, width); +#endif +} + +void CComponentsText::clearCCText() +{ + if (ct_box) + delete ct_box; + ct_box = NULL; + + if (ct_textbox) + delete ct_textbox; + ct_textbox = NULL; +} + +void CComponentsText::setText(neutrino_locale_t locale_text, int mode, Font* font_text) +{ + ct_text = g_Locale->getText(locale_text); + ct_text_mode = mode; + ct_font = font_text; + +} + +void CComponentsText::setText(const char* ctext, const int mode, Font* font_text) +{ + ct_text = ctext; + ct_text_mode = mode; + ct_font = font_text; + +} + +void CComponentsText::setText(const std::string& stext, const int mode, Font* font_text) +{ + ct_text = stext.c_str(); + ct_text_mode = mode; + ct_font = font_text; + +} + +void CComponentsText::paintText(bool do_save_bg) +{ + paintInit(do_save_bg); + initCCText(); + if (ct_text_sent) + ct_textbox->paint(); + ct_text_sent = false; +} + +void CComponentsText::paint(bool do_save_bg) +{ + paintText(do_save_bg); +} + +void CComponentsText::hide(bool no_restore) +{ + + if (ct_textbox) + ct_textbox->hide(); + hideCCItem(no_restore); +} + +//small helper to remove excessiv linbreaks +void CComponentsText::removeLineBreaks(std::string& str) +{ + std::string::size_type spos = str.find_first_of("\r\n"); + while (spos != std::string::npos) { + str.replace(spos, 1, " "); + spos = str.find_first_of("\r\n"); + } +} diff --git a/src/gui/components/cc_item_tvpig.cpp b/src/gui/components/cc_item_tvpig.cpp new file mode 100644 index 000000000..eedc4e65e --- /dev/null +++ b/src/gui/components/cc_item_tvpig.cpp @@ -0,0 +1,99 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + Copyright (C) 2012, Michael Liebmann 'micha-bbg' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#include +#include +#include "cc.h" + +#include + +extern cVideo * videoDecoder; + +using namespace std; + +//------------------------------------------------------------------------------------------------------- +//sub class CComponentsPIP from CComponentsItem +CComponentsPIP::CComponentsPIP( const int x_pos, const int y_pos, const int percent, bool has_shadow) +{ + //CComponents, CComponentsItem + initVarItem(); + cc_item_type = CC_ITEMTYPE_PIP; + + //CComponentsPIP + screen_w = frameBuffer->getScreenWidth(true); + screen_h = frameBuffer->getScreenHeight(true); + pic_name = DATADIR; + pic_name += "/neutrino/icons/start.jpg"; + + //CComponents + x = x_pos; + y = y_pos; + width = percent*screen_w/100; + height = percent*screen_h/100; + shadow = has_shadow; + shadow_w = SHADOW_OFFSET; + col_frame = COL_BACKGROUND; + col_body = COL_BACKGROUND; + col_shadow = COL_MENUCONTENTDARK_PLUS_0; +} + +CComponentsPIP::~CComponentsPIP() +{ + hide(); + videoDecoder->Pig(-1, -1, -1, -1); + clearSavedScreen(); + clear(); +} + +void CComponentsPIP::paint(bool do_save_bg) +{ + int pig_x = x+fr_thickness; + int pig_y = y+fr_thickness; + int pig_w = width-2*fr_thickness; + int pig_h = height-2*fr_thickness; + + paintInit(do_save_bg); + + if(CNeutrinoApp::getInstance()->getMode() == NeutrinoMessages::mode_tv){ + videoDecoder->Pig(pig_x+2, pig_y, pig_w, pig_h, screen_w, screen_h); + } + else{ //paint an alternate image if no tv mode available + CComponentsPicture pic = CComponentsPicture (pig_x, pig_y, pig_w, pig_h, pic_name, CC_ALIGN_LEFT); + pic.paint(CC_SAVE_SCREEN_NO); + } + +} + + +void CComponentsPIP::hide(bool no_restore) +{ + videoDecoder->Pig(-1, -1, -1, -1); + hideCCItem(no_restore); +} diff --git a/src/gui/components/cc_types.h b/src/gui/components/cc_types.h new file mode 100644 index 000000000..4dc39ef2d --- /dev/null +++ b/src/gui/components/cc_types.h @@ -0,0 +1,113 @@ +/* + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + + Classes for generic GUI-related components. + Copyright (C) 2012, 2013, Thilo Graf 'dbt' + + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef __CC_TYPES__ +#define __CC_TYPES__ + +#include +#include + +//required typedefs +typedef struct comp_fbdata_t +{ + int fbdata_type; + int x; + int y; + int dx; + int dy; + fb_pixel_t color; + int r; + int frame_thickness; + fb_pixel_t* pixbuf; + void * data; +} comp_fbdata_struct_t; + +//fb data object types +typedef enum +{ + CC_FBDATA_TYPE_BGSCREEN, + CC_FBDATA_TYPE_SHADOW, + CC_FBDATA_TYPE_BOX, + CC_FBDATA_TYPE_FRAME, + CC_FBDATA_TYPE_LINE, + CC_FBDATA_TYPE_BACKGROUND, + + CC_FBDATA_TYPES +}FBDATA_TYPES; + +typedef struct comp_screen_data_t +{ + int x; + int y; + int dx; + int dy; + fb_pixel_t* pixbuf; +} comp_screen_data_struct_t; + +//align types +enum +{ + CC_ALIGN_RIGHT = 0, + CC_ALIGN_LEFT = 1, + CC_ALIGN_TOP = 2, + CC_ALIGN_BOTTOM = 4, + CC_ALIGN_HOR_CENTER = 8, + CC_ALIGN_VER_CENTER = 16 +}; + +enum +{ + CC_ITEMBOX_ICON, + CC_ITEMBOX_PICTURE, + CC_ITEMBOX_TEXT, + CC_ITEMBOX_CLOCK +}; + +typedef struct comp_element_data_t +{ + int type; + int align; + std::string element; + int x; + int y; + int width; + int height; + void* handler1; + void* handler2; +}comp_element_data_struct_t; + + +#define CC_WIDTH_MIN 16 +#define CC_HEIGHT_MIN 16 +#define CC_SHADOW_ON true +#define CC_SHADOW_OFF false +#define CC_SAVE_SCREEN_YES true +#define CC_SAVE_SCREEN_NO false + +#define CC_NO_INDEX -1 + + + +#endif diff --git a/src/gui/components/components.cpp b/src/gui/components/components.cpp deleted file mode 100644 index 63893826f..000000000 --- a/src/gui/components/components.cpp +++ /dev/null @@ -1,283 +0,0 @@ -/* - Based up Neutrino-GUI - Tuxbox-Project - Copyright (C) 2001 by Steffen Hehn 'McClean' - - Classes for generic for GUI-related components. - Copyright (C) 2012, 2013, Thilo Graf 'dbt' - Copyright (C) 2012, Michael Liebmann 'micha-bbg' - - License: GPL - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Library General Public License for more details. - - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the - Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, - Boston, MA 02110-1301, USA. -*/ - -#ifdef HAVE_CONFIG_H -#include -#endif - -#include -#include -#include "cc.h" - - - - - -//basic class CComponents -CComponents::CComponents(const int x_pos, const int y_pos, const int h, const int w) -{ - x = x_pos; - y = y_pos; - height = h; - width = w; - sw = 0; //shadow width - frameBuffer = CFrameBuffer::getInstance(); - v_screen_val.clear(); -} - -CComponents::~CComponents() -{ - clear(); -} - -//paint framebuffer stuff and fill buffer -void CComponents::paintFbItems(struct comp_fbdata_t * fbdata, const int items_count, bool do_save_bg) -{ - int i; - for(i=0; i< items_count ;i++){ - if (do_save_bg) - fbdata[i].pixbuf = saveScreen(fbdata[i].x, fbdata[i].y, fbdata[i].dx, fbdata[i].dy); - v_screen_val.push_back(fbdata[i]); - } - - for(i=0; i< items_count ;i++){ - if (fbdata[i].is_frame) - frameBuffer->paintBoxFrame(fbdata[i].x, fbdata[i].y, fbdata[i].dx, fbdata[i].dy, fbdata[i].frame_thickness, fbdata[i].color, fbdata[i].r); - else - frameBuffer->paintBoxRel(fbdata[i].x, fbdata[i].y, fbdata[i].dx, fbdata[i].dy, fbdata[i].color, fbdata[i].r); - } -} - -//screen area save -inline fb_pixel_t* CComponents::saveScreen(int ax, int ay, int dx, int dy) -{ - fb_pixel_t* pixbuf = new fb_pixel_t[dx * dy]; - frameBuffer->SaveScreen(ax, ay, dx, dy, pixbuf); - return pixbuf; -} - -//restore screen -inline void CComponents::restore() -{ - for(size_t i =0; i< v_screen_val.size() ;i++) { - if (v_screen_val[i].pixbuf != NULL){ - frameBuffer->RestoreScreen(v_screen_val[i].x, v_screen_val[i].y, v_screen_val[i].dx, v_screen_val[i].dy, v_screen_val[i].pixbuf); - delete[] v_screen_val[i].pixbuf; - } - } - v_screen_val.clear(); -} - -//clean old screen buffer -inline void CComponents::clear() -{ - for(size_t i =0; i< v_screen_val.size() ;i++) - if (v_screen_val[i].pixbuf != NULL) - delete[] v_screen_val[i].pixbuf; - v_screen_val.clear(); -} - -//------------------------------------------------------------------------------------------------------- -//sub class CComponentsDetailLine -CComponentsDetailLine::CComponentsDetailLine(const int x_pos, const int y_pos_top, const int y_pos_down, const int h_mark_top_, const int h_mark_down_, fb_pixel_t color_line, fb_pixel_t color_shadow) -{ - x = x_pos; - width = 16; - thickness = 4; - sw = 1; //shadow width - y = y_pos_top; - y_down = y_pos_down; - h_mark_top = h_mark_top_; - h_mark_down = h_mark_down_; - col_line = color_line; - col_shadow = color_shadow; -} - -CComponentsDetailLine::~CComponentsDetailLine() -{ - clear(); -} - -// y_top (=y) -// xpos +--|h_mark_up -// | -// | -// | -// | -// | -// | -// | -// | -// | -// +--|h_mark_down -// y_down - - -#define DLINE_ITEMS_COUNT 12 -//paint details line with current parameters -void CComponentsDetailLine::paint(bool do_save_bg) -{ - clear(); - - int y_mark_top = y-h_mark_top/2+thickness/2; - int y_mark_down = y_down-h_mark_down/2+thickness/2; - - comp_fbdata_t fbdata[DLINE_ITEMS_COUNT] = - { - /* vertical item mark | */ - {x+width-thickness-sw, y_mark_top, thickness, h_mark_top, col_line, 0, NULL, NULL, false, 0}, - {x+width-sw, y_mark_top, sw, h_mark_top, col_shadow, 0, NULL, NULL, false, 0}, - {x+width-thickness-sw, y_mark_top+h_mark_top, thickness+sw, sw , col_shadow, 0, NULL, NULL, false, 0}, - - /* horizontal item line - */ - {x, y, width-thickness-sw, thickness, col_line, 0, NULL, NULL, false, 0}, - {x+thickness, y+thickness, width-2*thickness-sw, sw, col_shadow, 0, NULL, NULL, false, 0}, - - /* vertical connect line [ */ - {x, y+thickness, thickness, y_down-y-thickness, col_line, 0, NULL, NULL, false, 0}, - {x+thickness, y+thickness+sw, sw, y_down-y-thickness-sw, col_shadow, 0, NULL, NULL, false, 0}, - - /* horizontal info line - */ - {x, y_down, width-thickness-sw, thickness, col_line, 0, NULL, NULL, false, 0}, - {x, y_down+thickness, width-thickness-sw, sw, col_shadow, 0, NULL, NULL, false, 0}, - - /* vertical info mark | */ - {x+width-thickness-sw, y_mark_down, thickness, h_mark_down, col_line, 0, NULL, NULL, false, 0}, - {x+width-sw, y_mark_down, sw, h_mark_down, col_shadow, 0, NULL, NULL, false, 0}, - {x+width-thickness-sw, y_mark_down+h_mark_down,thickness+sw, sw, col_shadow, 0, NULL, NULL, false, 0}, - }; - - paintFbItems(fbdata, DLINE_ITEMS_COUNT, do_save_bg); -} - -//remove painted lines from screen -void CComponentsDetailLine::hide() -{ - //caching current colors - fb_pixel_t c_tmp1, c_tmp2; - c_tmp1 = col_line; - c_tmp2 = col_shadow; - - //set background color - col_line = col_shadow = COL_BACKGROUND; - - //paint with background and restore, set last used colors - paint(false); - col_line = c_tmp1; - col_shadow = c_tmp2; -} - - -//------------------------------------------------------------------------------------------------------- -//sub class CComponentsInfoBox -CComponentsInfoBox::CComponentsInfoBox(const int x_pos, const int y_pos, const int w, const int h, bool has_shadow, fb_pixel_t color_frame, fb_pixel_t color_body, fb_pixel_t color_shadow) -{ - x = x_pos; - y = y_pos; - width = w; - height = h; - rad = 0; - shadow = has_shadow; - col_frame = color_frame; - col_body = color_body; - col_shadow = color_shadow; - fr_thickness = 2; - firstPaint = true; - v_infobox_val.clear(); -} - -#define INFOBOX_ITEMS_COUNT 3 -void CComponentsInfoBox::paint(bool do_save_bg, bool fullPaint) -{ - clear(); - rad = RADIUS_LARGE; - - comp_fbdata_t fbdata[INFOBOX_ITEMS_COUNT] = - { - {x+SHADOW_OFFSET, y+SHADOW_OFFSET, width, height, col_shadow, rad, NULL, NULL, false, 0}, - {x, y, width, height, col_frame, rad, NULL, NULL, false, 0}, - {x+fr_thickness, y+fr_thickness, width-2*fr_thickness, height-2*fr_thickness, col_body, rad, NULL, NULL, false, 0}, - }; - - int start = (shadow) ? 0 : 1; - if (firstPaint) { - if (do_save_bg) { - v_infobox_val.clear(); - for(int i = start; i < INFOBOX_ITEMS_COUNT; i++) { - fbdata[i].pixbuf = saveScreen(fbdata[i].x, fbdata[i].y, fbdata[i].dx, fbdata[i].dy); - v_infobox_val.push_back(fbdata[i]); - fbdata[i].pixbuf = NULL; - } - } - // paint infobox full - paintFbItems((comp_fbdata_t*)&fbdata[start], INFOBOX_ITEMS_COUNT - start, false); - firstPaint = false; - } - else { - if (fullPaint) - // paint infobox full - paintFbItems((comp_fbdata_t*)&fbdata[start], INFOBOX_ITEMS_COUNT - start, false); - else - // paint body only - paintFbItems((comp_fbdata_t*)&fbdata[INFOBOX_ITEMS_COUNT - 1], 1, false); - } -} - -//restore infobox -void CComponentsInfoBox::restore(bool clear_) -{ - if (!v_infobox_val.empty()) { - for(size_t i =0; i< v_infobox_val.size() ;i++) { - if (v_infobox_val[i].pixbuf != NULL) { - frameBuffer->RestoreScreen(v_infobox_val[i].x, v_infobox_val[i].y, v_infobox_val[i].dx, v_infobox_val[i].dy, v_infobox_val[i].pixbuf); - if (clear_) - delete[] v_infobox_val[i].pixbuf; - } - } - if (clear_) { - v_infobox_val.clear(); - firstPaint = true; - } - } -} - -void CComponentsInfoBox::hide() -{ - //caching current colors - fb_pixel_t c_tmp1, c_tmp2, c_tmp3; - c_tmp1 = col_body; - c_tmp2 = col_shadow; - c_tmp3 = col_frame; - - //set background color - col_body = col_frame = col_shadow = COL_BACKGROUND; - - //paint with background and restore, set last used colors - paint(false, true); - col_body = c_tmp1; - col_shadow = c_tmp2; - col_frame = c_tmp3; -} diff --git a/src/gui/epgplus.cpp b/src/gui/epgplus.cpp index c3ab392b1..19ac849f7 100644 --- a/src/gui/epgplus.cpp +++ b/src/gui/epgplus.cpp @@ -647,8 +647,8 @@ void EpgPlus::init() currentViewMode = ViewMode_Scroll; currentSwapMode = SwapMode_ByPage; #endif - usableScreenWidth = w_max (g_settings.screen_EndX, 0); - usableScreenHeight = h_max (g_settings.screen_EndY, 0); + usableScreenWidth = frameBuffer->getScreenWidthRel(); + usableScreenHeight = frameBuffer->getScreenHeightRel(); std::string FileName = std::string (g_settings.font_file); for (size_t i = 0; i < NumberOfFontSettings; ++i) { int size = fontSettingTable[i].size; @@ -703,8 +703,8 @@ void EpgPlus::init() this->maxNumberOfDisplayableEntries = (this->usableScreenHeight - headerHeight - timeLineHeight - horGap1Height - horGap2Height - footerHeight) / this->entryHeight; this->usableScreenHeight = headerHeight + timeLineHeight + horGap1Height + this->maxNumberOfDisplayableEntries * this->entryHeight + horGap2Height + footerHeight; // recalc deltaY - this->usableScreenX = (((g_settings.screen_EndX - g_settings.screen_StartX) - this->usableScreenWidth) / 2) + g_settings.screen_StartX; - this->usableScreenY = (((g_settings.screen_EndY - g_settings.screen_StartY) - this->usableScreenHeight) / 2) + g_settings.screen_StartY; + this->usableScreenX = getScreenStartX(this->usableScreenWidth); + this->usableScreenY = getScreenStartY(this->usableScreenHeight); this->headerX = this->usableScreenX; this->headerY = this->usableScreenY; diff --git a/src/gui/epgview.cpp b/src/gui/epgview.cpp index e095b6493..1fd4139e1 100644 --- a/src/gui/epgview.cpp +++ b/src/gui/epgview.cpp @@ -117,17 +117,8 @@ CEpgData::CEpgData() void CEpgData::start() { - /* This defines the size of the EPG window. We use 90% of the screen width and - * 90% of the screen height. It adjusts itself to the "visible screen" settings - */ - float epgwin_scale_factor = BIG_FONT_FAKTOR; /* stupid useless use of float */ - if (g_settings.big_windows) - epgwin_scale_factor = 1; - - ox = (frameBuffer->getScreenWidth() / 20 * 18) / (bigFonts ? 1 : epgwin_scale_factor); - oy = (frameBuffer->getScreenHeight() / 20 * 18) / (bigFonts ? 1 : epgwin_scale_factor); - sx = getScreenStartX(ox); - sy = getScreenStartY(oy); + ox = frameBuffer->getScreenWidthRel(); + oy = frameBuffer->getScreenHeightRel(); topheight = g_Font[SNeutrinoSettings::FONT_TYPE_EPG_TITLE]->getHeight(); topboxheight = topheight + 6; @@ -142,6 +133,9 @@ void CEpgData::start() medlineheight = g_Font[SNeutrinoSettings::FONT_TYPE_EPG_INFO1]->getHeight(); medlinecount = sb / medlineheight; toph = topboxheight; + + sx = getScreenStartX(ox); + sy = getScreenStartY(oy + buttonheight/2); /* button box is handled separately (why?) */ } void CEpgData::addTextToArray(const std::string & text, int screening) // UTF-8 diff --git a/src/gui/filebrowser.cpp b/src/gui/filebrowser.cpp index 180bbd25b..d6a75f73e 100644 --- a/src/gui/filebrowser.cpp +++ b/src/gui/filebrowser.cpp @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -375,11 +376,9 @@ void CFileBrowser::commonInit() selected = 0; selections.clear(); - x = g_settings.screen_StartX + 20; - y = g_settings.screen_StartY + 20; - - width = (g_settings.screen_EndX - g_settings.screen_StartX - 40); - height = (g_settings.screen_EndY - g_settings.screen_StartY - 40); + width = frameBuffer->getScreenWidthRel(); + height = frameBuffer->getScreenHeightRel(); + x = getScreenStartX(width); theight = fnt_title->getHeight(); fheight = fnt_item->getHeight(); @@ -392,6 +391,7 @@ void CFileBrowser::commonInit() //recalc height height = theight + listmaxshow * fheight + 2 * foheight; + y = getScreenStartY(height); m_SMSKeyInput.setTimeout(SMSKEY_TIMEOUT); diff --git a/src/gui/imageinfo.cpp b/src/gui/imageinfo.cpp index f1643ab12..da0a2da9b 100644 --- a/src/gui/imageinfo.cpp +++ b/src/gui/imageinfo.cpp @@ -1,6 +1,9 @@ /* - Neutrino-GUI - DBoxII-Project + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + Implementation of component classes + Copyright (C) 2013, Thilo Graf 'dbt' License: GPL @@ -14,9 +17,10 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H @@ -28,84 +32,46 @@ #include #include -#include #include -#include #include - +#include +#include +#include #include - #include -#include #include "git_version.h" #define GIT_DESC "GIT Desc.:" #define GIT_REV "GIT Build:" -extern cVideo * videoDecoder; +#define LICENSEDIR DATADIR "/neutrino/license/" + +using namespace std; extern CRemoteControl * g_RemoteControl; /* neutrino.cpp */ -CImageInfo::CImageInfo() +CImageInfo::CImageInfo(): config ('\t') { Init(); } -static const neutrino_locale_t info_items[8] = -{ - LOCALE_IMAGEINFO_IMAGE, - LOCALE_IMAGEINFO_DATE, - LOCALE_IMAGEINFO_VERSION, - LOCALE_IMAGEINFO_CREATOR, - LOCALE_IMAGEINFO_HOMEPAGE, - LOCALE_IMAGEINFO_DOKUMENTATION, - LOCALE_IMAGEINFO_FORUM, - LOCALE_IMAGEINFO_LICENSE -}; - +//init all var members void CImageInfo::Init(void) { - frameBuffer = CFrameBuffer::getInstance(); - - font_head = SNeutrinoSettings::FONT_TYPE_INFOBAR_CHANNAME;; - font_small = SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL; - font_info = SNeutrinoSettings::FONT_TYPE_MENU; - - hheight = g_Font[font_head]->getHeight(); - iheight = g_Font[font_info]->getHeight(); - sheight = g_Font[font_small]->getHeight(); - - max_width = frameBuffer->getScreenWidth(true); - max_height = frameBuffer->getScreenHeight(true); - - width = frameBuffer->getScreenWidth() - 10; - height = frameBuffer->getScreenHeight() - 10; - x=getScreenStartX( width ); - y=getScreenStartY( height ); - - // calculate max width of used LOCALES - offset = 0; - - for (int i = 0; i < 8; i++) { - int tmpoffset = g_Font[font_info]->getRenderWidth(g_Locale->getText (info_items[i])); - if (tmpoffset > offset) { - offset = tmpoffset; - } - } -#ifdef GITVERSION - int off_tmp = g_Font[font_info]->getRenderWidth(GIT_DESC); -#else - int off_tmp = g_Font[font_info]->getRenderWidth(GIT_REV); -#endif - if(off_tmp > offset) - offset = off_tmp; - - offset = offset + 15; + cc_win = NULL; + cc_lic = NULL; + item_offset = 20; + item_top = item_offset; + license_txt = ""; + v_info.clear(); + v_info_supp.clear(); + config.loadConfig("/.version"); } CImageInfo::~CImageInfo() { - videoDecoder->Pig(-1, -1, -1, -1); + //deallocate window object, deletes also added cc_items + delete cc_win; } int CImageInfo::exec(CMenuTarget* parent, const std::string &) @@ -114,19 +80,10 @@ int CImageInfo::exec(CMenuTarget* parent, const std::string &) if (parent) parent->hide(); - width = frameBuffer->getScreenWidth() - 10; - height = frameBuffer->getScreenHeight() - 10; - x=getScreenStartX( width ); - y=getScreenStartY( height ); - - paint(); - - //paint_pig( width-170, y, 215, 170); - paint_pig (width - width/3 - 10, y + 10, width/3, height/3); - frameBuffer->blit(); + //init window object and add cc_items + ShowWindow(); neutrino_msg_t msg; - while (1) { neutrino_msg_data_t data; @@ -142,81 +99,92 @@ int CImageInfo::exec(CMenuTarget* parent, const std::string &) res = menu_return::RETURN_EXIT_ALL; break; } - else if (msg <= CRCInput::RC_MaxRC) - { + else if ((msg == CRCInput::RC_up) || (msg == CRCInput::RC_page_up)) { + ScrollLic(false); + } + else if ((msg == CRCInput::RC_down) || (msg == CRCInput::RC_page_down)) { + ScrollLic(true); + } + else if (msg <= CRCInput::RC_MaxRC){ break; } - if ( msg > CRCInput::RC_MaxRC && msg != CRCInput::RC_timeout) - { + if ( msg > CRCInput::RC_MaxRC && msg != CRCInput::RC_timeout){ CNeutrinoApp::getInstance()->handleMsg( msg, data ); } frameBuffer->blit(); } - hide(); + //hide window + cc_win->hide(); + + //deallocate of the window object causes also deallocate added items, + delete cc_win; + //it's important to set here a null pointer + cc_win = NULL; return res; } -void CImageInfo::hide() +//contains all actions to init and add the window object and items +void CImageInfo::ShowWindow() { - //frameBuffer->paintBackgroundBoxRel(0,0, max_width,max_height); - frameBuffer->paintBackground(); - videoDecoder->Pig(-1, -1, -1, -1); + if (cc_win == NULL){ + cc_win = new CComponentsWindow(LOCALE_IMAGEINFO_HEAD, NEUTRINO_ICON_INFO); + item_top = cc_win->getStartY() + item_offset; + cc_win->setWindowHeaderButtons(CComponentsHeader::CC_BTN_MENU | CComponentsHeader::CC_BTN_EXIT); + } + + //prepare minitv: important! init the minitv object as first + InitMinitv(); + + //prepare infos + InitInfos(); + + //add section space + item_top += 5; + + //prepare suppoprt infos + InitSupportInfos(); + + //prepare license text + InitLicenseText(); + + //paint window + cc_win->paint(); + frameBuffer->blit(); } -void CImageInfo::paint_pig(int px, int py, int w, int h) +//prepare minitv +void CImageInfo::InitMinitv() { - //frameBuffer->paintBoxRel(px,py,w,h, COL_BACKGROUND); - frameBuffer->paintBackgroundBoxRel(px,py,w,h); - videoDecoder->Pig(px, py, w, h, frameBuffer->getScreenWidth(true), frameBuffer->getScreenHeight(true)); + //init the minitv object + CComponentsPIP *cc_tv = new CComponentsPIP (0, item_top, 33/*%*/); + + //init x pos and use as parameter for setXPos + int cc_tv_x = (cc_win->getWidth() - cc_tv->getWidth()) - item_offset; + cc_tv->setXPos(cc_tv_x); + + //add minitv to container + cc_win->addCCItem(cc_tv); } -void CImageInfo::paintLine(int xpos, int font, const char* text) +//prepare distribution infos +void CImageInfo::InitInfos() { - char buf[100]; - snprintf((char*) buf,sizeof(buf), "%s", text); - //g_Font[font]->RenderString(xpos, ypos, width-10, buf, COL_MENUCONTENT, 0, true); - g_Font[font]->RenderString(xpos, ypos, width-10, buf, COL_INFOBAR, 0, true); -} + v_info.clear(); -void CImageInfo::paint() -{ - const char * head_string; - char imagedate[18] = ""; - int xpos = x+10; - - ypos = y+5; - - head_string = g_Locale->getText(LOCALE_IMAGEINFO_HEAD); - CVFD::getInstance()->setMode(CVFD::MODE_MENU_UTF8, head_string); - - //frameBuffer->paintBoxRel(0, 0, max_width, max_height, COL_MENUHEAD_PLUS_0); - frameBuffer->paintBoxRel(0, 0, max_width, max_height, COL_INFOBAR_PLUS_0); - g_Font[font_head]->RenderString(xpos, ypos+ hheight+1, width, head_string, COL_MENUHEAD, 0, true); - - ypos += hheight; - ypos += (iheight >>1); - - CConfigFile config('\t'); - config.loadConfig("/.version"); - - const char * imagename = config.getString("imagename", "Neutrino-HD").c_str(); - const char * homepage = config.getString("homepage", "n/a").c_str(); - const char * creator = config.getString("creator", "n/a").c_str(); - const char * version = config.getString("version", "no version").c_str(); - const char * docs = config.getString("docs", "http://wiki.neutrino-hd.de").c_str(); - const char * forum = config.getString("forum", "http://forum.tuxbox.org").c_str(); #ifdef GITVERSION const char * builddate = GITVERSION; #else const char * builddate = config.getString("builddate", BUILT_DATE).c_str(); #endif + const char * version = config.getString("version", "no version").c_str(); + config.getString("version", "no version"); static CFlashVersionInfo versionInfo(version); const char * releaseCycle = versionInfo.getReleaseCycle(); - + struct utsname uts_info; std::string Version_Kernel; if( uname(&uts_info) < 0 ) { @@ -231,75 +199,115 @@ void CImageInfo::paint() Version_Kernel += uts_info.release; } - snprintf((char*) imagedate,sizeof(imagedate), "%s %s", versionInfo.getDate(), versionInfo.getTime()); + image_info_t imagename = {LOCALE_IMAGEINFO_IMAGE, config.getString("imagename", "Neutrino-HD")}; + v_info.push_back(imagename); + image_info_t date = {LOCALE_IMAGEINFO_DATE, builddate}; + v_info.push_back(date); + image_info_t kversion = {LOCALE_IMAGEINFO_VERSION, Version_Kernel}; + v_info.push_back(kversion); + image_info_t creator = {LOCALE_IMAGEINFO_CREATOR, config.getString("creator", "n/a")}; + v_info.push_back(creator); - ypos += iheight; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_IMAGE)); - paintLine(xpos+offset, font_info, imagename); + //create label and text items + for (size_t i = 0; i < v_info.size(); i++) { + CComponentsLabel *cc_txt = new CComponentsLabel(); + cc_txt->setDimensionsAll(item_offset, item_top, 200, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight()); + cc_txt->setText(v_info[i].caption, CTextBox::NO_AUTO_LINEBREAK, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]); - ypos += iheight; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_DATE)); - paintLine(xpos+offset, font_info, imagedate); + //add label to container + cc_win->addCCItem(cc_txt); - ypos += iheight; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_VERSION)); - paintLine(xpos+offset, font_info, Version_Kernel.c_str()); + CComponentsText *cc_info = new CComponentsText(); + cc_info->setDimensionsAll(item_offset+cc_txt->getWidth(), item_top, 450, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight()); + cc_info->setText(v_info[i].info_text.c_str(), CTextBox::NO_AUTO_LINEBREAK, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]); - ypos += iheight; -#ifdef GITVERSION - paintLine(xpos , font_info, GIT_DESC); -#else - paintLine(xpos , font_info, GIT_REV); -#endif - paintLine(xpos+offset, font_info, builddate ); - - ypos += iheight; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_CREATOR)); - paintLine(xpos+offset, font_info, creator); + //add text to container + cc_win->addCCItem(cc_info); - ypos += iheight+15; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_HOMEPAGE)); - paintLine(xpos+offset, font_info, homepage); - - ypos += iheight; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_DOKUMENTATION)); - paintLine(xpos+offset, font_info, docs); - - ypos += iheight; - paintLine(xpos , font_info, g_Locale->getText(LOCALE_IMAGEINFO_FORUM)); - paintLine(xpos+offset, font_info, forum); - - ypos += iheight+15; - paintLine(xpos, font_info,g_Locale->getText(LOCALE_IMAGEINFO_LICENSE)); - paintLine(xpos+offset, font_small, "This program is free software; you can redistribute it and/or modify"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "it under the terms of the GNU General Public License as published by"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "the Free Software Foundation; either version 2 of the License, or"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "(at your option) any later version."); - - ypos+= sheight+10; - paintLine(xpos+offset, font_small, "This program is distributed in the hope that it will be useful,"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "but WITHOUT ANY WARRANTY; without even the implied warranty of"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "See the GNU General Public License for more details."); - - ypos+= sheight+10; - paintLine(xpos+offset, font_small, "You should have received a copy of the GNU General Public License"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "along with this program; if not, write to the Free Software"); - - ypos+= sheight; - paintLine(xpos+offset, font_small, "Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA."); + item_top += item_offset*2-5; + } +} + +//prepare support infos +void CImageInfo::InitSupportInfos() +{ + v_info_supp.clear(); + + image_info_t www = {LOCALE_IMAGEINFO_HOMEPAGE, config.getString("homepage", "n/a")}; + v_info_supp.push_back(www); + image_info_t doc = {LOCALE_IMAGEINFO_DOKUMENTATION, config.getString("docs", "http://wiki.neutrino-hd.de")}; + v_info_supp.push_back(doc); + image_info_t forum = {LOCALE_IMAGEINFO_FORUM, config.getString("forum", "http://forum.tuxbox.org")}; + v_info_supp.push_back(forum); + image_info_t license = {LOCALE_IMAGEINFO_LICENSE, "GPL"}; + v_info_supp.push_back(license); + + //create text an label items + for (size_t i = 0; i < v_info_supp.size(); i++) { + CComponentsLabel *cc_txt = new CComponentsLabel(); + cc_txt->setDimensionsAll(item_offset, item_top, 200, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight()); + cc_txt->setText(v_info_supp[i].caption, CTextBox::NO_AUTO_LINEBREAK, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]); + + cc_win->addCCItem(cc_txt); + + CComponentsText *cc_info = new CComponentsText(); + cc_info->setDimensionsAll(item_offset+cc_txt->getWidth(), item_top, 450, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getHeight()); + cc_info->setText(v_info_supp[i].info_text.c_str(), CTextBox::NO_AUTO_LINEBREAK, g_Font[SNeutrinoSettings::FONT_TYPE_MENU]); + + cc_win->addCCItem(cc_info); + + item_top += item_offset*2-5; + } +} + +//prepare license infos +void CImageInfo::InitLicenseText() +{ + license_txt = ""; + char line[1024]; + string file = LICENSEDIR; + file += g_settings.language; + file += ".license"; + ifstream in (file.c_str(), ios::in); + + if (!in){ + printf("[CImageInfo] [%s - %d] error while open %s -> %s\n", __FUNCTION__, __LINE__, file.c_str(), strerror(errno)); + return; + } + + while (in.getline (line, sizeof(line)-1)){ + string lline = (string)line; + license_txt += lline + '\n'; + } + in.close(); + + cc_lic = new CComponentsInfoBox(item_offset, item_top, cc_win->getWidth()-2*item_offset, cc_win->getHeight()-item_top-item_offset); + cc_lic->setText(license_txt, CTextBox::AUTO_WIDTH | CTextBox::SCROLL, g_Font[SNeutrinoSettings::FONT_TYPE_MENU_HINT]); + + //add text to container + cc_win->addCCItem(cc_lic); +} + +//scroll licens text +void CImageInfo::ScrollLic(bool scrollDown) +{ + if (cc_lic && (cc_lic->cctext)) { + //get the textbox instance from infobox object and use CTexBbox scroll methods + CTextBox* ctb = cc_lic->cctext->getCTextBoxObject(); + if (ctb) { + ctb->enableBackgroundPaint(true); + if (scrollDown) + ctb->scrollPageDown(1); + else + ctb->scrollPageUp(1); + ctb->enableBackgroundPaint(false); + } + } +} + + + +void CImageInfo::hide() +{ + cc_win->hide(); } diff --git a/src/gui/imageinfo.h b/src/gui/imageinfo.h index 8f50abe97..95b0c5c4a 100644 --- a/src/gui/imageinfo.h +++ b/src/gui/imageinfo.h @@ -1,6 +1,9 @@ /* - Neutrino-GUI - DBoxII-Project + Based up Neutrino-GUI - Tuxbox-Project + Copyright (C) 2001 by Steffen Hehn 'McClean' + Implementation of component classes + Copyright (C) 2013, Thilo Graf 'dbt' License: GPL @@ -14,47 +17,48 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + You should have received a copy of the GNU General Public + License along with this program; if not, write to the + Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + Boston, MA 02110-1301, USA. */ #ifndef __imageinfo__ #define __imageinfo__ +#include +#include #include -#include -#include -#include +typedef struct image_info_t +{ + neutrino_locale_t caption; + std::string info_text; + +} image_info_struct_t; class CImageInfo : public CMenuTarget { private: - void Init(void); - CConfigFile * configfile; - CFrameBuffer *frameBuffer; - int x; - int y; - int ypos; - int width; - int height; - int hheight,iheight,sheight; // head/info/small font height + int item_offset; //distance between items and to boarder + int item_top; //start line in y below header + std::string license_txt; - int max_height; // Frambuffer 0.. max - int max_width; + std::vector v_info; + std::vector v_info_supp; - neutrino_locale_t name; - int offset; - - int font_head; - int font_info; - int font_small; - - void paint(); - void paint_pig(int x, int y, int w, int h); - void paintLine(int xpos, int font, const char* text); + void Init(); + void InitMinitv(); + void InitInfos(); + void InitSupportInfos(); + void ShowWindow(); + void InitLicenseText(); + void ScrollLic(bool scrollDown); + + CComponentsWindow *cc_win; + CComponentsInfoBox *cc_lic; + CConfigFile config; public: diff --git a/src/gui/moviebrowser.cpp b/src/gui/moviebrowser.cpp index 573e01d47..f36b9a65a 100644 --- a/src/gui/moviebrowser.cpp +++ b/src/gui/moviebrowser.cpp @@ -39,6 +39,7 @@ #endif #include +#include #include #include @@ -602,10 +603,10 @@ void CMovieBrowser::initFrames(void) m_pcFontTitle = TITLE_FONT; //TRACE("[mb]->initFrames\r\n"); - m_cBoxFrame.iX = g_settings.screen_StartX + 10; - m_cBoxFrame.iY = g_settings.screen_StartY + 10; - m_cBoxFrame.iWidth = g_settings.screen_EndX - g_settings.screen_StartX - 20; - m_cBoxFrame.iHeight = g_settings.screen_EndY - g_settings.screen_StartY - 20; + m_cBoxFrame.iWidth = m_pcWindow->getScreenWidthRel(); + m_cBoxFrame.iHeight = m_pcWindow->getScreenHeightRel(); + m_cBoxFrame.iX = getScreenStartX(m_cBoxFrame.iWidth); + m_cBoxFrame.iY = getScreenStartY(m_cBoxFrame.iHeight); m_cBoxFrameTitleRel.iX = 0; m_cBoxFrameTitleRel.iY = 0; diff --git a/src/gui/personalize.cpp b/src/gui/personalize.cpp index d42abf8f9..4cebbb484 100644 --- a/src/gui/personalize.cpp +++ b/src/gui/personalize.cpp @@ -24,18 +24,18 @@ License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/personalize.h b/src/gui/personalize.h index b3c00ea97..9b6a452c4 100644 --- a/src/gui/personalize.h +++ b/src/gui/personalize.h @@ -24,18 +24,18 @@ License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/pictureviewer.cpp b/src/gui/pictureviewer.cpp index fb4c6dd57..4cefece73 100644 --- a/src/gui/pictureviewer.cpp +++ b/src/gui/pictureviewer.cpp @@ -128,8 +128,9 @@ int CPictureViewerGui::exec(CMenuTarget* parent, const std::string & actionKey) audioplayer = true; selected = 0; - width = w_max (710, 0); - height = h_max (570, 0); + + width = frameBuffer->getScreenWidthRel(); + height = frameBuffer->getScreenHeightRel(); sheight = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight(); diff --git a/src/gui/record_setup.cpp b/src/gui/record_setup.cpp index 599754ece..bec04b041 100644 --- a/src/gui/record_setup.cpp +++ b/src/gui/record_setup.cpp @@ -229,6 +229,13 @@ int CRecordSetup::showRecordSetup() mf->setHint("", LOCALE_MENU_HINT_RECORD_APIDS); recordingSettings->addItem(mf); + //datasettings + CMenuWidget recordingaDataSettings(LOCALE_MAINSETTINGS_RECORDING, NEUTRINO_ICON_SETTINGS, width, MN_WIDGET_ID_RECORDSETUP_DATASETTINGS); + showRecordDataSetup(&recordingaDataSettings); + mf = new CMenuForwarder(LOCALE_RECORDINGMENU_DATA_PIDS, true, NULL, &recordingaDataSettings, NULL, CRCInput::RC_1); + mf->setHint("", LOCALE_MENU_HINT_RECORD_DATA); + recordingSettings->addItem(mf); + int res = recordingSettings->exec(NULL, ""); delete recordingSettings; return res; @@ -291,6 +298,22 @@ void CRecordSetup::showRecordAudioSetup(CMenuWidget *menu_audiosettings) menu_audiosettings->addItem(aoj3); } +void CRecordSetup::showRecordDataSetup(CMenuWidget *menu_datasettings) +{ + //recording data pids + + //teletext pids + CMenuOptionChooser* doj1 = new CMenuOptionChooser(LOCALE_RECORDINGMENU_VTXT_PID, &g_settings.recording_stream_vtxt_pid, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this); + CMenuOptionChooser* doj2 = new CMenuOptionChooser(LOCALE_RECORDINGMENU_DVBSUB_PIDS, &g_settings.recording_stream_subtitle_pids, OPTIONS_OFF0_ON1_OPTIONS, OPTIONS_OFF0_ON1_OPTION_COUNT, true, this); + + doj1->setHint("", LOCALE_MENU_HINT_RECORD_DATA_VTXT); + doj2->setHint("", LOCALE_MENU_HINT_RECORD_DATA_DVBSUB); + + menu_datasettings->addIntroItems(LOCALE_RECORDINGMENU_DATA_PIDS); + menu_datasettings->addItem(doj1); + menu_datasettings->addItem(doj2); +} + void CRecordSetup::showRecordTimeShiftSetup(CMenuWidget *menu_ts) { menu_ts->addIntroItems(LOCALE_RECORDINGMENU_TIMESHIFT); diff --git a/src/gui/record_setup.h b/src/gui/record_setup.h index d9693e034..996d31a5d 100644 --- a/src/gui/record_setup.h +++ b/src/gui/record_setup.h @@ -44,6 +44,8 @@ class CRecordSetup : public CMenuTarget, public CChangeObserver int showRecordSetup(); void showRecordTimerSetup(CMenuWidget *menu_timersettings); void showRecordAudioSetup(CMenuWidget *menu_audiosettings); + void showRecordDataSetup(CMenuWidget *menu_datasettings); + void showRecordTimeShiftSetup(CMenuWidget *menu_ts); public: diff --git a/src/gui/start_wizard.cpp b/src/gui/start_wizard.cpp index 1fd2b1559..17ec7e642 100644 --- a/src/gui/start_wizard.cpp +++ b/src/gui/start_wizard.cpp @@ -14,17 +14,17 @@ License: GPL This software is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/start_wizard.h b/src/gui/start_wizard.h index 2fbafcb6a..4b8e51641 100644 --- a/src/gui/start_wizard.h +++ b/src/gui/start_wizard.h @@ -14,17 +14,17 @@ License: GPL This software is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/streaminfo2.cpp b/src/gui/streaminfo2.cpp index fd845b11d..203fa4371 100644 --- a/src/gui/streaminfo2.cpp +++ b/src/gui/streaminfo2.cpp @@ -56,7 +56,7 @@ extern CRemoteControl *g_RemoteControl; /* neutrino.cpp */ CStreamInfo2::CStreamInfo2 () { frameBuffer = CFrameBuffer::getInstance (); - + pip = NULL; font_head = SNeutrinoSettings::FONT_TYPE_MENU_TITLE; font_info = SNeutrinoSettings::FONT_TYPE_MENU; font_small = SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL; @@ -99,7 +99,7 @@ CStreamInfo2::CStreamInfo2 () CStreamInfo2::~CStreamInfo2 () { - videoDecoder->Pig(-1, -1, -1, -1); + delete pip; ts_close(); } @@ -251,19 +251,11 @@ int CStreamInfo2::doSignalStrengthLoop () void CStreamInfo2::hide () { - videoDecoder->Pig(-1, -1, -1, -1); + pip->hide(true); frameBuffer->paintBackgroundBoxRel (0, 0, max_width, max_height); frameBuffer->blit(); } -void CStreamInfo2::paint_pig (int px, int py, int w, int h) -{ - frameBuffer->paintBackgroundBoxRel (px,py, w, h); - frameBuffer->blit(); - printf("CStreamInfo2::paint_pig x %d y %d w %d h %d\n", px, py, w, h); - videoDecoder->Pig(px, py, w, h, frameBuffer->getScreenWidth(true), frameBuffer->getScreenHeight(true)); -} - void CStreamInfo2::paint_signal_fe_box(int _x, int _y, int w, int h) { int y1; @@ -435,7 +427,10 @@ void CStreamInfo2::paint (int /*mode*/) g_Font[font_head]->RenderString (xpos, ypos + hheight + 1, width, head_string, COL_MENUHEAD, 0, true); // UTF-8 ypos += hheight; - paint_pig (width - width/3 - 10, y + 10, width/3, height/3); + if (pip == NULL) + pip = new CComponentsPIP(width-width/3-10, y+10, 33); + pip->paint(); + paint_techinfo (xpos, ypos); paint_signal_fe_box (width - width/3 - 10, (y + 10 + height/3 + hheight), width/3, height/3 + hheight); } else { diff --git a/src/gui/streaminfo2.h b/src/gui/streaminfo2.h index 14e36b06f..4ad1411ce 100644 --- a/src/gui/streaminfo2.h +++ b/src/gui/streaminfo2.h @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -36,6 +37,7 @@ class CStreamInfo2 : public CMenuTarget CFrameBuffer *frameBuffer; CFrontend *frontend; + CComponentsPIP * pip; int x; int y; int width; @@ -92,7 +94,6 @@ class CStreamInfo2 : public CMenuTarget int ts_close(); void paint(int mode); - void paint_pig(int x, int y, int w, int h); void paint_techinfo(int x, int y); void paintCASystem(int xpos, int ypos); void paint_signal_fe_box(int x, int y, int w, int h); diff --git a/src/gui/test_menu.cpp b/src/gui/test_menu.cpp index d0e3419be..b714c5f22 100644 --- a/src/gui/test_menu.cpp +++ b/src/gui/test_menu.cpp @@ -54,6 +54,7 @@ #include #include + extern int cs_test_card(int unit, char * str); #ifdef TEST_MENU @@ -61,10 +62,26 @@ CTestMenu::CTestMenu() { width = w_max (50, 10); selected = -1; + circle = NULL; + sq = NULL; + pic= NULL; + form = NULL; + txt = NULL; + header = NULL; + iconform = NULL; + window = NULL; } CTestMenu::~CTestMenu() { + delete sq; + delete circle; + delete pic; + delete form; + delete txt; + delete header; + delete iconform; + delete window; } int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) @@ -311,10 +328,191 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) delete scanTs; return res; } + else if (actionKey == "circle"){ + if (circle == NULL) + circle = new CComponentsShapeCircle (100, 100, 100, false); + if (!circle->isPainted()) + circle->paint(); + else + circle->hide(); + return res; + } + else if (actionKey == "square"){ + if (sq == NULL) + sq = new CComponentsShapeSquare (100, 220, 100, 100, false); + if (!sq->isPainted()) + sq->paint(); + else + sq->hide(); + return res; + } + else if (actionKey == "picture"){ + if (pic == NULL) + pic = new CComponentsPicture (100, 100, 200, 200, "/share/tuxbox/neutrino/icons/mp3-5.jpg"); + + if (!pic->isPainted() && !pic->isPicPainted()) + pic->paint(); + else + pic->hide(); + return res; + } + else if (actionKey == "form"){ + if (form == NULL) + form = new CComponentsForm(); + form->setColorBody(COL_LIGHT_GRAY); + form->setDimensionsAll(100, 100, 250, 100); + form->setFrameThickness(2); + form->setColorFrame(COL_WHITE); + + CComponentsPicture *ptmp = new CComponentsPicture(0, 0, 0, 0, NEUTRINO_ICON_BUTTON_YELLOW); + ptmp->setWidth(28); + ptmp->setHeight(28); + ptmp->setPictureAlign(CC_ALIGN_HOR_CENTER | CC_ALIGN_VER_CENTER); + ptmp->setColorBody(COL_BLUE); + ptmp->setCornerRadius(RADIUS_MID); + ptmp->setCornerType(CORNER_TOP_LEFT); + form->addCCItem(ptmp); + + CComponentsText *t1 = new CComponentsText(28, 0, 100, 28, "Text1", CTextBox::NO_AUTO_LINEBREAK); + form->addCCItem(t1); + + CComponentsText *t2 = new CComponentsText(t1->getXPos()+t1->getWidth(), 0, 200, 50, "Text2", CTextBox::NO_AUTO_LINEBREAK | CTextBox::RIGHT); + t2->setCornerRadius(RADIUS_MID); + t2->setCornerType(CORNER_TOP_RIGHT); + form->addCCItem(t2); + + CComponentsShapeCircle *c1 = new CComponentsShapeCircle(28, 40, 28); + c1->setColorBody(COL_RED); + form->addCCItem(c1); + +// form->removeCCItem(form->getCCItemId(t1)); +// form->insertCCItem(1, new CComponentsPicture(28, 0, 0, 0, NEUTRINO_ICON_BUTTON_RED)); + + + if (form->isPainted()) { + form->hide(); + delete form; + form = NULL; + } + else + form->paint(); + return res; + } + else if (actionKey == "text"){ + if (txt == NULL) + txt = new CComponentsText(); + txt->setDimensionsAll(100, 100, 250, 100); + txt->setText("This is a text for testing textbox", CTextBox::NO_AUTO_LINEBREAK); + + if (txt->isPainted()) + txt->hide(); + else + txt->paint(); + return res; + } + else if (actionKey == "header"){ + int hh = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(); + if (header == NULL){ + header = new CComponentsHeader (100, 50, 500, hh, "Test-Header", NEUTRINO_ICON_INFO, CComponentsHeader::CC_BTN_HELP | CComponentsHeader::CC_BTN_EXIT | CComponentsHeader::CC_BTN_MENU); + header->addHeaderButton(NEUTRINO_ICON_BUTTON_RED); + } +// else //For existing instances it's recommended +// //to remove old button icons before add new buttons, otherwise icons will be appended. +// header->removeHeaderButtons(); + +// example to manipulate header items +// header->setFrameThickness(5); +// header->setColorFrame(COL_WHITE); +// header->setCornerType(CORNER_TOP); + +// change text of header + header->setHeaderText("Test"); + +// add any other button icon +// header->addHeaderButton(NEUTRINO_ICON_BUTTON_BLUE); +// header->addHeaderButton(NEUTRINO_ICON_BUTTON_GREEN); + +// example to replace the text item with an image item +// get text x position +// int logo_x = header->getCCItem(CComponentsHeader::CC_HEADER_ITEM_TEXT)->getXPos(); +// remove text item +// header->removeCCItem(CComponentsHeader::CC_HEADER_ITEM_TEXT); //then remove text item +// create picture object with the last x position of text +// CComponentsPicture *logo = new CComponentsPicture(logo_x, 0, 100, g_Font[SNeutrinoSettings::FONT_TYPE_MENU_TITLE]->getHeight(), "/share/tuxbox/neutrino/icons/hint_tvmode.png"); +// set the transparent background for picture item +// logo->doPaintBg(false); +// insert the ne object +// header->insertCCItem(1, logo); //replace text with logo + + + if (!header->isPainted()) + header->paint(); + else + header->hide(); + return res; + } + else if (actionKey == "iconform"){ + if (iconform == NULL) + iconform = new CComponentsIconForm(); + iconform->setColorBody(COL_LIGHT_GRAY); + iconform->setDimensionsAll(100, 100, 480, 60); + iconform->setFrameThickness(2); + iconform->setColorFrame(COL_WHITE); + iconform->setIconOffset(5); + iconform->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT); + //For existing instances it's recommended + //to remove old items before add new icons, otherwise icons will be appended. + iconform->removeAllIcons(); + + //you can... + //add icons step by step + iconform->addIcon(NEUTRINO_ICON_INFO); + iconform->addIcon(NEUTRINO_ICON_INFO); + iconform->addIcon(NEUTRINO_ICON_HINT_MEDIA); + //...or + //add icons with vector + std::vector v_icons; + v_icons.push_back(NEUTRINO_ICON_HINT_VIDEO); + v_icons.push_back(NEUTRINO_ICON_HINT_AUDIO); + iconform->addIcon(v_icons); + + //insert any icon, here as first (index = 0...n) + iconform->insertIcon(0, NEUTRINO_ICON_HINT_APLAY); +// iconform->setIconAlign(CComponentsIconForm::CC_ICONS_FRM_ALIGN_RIGHT); + + if (iconform->isPainted()) + iconform->hide(); + else{ + iconform->paint(); + } + return res; + } + else if (actionKey == "window"){ + if (window == NULL){ + window = new CComponentsWindow(); + window->setWindowCaption("|.....................|"); + window->setDimensionsAll(50, 50, 800, 480); + window->setWindowIcon(NEUTRINO_ICON_INFO); + } + else{ +// window->setDimensionsAll(50, 50, 800, 480); + window->setWindowIcon(NEUTRINO_ICON_LOCK); + window->setWindowCaption("Test"); + } + + if (!window->isPainted()) + window->paint(); + else + window->hide(); + + return res; + } + + showTestMenu(); - + return res; } @@ -322,49 +520,81 @@ int CTestMenu::exec(CMenuTarget* parent, const std::string &actionKey) void CTestMenu::showTestMenu() { unsigned int system_rev = cs_get_revision(); - + //init char rev[255]; sprintf(rev, "Test menu, System revision %d %s", system_rev, system_rev == 0 ? "WARNING - INVALID" : ""); - CMenuWidget * TestMenu = new CMenuWidget(rev /*"Test menu"*/); - TestMenu->setSelected(selected); - TestMenu->addIntroItems(); - TestMenu->addItem(new CMenuForwarderNonLocalized("VFD", true, NULL, this, "vfd")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Network", true, NULL, this, "network")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Smartcard 1", true, NULL, this, "card0")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Smartcard 2", true, NULL, this, "card1")); - TestMenu->addItem(new CMenuForwarderNonLocalized("HDD", true, NULL, this, "hdd")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Buttons", true, NULL, this, "buttons")); + CMenuWidget w_test(rev /*"Test menu"*/, NEUTRINO_ICON_INFO, width); + w_test.addIntroItems(); + + //hardware + CMenuWidget * w_hw = new CMenuWidget("Hardware Test", NEUTRINO_ICON_INFO, width); + w_test.addItem(new CMenuForwarderNonLocalized(w_hw->getName().c_str(), true, NULL, w_hw)); + showHWTests(w_hw); + + //buttons + w_test.addItem(new CMenuForwarderNonLocalized("Buttons", true, NULL, this, "buttons")); + + //components + CMenuWidget * w_cc = new CMenuWidget("OSD-Components Demo", NEUTRINO_ICON_INFO, width); + w_test.addItem(new CMenuForwarderNonLocalized(w_cc->getName().c_str(), true, NULL, w_cc)); + showCCTests(w_cc); + //exit + w_test.exec(NULL, ""); + selected = w_test.getSelected(); +} + +void CTestMenu::showCCTests(CMenuWidget *widget) +{ + widget->setSelected(selected); + widget->addIntroItems(); + widget->addItem(new CMenuForwarderNonLocalized("Circle", true, NULL, this, "circle")); + widget->addItem(new CMenuForwarderNonLocalized("Square", true, NULL, this, "square")); + widget->addItem(new CMenuForwarderNonLocalized("Picture", true, NULL, this, "picture")); + widget->addItem(new CMenuForwarderNonLocalized("Form", true, NULL, this, "form")); + widget->addItem(new CMenuForwarderNonLocalized("Text", true, NULL, this, "text")); + widget->addItem(new CMenuForwarderNonLocalized("Header", true, NULL, this, "header")); + widget->addItem(new CMenuForwarderNonLocalized("Icon-Form", true, NULL, this, "iconform")); + widget->addItem(new CMenuForwarderNonLocalized("Window", true, NULL, this, "window")); +} + +void CTestMenu::showHWTests(CMenuWidget *widget) +{ + widget->setSelected(selected); + widget->addIntroItems(); + widget->addItem(new CMenuForwarderNonLocalized("VFD", true, NULL, this, "vfd")); + widget->addItem(new CMenuForwarderNonLocalized("Network", true, NULL, this, "network")); + widget->addItem(new CMenuForwarderNonLocalized("Smartcard 1", true, NULL, this, "card0")); + widget->addItem(new CMenuForwarderNonLocalized("Smartcard 2", true, NULL, this, "card1")); + widget->addItem(new CMenuForwarderNonLocalized("HDD", true, NULL, this, "hdd")); + CFEManager::getInstance()->setMode(CFEManager::FE_MODE_ALONE); - + CServiceManager::getInstance()->InitSatPosition(130, NULL, true); CServiceManager::getInstance()->InitSatPosition(192, NULL, true); - + satellite_map_t satmap = CServiceManager::getInstance()->SatelliteList(); satmap[130].configured = 1; - + CFrontend * frontend = CFEManager::getInstance()->getFE(0); frontend->setSatellites(satmap); - + int count = CFEManager::getInstance()->getFrontendCount(); if (frontend->getInfo()->type == FE_QPSK) { - TestMenu->addItem(new CMenuForwarderNonLocalized("Tuner 1: Scan 12538000", true, NULL, this, "scan1")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Tuner 1: 22 Khz ON", true, NULL, this, "22kon1")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Tuner 1: 22 Khz OFF", true, NULL, this, "22koff1")); + widget->addItem(new CMenuForwarderNonLocalized("Tuner 1: Scan 12538000", true, NULL, this, "scan1")); + widget->addItem(new CMenuForwarderNonLocalized("Tuner 1: 22 Khz ON", true, NULL, this, "22kon1")); + widget->addItem(new CMenuForwarderNonLocalized("Tuner 1: 22 Khz OFF", true, NULL, this, "22koff1")); if(count > 1) { satmap = CServiceManager::getInstance()->SatelliteList(); satmap[192].configured = 1; frontend = CFEManager::getInstance()->getFE(1); frontend->setSatellites(satmap); - - TestMenu->addItem(new CMenuForwarderNonLocalized("Tuner 2: Scan 12538000", true, NULL, this, "scan2")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Tuner 2: 22 Khz ON", true, NULL, this, "22kon2")); - TestMenu->addItem(new CMenuForwarderNonLocalized("Tuner 2: 22 Khz OFF", true, NULL, this, "22koff2")); + + widget->addItem(new CMenuForwarderNonLocalized("Tuner 2: Scan 12538000", true, NULL, this, "scan2")); + widget->addItem(new CMenuForwarderNonLocalized("Tuner 2: 22 Khz ON", true, NULL, this, "22kon2")); + widget->addItem(new CMenuForwarderNonLocalized("Tuner 2: 22 Khz OFF", true, NULL, this, "22koff2")); } } - TestMenu->exec(NULL, ""); - selected = TestMenu->getSelected(); - delete TestMenu; } #endif diff --git a/src/gui/test_menu.h b/src/gui/test_menu.h index b7f482bdc..9b6bf40f4 100644 --- a/src/gui/test_menu.h +++ b/src/gui/test_menu.h @@ -31,17 +31,27 @@ #include #include - -//#define TEST_MENU +#include + #define TEST_MENU #include class CTestMenu : public CMenuTarget { private: + CComponentsShapeCircle * circle; + CComponentsShapeSquare* sq; + CComponentsPicture* pic; + CComponentsForm *form; + CComponentsText *txt; + CComponentsHeader *header; + CComponentsIconForm *iconform; + CComponentsWindow *window; int width, selected; void showTestMenu(); + void showHWTests(CMenuWidget *widget); + void showCCTests(CMenuWidget *widget); public: CTestMenu(); diff --git a/src/gui/update_ext.cpp b/src/gui/update_ext.cpp index 2b7d67824..cc5920007 100644 --- a/src/gui/update_ext.cpp +++ b/src/gui/update_ext.cpp @@ -9,18 +9,18 @@ License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ diff --git a/src/gui/update_ext.h b/src/gui/update_ext.h index 577c484c7..9a81b3d8c 100644 --- a/src/gui/update_ext.h +++ b/src/gui/update_ext.h @@ -9,18 +9,18 @@ License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ diff --git a/src/gui/update_menue.cpp b/src/gui/update_menue.cpp index c93a40ec5..55fe6ce46 100644 --- a/src/gui/update_menue.cpp +++ b/src/gui/update_menue.cpp @@ -24,7 +24,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Library General Public + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/update_menue.h b/src/gui/update_menue.h index 8948a49f6..5daf34f38 100644 --- a/src/gui/update_menue.h +++ b/src/gui/update_menue.h @@ -23,7 +23,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Library General Public + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/update_settings.cpp b/src/gui/update_settings.cpp index fecfa1912..7c7742194 100644 --- a/src/gui/update_settings.cpp +++ b/src/gui/update_settings.cpp @@ -22,7 +22,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Library General Public + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/update_settings.h b/src/gui/update_settings.h index c58676774..65ffbb9db 100644 --- a/src/gui/update_settings.h +++ b/src/gui/update_settings.h @@ -22,7 +22,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - You should have received a copy of the GNU Library General Public + You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/upnpbrowser.cpp b/src/gui/upnpbrowser.cpp index 225a1d9dd..c6df7735f 100644 --- a/src/gui/upnpbrowser.cpp +++ b/src/gui/upnpbrowser.cpp @@ -69,11 +69,6 @@ #include extern cVideo * videoDecoder; -#ifdef ConnectLineBox_Width -#undef ConnectLineBox_Width -#endif -#define ConnectLineBox_Width 15 - const struct button_label RescanButton = {NEUTRINO_ICON_BUTTON_BLUE , LOCALE_UPNPBROWSER_RESCAN}; const struct button_label BrowseButtons[4] = { @@ -130,8 +125,8 @@ int CUpnpBrowserGui::exec(CMenuTarget* parent, const std::string & /*actionKey*/ #endif m_LastMode=(CNeutrinoApp::getInstance()->getLastMode()); - m_width=(g_settings.screen_EndX - g_settings.screen_StartX) - 2*ConnectLineBox_Width; - m_height = (g_settings.screen_EndY - g_settings.screen_StartY); + m_width = m_frameBuffer->getScreenWidthRel(); + m_height = m_frameBuffer->getScreenHeightRel(); m_sheight = g_Font[SNeutrinoSettings::FONT_TYPE_INFOBAR_SMALL]->getHeight(); m_buttonHeight = std::min(25, m_sheight); diff --git a/src/gui/user_menue.cpp b/src/gui/user_menue.cpp index 88bc6c5f4..248d39931 100644 --- a/src/gui/user_menue.cpp +++ b/src/gui/user_menue.cpp @@ -14,18 +14,18 @@ License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/user_menue.h b/src/gui/user_menue.h index 05bec067e..701a25af7 100644 --- a/src/gui/user_menue.h +++ b/src/gui/user_menue.h @@ -12,18 +12,18 @@ License: GPL - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Library General Public + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. - This library is distributed in the hope that it will be useful, + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. - You should have received a copy of the GNU Library General Public - License along with this library; if not, write to the + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. diff --git a/src/gui/widget/menue.cpp b/src/gui/widget/menue.cpp index b7ce39f55..ee0feadb2 100644 --- a/src/gui/widget/menue.cpp +++ b/src/gui/widget/menue.cpp @@ -42,8 +42,6 @@ #include -#define ConnectLineBox_Width 16 - /* the following generic menu items are integrated into multiple menus at the same time */ CMenuSeparator CGenericMenuSeparator; CMenuSeparator CGenericMenuSeparatorLine(CMenuSeparator::LINE); @@ -324,9 +322,9 @@ void CMenuWidget::Init(const std::string & Icon, const int mwidth, const mn_widg mglobal = CMenuGlobal::getInstance(); //create CMenuGlobal instance only here frameBuffer = CFrameBuffer::getInstance(); iconfile = Icon; - details_line = NULL; - info_box = NULL; - + details_line = new CComponentsDetailLine(); + info_box = new CComponentsInfoBox(); + //handle select values if(w_index > MN_WIDGET_ID_MAX){ //error @@ -820,13 +818,14 @@ void CMenuWidget::calcSize() } hint_height = 0; if(g_settings.show_menu_hints && has_hints) { + hint_height = 60; //TODO: rework calculation of hint_height int fheight = g_Font[SNeutrinoSettings::FONT_TYPE_MENU_HINT]->getHeight(); - hint_height = 10 + 2*fheight; + int h_tmp = 16 + 2*fheight; /* assuming all hint icons has the same size ! */ int iw, ih; frameBuffer->getIconSize(NEUTRINO_ICON_HINT_TVMODE, &iw, &ih); - if(hint_height < (ih+10)) - hint_height = ih+10; + h_tmp = std::max(h_tmp, ih+10); + hint_height = std::max(h_tmp, hint_height); } /* set the max height to 9/10 of usable screen height debatable, if the callers need a possibility to set this */ @@ -1089,16 +1088,16 @@ void CMenuWidget::paintHint(int pos) { if (!g_settings.show_menu_hints) return; - + if (pos < 0 && !hint_painted) return; - + int rad = RADIUS_LARGE; int xpos = x - ConnectLineBox_Width; int ypos2 = y + height + rad + SHADOW_OFFSET + INFO_BOX_Y_OFFSET; int iwidth = width+sb_width; - +#if 0 if (hint_painted) { /* clear detailsline line */ // TODO CComponents::hide with param restore ? or auto (if it have saved screens) ? @@ -1118,134 +1117,86 @@ void CMenuWidget::paintHint(int pos) } } hint_painted = false; +#endif + if (hint_painted) { + /* clear detailsline line */ + if (details_line) + details_line->hide(); + /* clear info box */ + if ((info_box) && (pos == -1)) + info_box->hide(true); + hint_painted = false; } if (pos < 0) return; - + CMenuItem* item = items[pos]; -//printf("paintHint: icon %s text %s\n", item->hintIcon.c_str(), g_Locale->getText(item->hint)); - + if (item->hintIcon.empty() && item->hint == NONEXISTANT_LOCALE) { +#if 0 if (info_box != NULL) { if (savescreen) +#endif + if (info_box) + info_box->hide(false); +#if 0 info_box->restore(); else info_box->hide(); } +#endif return; } - - hint_painted = true; - + + if (item->hint == NONEXISTANT_LOCALE) + return; + int iheight = item->getHeight(); - - //details line + + //init details line and infobox dimensions int ypos1 = item->getYPosition(); int ypos1a = ypos1 + (iheight/2)-2; int ypos2a = ypos2 + (hint_height/2) - INFO_BOX_Y_OFFSET; int markh = hint_height > rad*2 ? hint_height - rad*2 : hint_height; int imarkh = iheight/2+1; - if (details_line == NULL){ - details_line = new CComponentsDetailLine(xpos, ypos1a, ypos2a, imarkh, markh); - }else{ + //init details line + if (details_line){ details_line->setXPos(xpos); details_line->setYPos(ypos1a); details_line->setYPosDown(ypos2a); - details_line->setHMarkDown(markh); - details_line->setColor(COL_MENUCONTENT_PLUS_6, COL_MENUCONTENTDARK_PLUS_0); + details_line->setHMarkTop(imarkh); + details_line->setHMarkDown(markh); + details_line->syncSysColors(); } +#if 0 details_line->paint(savescreen); +#endif - if (info_box == NULL) - info_box = new CComponentsInfoBox(x, ypos2, iwidth, hint_height); - else { - info_box->setXPos(x); - info_box->setYPos(ypos2); - info_box->setWidth(iwidth); - info_box->setColor(COL_MENUCONTENT_PLUS_6, COL_MENUCONTENTDARK_PLUS_0, COL_MENUCONTENTDARK_PLUS_0); + //init infobox + std::string str = g_Locale->getText(item->hint); + if (info_box){ + info_box->setDimensionsAll(x, ypos2, iwidth, hint_height); + info_box->setFrameThickness(2); + info_box->removeLineBreaks(str); + info_box->setText(str, CTextBox::AUTO_WIDTH, g_Font[SNeutrinoSettings::FONT_TYPE_MENU_HINT]); + info_box->setCornerRadius(RADIUS_LARGE); + info_box->syncSysColors(); + info_box->setShadowOnOff(CC_SHADOW_ON); + info_box->setPicture(item->hintIcon); } +#if 0 /* force full paint - menu-over i.e. option chooser with pulldown can overwrite */ info_box->paint(savescreen, true); +#endif - int offset = 10; - if (!item->hintIcon.empty()) { - int iw, ih; - frameBuffer->getIconSize(item->hintIcon.c_str(), &iw, &ih); - if (iw && ih) { - int ix = x + offset; - int iy = ypos2 + (hint_height - ih)/2; - frameBuffer->paintIcon(item->hintIcon.c_str(), ix, iy); - offset += iw + 10; - } - } - if (item->hint == NONEXISTANT_LOCALE) - return; - - int HintFont = SNeutrinoSettings::FONT_TYPE_MENU_HINT; - int fheight = g_Font[HintFont]->getHeight(); - - std::string str1, str2; - std::string str = g_Locale->getText(item->hint); - std::string::size_type spos = str.find_first_of("\n"); - if (spos != std::string::npos) { - str1 = str.substr(0, spos); - str2 = str.substr(spos+1); - } - else - str1 = str; - - if ((!str1.empty()) || (!str1.empty())) { - int wBox = iwidth - 6 - offset; - int wStr1 = 0, wStr2 = 0; - if (!str1.empty()) - wStr1 = g_Font[HintFont]->getRenderWidth(str1); - if (!str2.empty()) - wStr2 = g_Font[HintFont]->getRenderWidth(str2); - if ((wStr1 > wBox) || (wStr2 > wBox)) { - str = g_Locale->getText(item->hint); - // replace "\n" with " " - spos = str.find_first_of("\n"); - if (spos != std::string::npos) - str.replace(spos, 1, " "); - spos = str.length(); - if (spos >= 1) { - std::string BreakChars = "+-/"; - str1 = str; - wStr1 = g_Font[HintFont]->getRenderWidth(str1); - int count = 0; - std::string bChar; - while (wStr1 > wBox) { - spos = str1.find_last_of(BreakChars + " "); - if (spos != std::string::npos) { - str1 = str1.substr(0, spos+1); - // Last delimiter remember if it's not a whitespace - size_t len = str1.length(); - size_t spos2 = str1.find_last_of(BreakChars); - if (len == spos2+1) - bChar = str1.substr(spos2, spos2+1); - else - bChar = ""; - // Remove last delimiter - str1 = str1.substr(0, spos); - } - // Width of string with delimiter - wStr1 = g_Font[HintFont]->getRenderWidth(str1 + bChar); - count++; - if (count > 20) - break; - } - // Last delimiter append again - str1 += bChar; - str2 = str.substr(spos+1); - } - } - ypos2 += (hint_height-fheight*2)/2; - if (!str1.empty()) - g_Font[HintFont]->RenderString(x+offset, ypos2+fheight, wBox, str1, COL_MENUCONTENT, 0, true); // UTF-8 - if (!str2.empty()) - g_Font[HintFont]->RenderString(x+offset, ypos2+fheight*2, wBox, str2, COL_MENUCONTENT, 0, true); // UTF-8 - } + + //paint result + details_line->paint(); + info_box->paint(); + + hint_painted = true; + } //------------------------------------------------------------------------------------------------------------------------------- diff --git a/src/gui/widget/menue.h b/src/gui/widget/menue.h index d5d33db33..8e43475f5 100644 --- a/src/gui/widget/menue.h +++ b/src/gui/widget/menue.h @@ -425,6 +425,7 @@ class CMenuWidget : public CMenuTarget CMenuGlobal *mglobal; CComponentsDetailLine *details_line; CComponentsInfoBox *info_box; + int hint_height; protected: std::string nameString; @@ -448,7 +449,6 @@ class CMenuWidget : public CMenuTarget fb_pixel_t *background; int full_width, full_height; bool savescreen; - int hint_height; bool has_hints; // is any items has hints bool hint_painted; // is hint painted diff --git a/src/gui/widget/textbox.cpp b/src/gui/widget/textbox.cpp index 61c8754b4..cc2223023 100644 --- a/src/gui/widget/textbox.cpp +++ b/src/gui/widget/textbox.cpp @@ -556,8 +556,10 @@ void CTextBox::scrollPageDown(const int pages) { m_nCurrentPage = m_nNrOfPages - 1; } + int oldCurrentLine = m_nCurrentLine; m_nCurrentLine = m_nCurrentPage * m_nLinesPerPage; - refresh(); + if (oldCurrentLine != m_nCurrentLine) + refresh(); } void CTextBox::scrollPageUp(const int pages) @@ -577,8 +579,10 @@ void CTextBox::scrollPageUp(const int pages) { m_nCurrentPage = 0; } + int oldCurrentLine = m_nCurrentLine; m_nCurrentLine = m_nCurrentPage * m_nLinesPerPage; - refresh(); + if (oldCurrentLine != m_nCurrentLine) + refresh(); } void CTextBox::refresh(void) @@ -642,7 +646,9 @@ void CTextBox::hide (void) if(frameBuffer == NULL) return; - frameBuffer->paintBackgroundBoxRel(m_cFrame.iX, m_cFrame.iY, m_cFrame.iWidth, m_cFrame.iHeight); + if (m_nPaintBackground) + frameBuffer->paintBackgroundBoxRel(m_cFrame.iX, m_cFrame.iY, m_cFrame.iWidth, m_cFrame.iHeight); frameBuffer->blit(); + frameBuffer = NULL; } diff --git a/src/gui/widget/textbox.h b/src/gui/widget/textbox.h index b7e8c1166..b3a34971e 100644 --- a/src/gui/widget/textbox.h +++ b/src/gui/widget/textbox.h @@ -72,7 +72,7 @@ class CBox public: /* Constructor */ - inline CBox(){iY = 0; iX = 0; iWidth = 0;iHeight = 0;}; + inline CBox(){iX=0; iY=0; iWidth=0; iHeight=0;}; inline CBox( const int _iX, const int _iY, const int _iWidth, const int _iHeight){iX=_iX; iY=_iY; iWidth=_iWidth; iHeight=_iHeight;}; inline ~CBox(){;}; /* Functions */ diff --git a/src/neutrino.cpp b/src/neutrino.cpp index bc54c9a04..140de17e1 100644 --- a/src/neutrino.cpp +++ b/src/neutrino.cpp @@ -618,6 +618,7 @@ int CNeutrinoApp::loadSetup(const char * fname) g_settings.shutdown_timer_record_type = configfile.getBool("shutdown_timer_record_type" , false); g_settings.recording_stream_vtxt_pid = configfile.getBool("recordingmenu.stream_vtxt_pid" , false); + g_settings.recording_stream_subtitle_pids = configfile.getBool("recordingmenu.stream_subtitle_pids", false); g_settings.recording_stream_pmt_pid = configfile.getBool("recordingmenu.stream_pmt_pid" , false); g_settings.recording_choose_direct_rec_dir = configfile.getInt32( "recording_choose_direct_rec_dir", 0 ); g_settings.recording_epg_for_filename = configfile.getBool("recording_epg_for_filename" , true); @@ -683,7 +684,7 @@ int CNeutrinoApp::loadSetup(const char * fname) g_settings.screen_height = configfile.getInt32("screen_height", 0); g_settings.bigFonts = configfile.getInt32("bigFonts", 0); - g_settings.big_windows = configfile.getInt32("big_windows", 0); + g_settings.big_windows = configfile.getInt32("big_windows", 1); g_settings.remote_control_hardware = configfile.getInt32( "remote_control_hardware", CRCInput::RC_HW_COOLSTREAM); g_settings.audiochannel_up_down_enable = configfile.getBool("audiochannel_up_down_enable", false); @@ -1039,17 +1040,18 @@ void CNeutrinoApp::saveSetup(const char * fname) configfile.setInt32 ("recording_type", g_settings.recording_type); configfile.setBool ("recording_stopsectionsd" , g_settings.recording_stopsectionsd ); - configfile.setInt32 ("recording_audio_pids_default" , g_settings.recording_audio_pids_default); + configfile.setInt32 ("recording_audio_pids_default" , g_settings.recording_audio_pids_default ); configfile.setBool ("recording_zap_on_announce" , g_settings.recording_zap_on_announce ); - configfile.setBool ("shutdown_timer_record_type" , g_settings.shutdown_timer_record_type ); + configfile.setBool ("shutdown_timer_record_type" , g_settings.shutdown_timer_record_type ); configfile.setBool ("recordingmenu.stream_vtxt_pid" , g_settings.recording_stream_vtxt_pid ); - configfile.setBool ("recordingmenu.stream_pmt_pid" , g_settings.recording_stream_pmt_pid ); + configfile.setBool ("recordingmenu.stream_subtitle_pids" , g_settings.recording_stream_subtitle_pids ); + configfile.setBool ("recordingmenu.stream_pmt_pid" , g_settings.recording_stream_pmt_pid ); configfile.setInt32 ("recording_choose_direct_rec_dir" , g_settings.recording_choose_direct_rec_dir); configfile.setBool ("recording_epg_for_filename" , g_settings.recording_epg_for_filename ); configfile.setBool ("recording_epg_for_end" , g_settings.recording_epg_for_end ); - configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir ); - configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning ); + configfile.setBool ("recording_save_in_channeldir" , g_settings.recording_save_in_channeldir ); + configfile.setBool ("recording_slow_warning" , g_settings.recording_slow_warning ); // default plugin for movieplayer configfile.setString ( "movieplayer_plugin", g_settings.movieplayer_plugin ); @@ -1677,7 +1679,7 @@ void CNeutrinoApp::InitZapper() void CNeutrinoApp::setupRecordingDevice(void) { CRecordManager::getInstance()->SetDirectory(g_settings.network_nfs_recordingdir); - CRecordManager::getInstance()->Config(g_settings.recording_stopsectionsd, g_settings.recording_stream_vtxt_pid, g_settings.recording_stream_pmt_pid); + CRecordManager::getInstance()->Config(g_settings.recording_stopsectionsd, g_settings.recording_stream_vtxt_pid, g_settings.recording_stream_pmt_pid, g_settings.recording_stream_subtitle_pids); } static void CSSendMessage(uint32_t msg, uint32_t data) diff --git a/src/neutrino_menue.h b/src/neutrino_menue.h index 6677e080a..2f516cdf7 100644 --- a/src/neutrino_menue.h +++ b/src/neutrino_menue.h @@ -79,6 +79,7 @@ enum MN_WIDGET_ID MN_WIDGET_ID_RECORDSETUP_TIMESHIFT, MN_WIDGET_ID_RECORDSETUP_TIMERSETTINGS, MN_WIDGET_ID_RECORDSETUP_AUDIOSETTINGS, + MN_WIDGET_ID_RECORDSETUP_DATASETTINGS, //vfd setup MN_WIDGET_ID_VFDSETUP, diff --git a/src/system/locals.h b/src/system/locals.h index 730ef7264..8b6813a5c 100644 --- a/src/system/locals.h +++ b/src/system/locals.h @@ -970,6 +970,9 @@ typedef enum LOCALE_MENU_HINT_RECORD_APIDS, LOCALE_MENU_HINT_RECORD_APPLY, LOCALE_MENU_HINT_RECORD_CHANDIR, + LOCALE_MENU_HINT_RECORD_DATA, + LOCALE_MENU_HINT_RECORD_DATA_DVBSUB, + LOCALE_MENU_HINT_RECORD_DATA_VTXT, LOCALE_MENU_HINT_RECORD_DIR, LOCALE_MENU_HINT_RECORD_END, LOCALE_MENU_HINT_RECORD_SLOW_WARN, @@ -1543,7 +1546,9 @@ typedef enum LOCALE_RECORDINGMENU_APIDS_AC3, LOCALE_RECORDINGMENU_APIDS_ALT, LOCALE_RECORDINGMENU_APIDS_STD, + LOCALE_RECORDINGMENU_DATA_PIDS, LOCALE_RECORDINGMENU_DEFDIR, + LOCALE_RECORDINGMENU_DVBSUB_PIDS, LOCALE_RECORDINGMENU_END_OF_RECORDING_EPG, LOCALE_RECORDINGMENU_END_OF_RECORDING_MAX, LOCALE_RECORDINGMENU_END_OF_RECORDING_NAME, @@ -1565,6 +1570,7 @@ typedef enum LOCALE_RECORDINGMENU_TIMESHIFT, LOCALE_RECORDINGMENU_TSDIR, LOCALE_RECORDINGMENU_VCR, + LOCALE_RECORDINGMENU_VTXT_PID, LOCALE_RECORDINGMENU_ZAP_ON_ANNOUNCE, LOCALE_RECORDTIMER_ANNOUNCE, LOCALE_REPEATBLOCKER_HINT_1, diff --git a/src/system/locals_intern.h b/src/system/locals_intern.h index 42eca2b52..b07238fd6 100644 --- a/src/system/locals_intern.h +++ b/src/system/locals_intern.h @@ -970,6 +970,9 @@ const char * locale_real_names[] = "menu.hint_record_apids", "menu.hint_record_apply", "menu.hint_record_chandir", + "menu.hint_record_data", + "menu.hint_record_data_dvbsub", + "menu.hint_record_data_vtxt", "menu.hint_record_dir", "menu.hint_record_end", "menu.hint_record_slow_warn", @@ -1543,7 +1546,9 @@ const char * locale_real_names[] = "recordingmenu.apids_ac3", "recordingmenu.apids_alt", "recordingmenu.apids_std", + "recordingmenu.data_pids", "recordingmenu.defdir", + "recordingmenu.dvbsub_pids", "recordingmenu.end_of_recording_epg", "recordingmenu.end_of_recording_max", "recordingmenu.end_of_recording_name", @@ -1565,6 +1570,7 @@ const char * locale_real_names[] = "recordingmenu.timeshift", "recordingmenu.tsdir", "recordingmenu.vcr", + "recordingmenu.vtxt_pid", "recordingmenu.zap_on_announce", "recordtimer.announce", "repeatblocker.hint_1", diff --git a/src/system/settings.h b/src/system/settings.h index 451b62f97..787e64b9d 100644 --- a/src/system/settings.h +++ b/src/system/settings.h @@ -329,14 +329,15 @@ struct SNeutrinoSettings int recording_audio_pids_std; int recording_audio_pids_alt; int recording_audio_pids_ac3; - int recording_stream_vtxt_pid; - int recording_stream_pmt_pid; + int recording_stream_vtxt_pid; + int recording_stream_subtitle_pids; + int recording_stream_pmt_pid; int recording_choose_direct_rec_dir; int recording_epg_for_filename; int recording_epg_for_end; int recording_save_in_channeldir; - int recording_zap_on_announce; - int recording_slow_warning; + int recording_zap_on_announce; + int recording_slow_warning; int shutdown_timer_record_type; int filesystem_is_utf8;