示例#1
0
class ViewerMoshaf(Gtk.HPaned):
    
    def __init__(self, parent):
        self.parent = parent
        self.db = Othman()
        self.opened_new = []
        self.opened_old = []
        self.build()
    
    def show_bitaka(self, *a):
        return [u'',u'',u'',u'''
كلام رب العالمين على الحقيقة بألفاظه ومعانيه 
محفوظ في الصدور ، مقروء بالألسنة مكتوب في المصاحف
تكلم به الله تعالى فسمعه جبريل منه 
وتكلم به جبريل فسمعه النبي - صلى الله عليه وسلم - منه ، 
وتكلم به النبي - صلى الله عليه وسلم - فسمعته منه أمته وحفظته عنه ، 
فالكلام كلام الباري والصوت صوت القارئ . 
قال الله تعالى : فأجره حتى يسمع كلام الله  الآية 
        ''', u'''''']
    
    def first_page(self, *a):
        self.show_page(1)
    
    def previous_page(self, *a):
        if self.page_id == 1:
            return
        self.show_page(self.page_id-1)
    
    def next_page(self, *a):
        if self.page_id == 604:
            return
        self.show_page(self.page_id+1)
    
    def last_page(self, *a):
        self.show_page(604)
    
    def back_to_old(self, *a):
        if len(self.opened_old) == 1: return
        n = self.opened_old.pop()
        self.show_page(self.opened_old[-1])
        self.opened_new.append(n)
        
    def advance_to_new(self, *a):
        if len(self.opened_new) == 0: return
        n = self.opened_new.pop()
        self.show_page(n)
        if n != self.opened_old[-1]: self.opened_old.append(n)
    
    def ok_index(self, *a):
        model, i = self.sel_index.get_selected()
        if i:
            page= model.get_value(i,0)
            self.show_page(page)
            
    def show_page(self, page=1):
        new_list = []
        sura = u''
        ls_text = self.db.text_in_page(page)
        ls_text.reverse()
        for a in range(len(ls_text)):
            if a%2 == 0:
                txt = u'<div id = "nasse">'+' '.join(ls_text[a])+'</div>'
                new_list.append(txt)
            else:
                sura = ls_text[a][1]
                if page != 1 and page != 187: 
                    new_list.append(u'<div id = "basmala">بِــــسۡمِ ٱللهِ ٱلرَّحۡمَـٰنِ ٱلرَّحِيمِ</div>')
                tit = title_sura.replace(u'الترتيب', u'الترتيب{}'.format(ls_text[a][0]),).\
                replace(u'السورة', u'سورة '+ls_text[a][1]).replace(u'الآيات', u'الآيات{}'.format(ls_text[a][3]))
                new_list.append(tit)
        new_list.reverse()
        if [] in new_list: new_list.remove([])
        if sura == u'': sura = self.db.info_page(page)[0]
        new_text = ' '.join(new_list)
        html = open(join(asm_path.MOSHAF_DIR, 'page_quran.html'), 'r')
        html = html.read()
        html = html.replace('{nasse}', new_text)
        html = html.replace('{sura}', u'سورة '+sura)
        html = html.replace('{joze}', u'الجزء '+ajzaa[self.db.info_page(page)[1]])
        html = html.replace('{page}', str(page))
        if len(self.my_aya.keys()) != 0:
            if page in self.my_aya.keys():
                for a in self.my_aya[page]:
                    aya_txt = self.db.get_aya(a)
                    html = re.sub(aya_txt, u'<span style="background-color: rgb(255, 245, 177);">{}</span>'.format(aya_txt,), html)
        self.view_quran.load_html_string(html, u'file://{}/'.format(asm_path.MOSHAF_DIR,))
        self.page_id = page
        if len(self.opened_old) == 0: self.opened_old.append(page)
        elif page != self.opened_old[-1]: self.opened_old.append(page)
    
    def load_sura(self, *a):
        for a in self.list_sura:
            while (Gtk.events_pending()): Gtk.main_iteration()
            s = self.store_index.append(None, a[0])
            for b in a[1:]:
                self.store_index.append(s, b)
    
    def load_tahzib(self, *a):
        iters = [None]
        last_iter = None
        last_level = 0
        for i in self.list_ahzab:
            level = i[2]
            if level > last_level: iters.append(last_iter)
            elif level < last_level:
                for j in range(last_level-level): iters.pop()
            try :
                last_iter = self.store_index.append(iters[-1], [i[0], i[1]])
            except :
                pass
            last_level = level
    
    def load_page(self, *a):
        for page in range(1, 605):
            self.store_index.append(None, [page, u'الصفحة {}'.format(page,)])
    
    def load_index(self, btn):
        self.tree_index.handler_block(self.changed_index)
        v = btn.get_active()
        self.store_index.clear()
        if v == 0:
            self.load_sura()
        elif v == 1:
            self.load_tahzib()
        elif v == 2:
            self.load_page()
        self.my_aya = {}
        self.show_page(self.page_id)
        self.tree_index.handler_unblock(self.changed_index)
   
    def tafsir_ayat(self, *a):
        all_ayat = self.db.ayat_in_page(self.page_id)
        self.parent.tafsirpage.store_search.clear()
        if len(all_ayat[0]) == 0:
            asm_customs.erro(self.parent, 'لا يوجد نتيجة'); return
        else: 
            for ayat in all_ayat:
                i_sura = ayat[0]
                i_ayat = ayat[1]
                suras_names = Othman().get_suras_names()
                sura = suras_names[i_sura-1]
                self.parent.tafsirpage.store_search.append(None, [i_sura, i_ayat, sura[1]])
                self.parent.tafsirpage.notebook.set_current_page(1)
        self.parent.tafsirpage.view_tafsir_bfr.set_text('')
        self.parent.tafsirpage.sel_search.select_path((0,))
        self.parent.notebook.set_current_page(4)
        self.parent.tafsirpage.ok_result()
   
    def populate_page_popup_cb(self, view, menu):
        for a in menu.get_children():
            a.destroy()
        f1 = Gtk.MenuItem('تفسير الآيات')
        f1.connect('activate', self.tafsir_ayat) 
        menu.append(f1)
        c1 = Gtk.SeparatorMenuItem()
        menu.append(c1)
        c1.show()
        i = Gtk.MenuItem('تكبير النص')
        i.connect('activate', lambda m,v,*a,**k: v.zoom_in(), view)
        menu.append(i)
        i = Gtk.MenuItem('تصغير النص')
        i.connect('activate', lambda m,v,**k: v.zoom_out(), view)
        menu.append(i)
        i = Gtk.MenuItem('الحجم العادي')
        i.connect('activate', lambda m,v,*a,**k: v.get_zoom_level() == 1.0 or v.set_zoom_level(1.0), view)
        menu.append(i)
        menu.show_all()
        return False
    
    def search_on_page(self, text):
        return
     
    def search_on_active(self, text):
        if len(text) >= 3:
            all_ayat = Othman().search(text)
            self.store_index.clear()
            if len(all_ayat) == 0:
                asm_customs.erro(self.parent, 'لا يوجد نتيجة'); return
            else: 
                for ayat in all_ayat:
                    sura = ayat[0]
                    aya = ayat[1]
                    suras_names = Othman().get_suras_names()
                    suranm = suras_names[sura-1]
                    id_page = self.db.aya_page(aya, sura)
                    if id_page != self.id_page_last:
                        self.my_aya[id_page] = [ayat[5]]
                        self.id_page_last = id_page
                        self.store_index.append(None, [id_page, suranm[1]])
                    else:
                        self.my_aya[id_page].append(ayat[5])                
        
    def build(self, *a):
        self.id_page_last = 0
        try:
            self.list_sura = pickle.load(open(join(asm_path.MOSHAF_DIR, 'list_sura.pkl'), "rb"))
            self.list_ahzab =  pickle.load(open(join(asm_path.MOSHAF_DIR, 'list_ahzab.pkl'), "rb"))
        except:
            self.list_sura = []
            self.list_ahzab =  []
        self.my_aya = {}
        self.page_id = asm_config.getn('quran_pos')
        Gtk.HPaned.__init__(self)
        self.set_border_width(3)
        self.set_position(150)
        # a الفهرس-----------------------------------
        vbox = Gtk.VBox(False, 3)
        index_by = Gtk.ComboBoxText()
        index_by.append_text(u'السور')
        index_by.append_text(u'الأجزاء')
        index_by.append_text(u'الصفحات')
        index_by.set_active(0)
        vbox.pack_start(index_by, False, False, 0)
        self.tree_index = asm_customs.TreeIndex()
        self.tree_index.set_headers_visible(False)
        cell = Gtk.CellRendererText()
        cell.set_property("wrap-width", 150)
        kal = Gtk.TreeViewColumn('الفهرس', cell, text=1)
        self.tree_index.append_column(kal)
        self.store_index = Gtk.TreeStore(int, str)
        self.tree_index.set_model(self.store_index)
        self.sel_index = self.tree_index.get_selection()
        self.changed_index = self.tree_index.connect("cursor-changed", self.ok_index)
        scroll = Gtk.ScrolledWindow()
        scroll.set_shadow_type(Gtk.ShadowType.IN)
        scroll.add(self.tree_index)
        scroll.get_hadjustment().set_value(0.0) 
        vbox.pack_start(scroll, True, True, 0)
        self.pack1(vbox, True, True)
        
        self.view_quran = WebKit.WebView()
        self.view_quran.connect("populate-popup", self.populate_page_popup_cb)
        scroll = Gtk.ScrolledWindow()
        scroll.set_shadow_type(Gtk.ShadowType.IN)
        scroll.add(self.view_quran)
        self.view_quran.set_full_content_zoom(True)
        self.pack2(scroll, True, True)
        index_by.connect('changed', self.load_index)
        self.load_index(index_by)