Guest User

"xmlpp::Element::dump"

a guest
Apr 5th, 2010
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.50 KB | None | 0 0
  1. #ifndef TVGUIDE_UI_H
  2. #define TVGUIDE_UI_H
  3.  
  4. #include <glibmm/refptr.h>
  5.  
  6. #include <gtkmm/sizegroup.h>
  7. #include <gtkmm/dialog.h>
  8. #include <gtkmm/enums.h>
  9. #include <gtkmm/buttonbox.h>
  10.  
  11. #include <hildonmm/stackable-window.h>
  12. #include <hildonmm/pannable-area.h>
  13. #include <hildonmm/program.h>
  14. #include <hildonmm/note.h>
  15. #include <hildonmm/banner.h>
  16.  
  17. #include <string>
  18. #include <vector>
  19.  
  20. #include "tvguide_options.h"
  21. #include "tvguide_tools.h"
  22.  
  23. #include <ui/channelselector.h>
  24. #include <ui/channellist.h>
  25. #include <ui/appmenu.h>
  26. #include <ui/xmltvsetup.h>
  27.  
  28. #ifndef XML_DECODER
  29.     using namespace tvtid;
  30. #else
  31.     using namespace xmltv;
  32. #endif
  33. using namespace std;
  34. using namespace Glib;
  35.  
  36. #include "feed.h"
  37.  
  38. #ifdef  __cplusplus
  39. extern "C" {
  40. #endif
  41.  
  42.     #define MAX_PROGRAMS_LISTED 4
  43.     #define DIMENSION_X 780
  44.     #define DIMENSION_Y 420
  45.  
  46.     #define STAR_IMAGE "/usr/share/pixmaps/debian-logo.sr/share/pixmaps/debian-logo.png"
  47.     #define PROGRAM_MAX_LENGTH 8
  48.  
  49.     // Globally shared options
  50.  
  51. #ifdef  __cplusplus
  52. }
  53. #endif
  54.  
  55. class UI : public Hildon::StackableWindow
  56. {
  57.  
  58.     Feed *g_feed;
  59.     int nChannels;
  60.     int channels_pr_row;
  61.     void apply_options();
  62.     void addChannel(Channel *pChannel);
  63.     void setupCheck();
  64.     bool timeoutCheck();
  65.  
  66.  
  67. public:
  68.     g_signal_t *internal_sig_set;
  69.     UI();
  70.     virtual ~UI();
  71. protected:
  72.     UI_ChannelSelector *channelsetup;
  73.  
  74.     typedef Gtk::HBox UI_ChannelRow;
  75.     UI_AppMenu *menu;
  76.     Hildon::PannableArea pannable1; // =Hildon::PannableArea()
  77.     Gtk::VButtonBox navbox;
  78.     Gtk::VBox listbox;
  79.     Gtk::HBox *horibox;
  80. };
  81. #endif /* TVGUDE_UI_H */
  82.  
  83. #include <sys/stat.h>
  84. #include <time.h>
  85. #include <stdlib.h>
  86. #include <string>
  87. #include <vector>
  88. #include <iostream>
  89.  
  90. #include "tvguide_ui.h"
  91.  
  92. #include "DebugLog.hpp"
  93. //#define DEBUG_METHOD() {}
  94. //#define DEBUG_VALUE_OF(x) { }
  95.  
  96. static int CHANNELS_PR_ROW = 0;
  97.  
  98. /* Window stacks */
  99.  
  100. UI::~UI()
  101. {
  102.     delete g_feed;
  103. }
  104. UI::UI() :
  105.     nChannels(0),
  106.     horibox(manage(new UI_ChannelRow()))
  107. {
  108.     bool sig_OPTION;
  109.     DEBUG_METHOD();
  110.     apply_options();
  111.     menu = new UI_AppMenu();
  112.     g_feed = new Feed();
  113.  
  114.     internal_sig_set = (g_signal_t *) malloc (sizeof(g_signal_t));
  115.     internal_sig_set->sig_FEED = false;
  116.     internal_sig_set->sig_OPTION = false;
  117.     internal_sig_set->sig_SETUP = false;
  118.  
  119.     TVGuide::Options::shm_set("g_signal", internal_sig_set);
  120.  
  121.     Channel *pChannel;
  122.     int added = 0, max = TVGuide::Options::get_int("channels_pr_page", 999);
  123.     for(int i = 0; i < g_feed->channels.size() ; i++) {
  124.         pChannel = &(g_feed->channels.at(i));
  125.         if(pChannel->subscribed && ++added)
  126.             addChannel(pChannel);
  127.         if(added >= max) break; // issue new page
  128.     }
  129.     // clean json-parser structures, keeping allocated cobjects
  130.     g_feed->cleanup();
  131.  
  132.     Hildon::Program::get_instance()->set_common_app_menu(*menu);
  133.     add( pannable1 );
  134.     //listbox.pack_start(*horibox);
  135.     pannable1.add(listbox);
  136.     show_all_children();
  137.     Glib::signal_idle().connect_once(sigc::mem_fun(*this, &UI::setupCheck));
  138.     Glib::signal_timeout().connect(sigc::mem_fun(*this, &UI::timeoutCheck), 4000);
  139. }
  140. void UI::apply_options()
  141. {
  142.     DEBUG_METHOD();
  143. //  if(!TVGuide::Options::read_dict("/home/user/.tvguide")) TVGuide::Options::__assert();
  144.     if(!TVGuide::Options::read_dict("/home/mschr/.tvguide"))
  145.         TVGuide::Options::__assert("/home/mschr/.tvguide");
  146.  
  147.     TVGuide::Options::shm_set("g_feed", (void*) g_feed);
  148.     CHANNELS_PR_ROW = TVGuide::Options::get_int("channels_pr_row", 3);
  149.  
  150.     std::string cache_dir = TVGuide::Options::get("cache_dir", "");
  151.     if(!cache_dir.empty()) {
  152.         std::vector<string> directories;
  153.         strsplit(cache_dir, "/", directories);
  154.         for(int i = 0; i < directories.size(); i++) {
  155.             if(! file_exists(directories[i].c_str()) ) {
  156.                 if(mkdir(directories[i].c_str(), S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) == -1) {
  157.                     std::cerr << "TVGUIDE: WARNING, failed creating " << directories[i] << std::endl;
  158.                     break;
  159.                 }
  160.             }
  161.         }
  162.     }
  163. }
  164. bool UI::timeoutCheck() {
  165.  
  166.  
  167. DEBUG_METHOD();
  168.     bool feed_updated = internal_sig_set->sig_FEED;
  169.     bool opt_changed = internal_sig_set->sig_OPTION;
  170.     bool setup_needed = internal_sig_set->sig_SETUP;
  171.     internal_sig_set->sig_FEED = false;
  172.     internal_sig_set->sig_OPTION = false;
  173.     internal_sig_set->sig_SETUP = false;
  174. DEBUG_VALUE_OF(feed_updated);
  175. DEBUG_VALUE_OF(opt_changed);
  176. DEBUG_VALUE_OF(setup_needed);
  177.     if(setup_needed) {
  178.         channelsetup = new UI_ChannelSelector();
  179.         channelsetup->show();      
  180.     }
  181.     if(feed_updated || opt_changed) {
  182.         DEBUG_VALUE_OF("Clean chanlists (pannable->get_children()), reload and rebuild");
  183.     }
  184.  
  185. }
  186. void UI::setupCheck() {
  187. DEBUG_METHOD();
  188.     if(g_feed->setup_required) {
  189. #ifndef XML_DECODER
  190.         internal_sig_set->sig_SETUP = true;
  191. #else
  192.         if(TVGuide::Options::get_string("xmltv_file", "").empty()) {
  193.             Gtk::Label lifespan;
  194.             Hildon::Banner *banner = Hildon::Banner::show_information(lifespan, "<b>Is this a first time run?</b>\nYou need to link to an xml-feed download");
  195.             banner->set_timeout(8000);
  196.             banner->set_markup("<b>Is this a first time run?</b>\nPlease link with an xml-feed");
  197.             UI_XMLTVDialog xmltvsetup;
  198.             xmltvsetup.run();
  199. std::cout << "setup" << std::endl;
  200.         }
  201.         if(g_feed->channels.size() >= 2
  202.              && g_feed->channels.at(0).programs.size() == 0
  203.              && g_feed->channels.at(1).programs.size() == 0)
  204.         {
  205.  
  206.                 Hildon::Note note(Hildon::NOTE_TYPE_CONFIRMATION_BUTTON, *this,
  207.                     "Your feed seems to be setup right, but appears out-of-date."
  208.                     "Do you wish to run the update command?");
  209.                 note.add_button(Gtk::Stock::YES, Gtk::RESPONSE_YES);
  210.                 note.add_button(Gtk::Stock::NO, Gtk::RESPONSE_NO);
  211.  
  212.                 int response = note.run();
  213.                 if(response == Gtk::RESPONSE_YES) {
  214.  
  215.                 }
  216.         } else if(nChannels == 0) {
  217.             internal_sig_set->sig_SETUP = true;
  218.         }
  219. #endif
  220.     }
  221.  
  222. }
  223. void UI::addChannel(Channel *pChannel) {
  224.  
  225.     DEBUG_METHOD();
  226.     Gtk::Table *list = manage(new UI_ChannelList(pChannel));
  227.     if((nChannels > 0) && (nChannels % CHANNELS_PR_ROW == 0)) {
  228.         listbox.pack_start(*horibox);
  229.         horibox = manage(new UI_ChannelRow());
  230.         horibox->set_size_request((DIMENSION_X-4)/CHANNELS_PR_ROW, -1);
  231.     }
  232.     horibox->pack_start( *list );
  233.     nChannels++;
  234. }
  235. /* Channel program guide container */
  236. /*
  237. UI_ChannelList::UI_ChannelList(Channel* pChannel):
  238.     starred_imagefile(STAR_IMAGE),
  239.     nPrograms (0)
  240. {
  241.     DEBUG_METHOD();
  242.     DEBUG_VALUE_OF(pChannel->name);
  243.  
  244.     Program *pProgram;
  245.     UI_ProgramEntry *button;
  246.     attach(*(manage(
  247.         new UI_ChannelIcon(
  248.             pChannel->icon, (int)pChannel->id))
  249.         ),
  250.         0, 1, 0, 1, Gtk::EXPAND, Gtk::SHRINK, 2, 4);
  251.  
  252.     const time_t now = time (NULL);
  253.     int blanks = 0;
  254.     int max = MAX_PROGRAMS_LISTED + 1;
  255.     if(max > pChannel->programs.size())
  256.         max =  pChannel->programs.size();
  257.  
  258.     int i;
  259.     for(i = 1; i < max; i++) {
  260.         pProgram = &(pChannel->programs.at(i));
  261.         if(now > pProgram->end_timestamp) {
  262.             blanks++;
  263.             if(pChannel->programs.size() != max) max++;
  264.             continue;
  265.         }
  266.         button = manage(
  267.             new UI_ProgramEntry(
  268.             pProgram->title,
  269.             Glib::ustring((time_interval(pProgram->start_timestamp, pProgram->end_timestamp) +
  270.                 "\n" + pProgram->short_description)),
  271.             pProgram->program_id
  272.             )
  273.         );
  274.         if(pProgram->starred) {
  275.             Gtk::Image img(starred_imagefile);
  276.             button->set_image(img);
  277.         }
  278.         attach(*button, 0, 1, i, i+1, Gtk::EXPAND, Gtk::SHRINK, 2, 4);
  279.  
  280.     }
  281.     Gtk::Label *invisiEntry;
  282.     for( ; i < blanks; i++) {
  283.         invisiEntry = manage(new UI_BlankEntry());
  284.  
  285.         invisiEntry->set_size_request((DIMENSION_X-4)/CHANNELS_PR_ROW, 80);
  286.         attach(*invisiEntry, 0, 1, i, i+1, Gtk::EXPAND, Gtk::SHRINK, 2, 4);
  287.     }
  288. }
  289.  
  290. UI_ChannelList::~UI_ChannelList()
  291. {
  292.     DEBUG_METHOD();
  293.  
  294. }
  295. */
  296. /* Logo for channels *//*
  297. UI_ChannelIcon::UI_ChannelIcon(Glib::ustring logoUrl, long _id) :
  298.     cached_icon(load_image(logoUrl))
  299. {
  300.     DEBUG_METHOD();
  301.  
  302.     set_size_request((DIMENSION_X-4)/CHANNELS_PR_ROW, 80);
  303.     set_image(*(manage(new Gtk::Image(cached_icon))));
  304.     id = _id;
  305.     signal_clicked().connect(sigc::mem_fun(*this, &UI_ChannelIcon::on_logo_clicked));
  306.  
  307. }
  308. UI_ChannelIcon::~UI_ChannelIcon() { }
  309.  
  310. UI_BlankEntry::UI_BlankEntry() {
  311.  
  312.     set_size_request((DIMENSION_X-4)/CHANNELS_PR_ROW, 80);
  313. }
  314. */
  315. /* program guide entry
  316. UI_ProgramEntry::intelliSplit(Glib::ustring, int width) {
  317.  
  318.  
  319. }
  320.  
  321. void UI_ChannelIcon::on_logo_clicked() {
  322.   Hildon::StackableWindow* stackable = new Hildon::StackableWindow;
  323.   stackable->set_title("Hildon::StackableWindow Example");
  324.   Gtk::Label* stackable_label = Gtk::manage(
  325.     new Gtk::Label("This is a stackable window, above the root window."));
  326.   stackable->add(*stackable_label);
  327.   stackable_label->show();
  328.   stackable->show_all();
  329.  
  330.     std::cout << "TODO: Will show programs for id " << id << std::endl;
  331. }
  332. */
Add Comment
Please, Sign In to add comment