skeleton for picons dialog

This commit is contained in:
Dmitriy Yefremov
2018-01-10 12:15:41 +03:00
parent dd1ec89592
commit c274c9e91d
8 changed files with 208 additions and 27 deletions

View File

@@ -1,8 +1,8 @@
[Desktop Entry]
Version=1.0
Name=DemonEditor
Comment=Channels and satellites editor for Enigma2
Comment[ru]=Редактор каналов и спутников для Enigma2
Comment=Channels and satellites list editor for Enigma2
Comment[ru]=Редактор списка каналов и спутников для Enigma2
Icon=accessories-text-editor
Exec=bash -c 'cd $(dirname %k) && ./start.py'
Terminal=false

View File

@@ -4,7 +4,7 @@ from enum import Enum
from xml.dom.minidom import parse, Document
from app.ui import LOCKED_ICON, HIDE_ICON
from ..ecommons import Bouquets, Bouquet, BouquetService, BqServiceType
from ..ecommons import Bouquets, Bouquet, BouquetService, BqServiceType, PROVIDER
_FILE = "bouquets.xml"
_U_FILE = "ubouquets.xml"
@@ -48,6 +48,15 @@ def parse_bouquets(file, name, bq_type):
locked=LOCKED_ICON if locked == "1" else None,
hidden=HIDE_ICON if hidden == "1" else None))
if BqType(bq_type) is BqType.BOUQUET:
for bq in bouquets.bouquets:
if bq.services:
name = bq.name
name = name[name.index("]") + 1:]
key = int(bq.services[0].data.split(":")[0], 16)
if key not in PROVIDER:
PROVIDER[key] = name
return bouquets

0
app/picons/__init__.py Normal file
View File

View File

@@ -1005,8 +1005,8 @@ dmitry.v.yefremov@gmail.com
<child>
<object class="GtkEntry" id="picons_dir_field">
<property name="visible">True</property>
<property name="sensitive">False</property>
<property name="can_focus">True</property>
<property name="editable">False</property>
<property name="text" translatable="yes">/usr/share/enigma2/picon</property>
</object>
<packing>

View File

@@ -465,8 +465,8 @@ class MainAppWindow:
data_path = self.__options.get(self.__profile).get("data_dir_path") if data_path is None else data_path
try:
self.append_blacklist(data_path)
self.append_services(data_path)
self.append_bouquets(data_path)
self.append_services(data_path)
self.update_services_counts(len(self.__services_model))
except FileNotFoundError as e:
show_dialog(DialogType.ERROR, self.__main_window, getattr(e, "message", str(e)) +
@@ -805,7 +805,7 @@ class MainAppWindow:
locate_in_services(view, self.__services_view, self.__main_window)
def on_picons_loader_show(self, item):
dialog = PiconsDialog(self.__main_window, self.__options.get(self.__profile).get("data_dir_path"))
dialog = PiconsDialog(self.__main_window, self.__options.get(self.__profile).get("data_dir_path") + "picons")
dialog.show()

View File

@@ -2,11 +2,6 @@
<!-- Generated with glade 3.18.3 -->
<interface>
<requires lib="gtk+" version="3.12"/>
<object class="GtkImage" id="recive_image">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="stock">gtk-goto-bottom</property>
</object>
<object class="GtkDialog" id="picons_dialog">
<property name="can_focus">False</property>
<property name="title" translatable="yes">Picons download tool</property>
@@ -31,12 +26,13 @@
<property name="layout_style">spread</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label">gtk-cancel</property>
<property name="label">gtk-close</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="use_stock">True</property>
<property name="always_show_image">True</property>
<signal name="clicked" handler="on_close" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
@@ -112,33 +108,165 @@
<object class="GtkSeparator" id="separator">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="margin_top">2</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">2</property>
<property name="position">4</property>
</packing>
</child>
<child>
<object class="GtkButton" id="recive_button">
<property name="label" translatable="yes">Recive</property>
<object class="GtkToolbar" id="toolbar">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="image">recive_image</property>
<property name="use_underline">True</property>
<property name="always_show_image">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkToolButton" id="cancel_tool_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Cancel</property>
<property name="use_underline">True</property>
<property name="stock_id">gtk-cancel</property>
<signal name="clicked" handler="on_cancel" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="receive_tool_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Receive</property>
<property name="use_underline">True</property>
<property name="icon_name">insert-image</property>
<signal name="clicked" handler="on_receive" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="homogeneous">True</property>
</packing>
</child>
<child>
<object class="GtkSeparatorToolItem" id="separatortoolitem1">
<property name="visible">True</property>
<property name="can_focus">False</property>
</object>
<packing>
<property name="expand">False</property>
<property name="homogeneous">False</property>
</packing>
</child>
<child>
<object class="GtkToolButton" id="send_tool_button">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="is_important">True</property>
<property name="label" translatable="yes">Send</property>
<property name="use_underline">True</property>
<property name="icon_name">go-top</property>
<signal name="clicked" handler="on_send" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="homogeneous">True</property>
</packing>
</child>
<style>
<class name="primary-toolbar"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="fill">True</property>
<property name="position">5</property>
</packing>
</child>
<child>
<object class="GtkExpander" id="expander">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="resize_toplevel">True</property>
<child>
<object class="GtkTextView" id="text_view">
<property name="height_request">100</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="expander_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">Info</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">7</property>
</packing>
</child>
<child>
<object class="GtkInfoBar" id="info_bar">
<property name="visible">True</property>
<property name="app_paintable">True</property>
<property name="can_focus">False</property>
<child internal-child="action_area">
<object class="GtkButtonBox" id="infobar-action_area1">
<property name="can_focus">False</property>
<property name="spacing">6</property>
<property name="layout_style">end</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child internal-child="content_area">
<object class="GtkBox" id="infobar-content_area1">
<property name="can_focus">False</property>
<property name="spacing">16</property>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">8</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
@@ -148,8 +276,5 @@
</child>
</object>
</child>
<action-widgets>
<action-widget response="-6">cancel_button</action-widget>
</action-widgets>
</object>
</interface>

View File

@@ -1,20 +1,65 @@
from . import Gtk, Gdk, UI_RESOURCES_PATH
import subprocess
import time
from gi.repository import GLib
from app.commons import run_idle, run_task
from . import Gtk, UI_RESOURCES_PATH
class PiconsDialog:
def __init__(self, transient, path):
handlers = {}
self._current_process = None
handlers = {"on_receive": self.on_receive,
"on_cancel": self.on_cancel,
"on_close": self.on_close,
"on_send": self.on_send}
builder = Gtk.Builder()
builder.add_objects_from_file(UI_RESOURCES_PATH + "picons_dialog.glade", ("picons_dialog", "recive_image"))
builder.add_objects_from_file(UI_RESOURCES_PATH + "picons_dialog.glade",
("picons_dialog", "receive_image", "text_buffer"))
builder.connect_signals(handlers)
self._dialog = builder.get_object("picons_dialog")
self._dialog.set_transient_for(transient)
self._expander = builder.get_object("expander")
self._text_view = builder.get_object("text_view")
self._info_bar = builder.get_object("info_bar")
def show(self):
self._dialog.run()
self._dialog.destroy()
def on_receive(self, item):
self._current_process = subprocess.Popen("ls", stdout=subprocess.PIPE)
GLib.io_add_watch(self._current_process.stdout, # file descriptor
GLib.IO_IN, # condition
self.write_to_buffer) # callback
def write_to_buffer(self, fd, condition):
"""https://pygabriel.wordpress.com/2009/07/27/redirecting-the-stdout-on-a-gtk-textview/"""
if condition == GLib.IO_IN:
char = fd.read(1) # we read one byte per time, to avoid blocking
buf = self._text_view.get_buffer()
buf.insert_at_cursor(str(char))
return True
else:
return False
@run_task
def on_cancel(self, item):
if self._current_process:
self._current_process.kill()
time.sleep(1)
@run_idle
def on_close(self, item):
self.on_cancel(item)
self._dialog.destroy()
def on_send(self, item):
pass
if __name__ == "__main__":
pass

View File

@@ -26,6 +26,7 @@ class SettingsDialog:
self._user_bouquet_field = builder.get_object("user_bouquet_field")
self._satellites_xml_field = builder.get_object("satellites_xml_field")
self._data_dir_field = builder.get_object("data_dir_field")
self._picons_dir_field = builder.get_object("picons_dir_field")
self._enigma_radio_button = builder.get_object("enigma_radio_button")
self._neutrino_radio_button = builder.get_object("neutrino_radio_button")
@@ -77,6 +78,7 @@ class SettingsDialog:
self._user_bouquet_field.set_text(options.get("user_bouquet_path"))
self._satellites_xml_field.set_text(options.get("satellites_xml_path"))
self._data_dir_field.set_text(options.get("data_dir_path"))
self._picons_dir_field.set_text(options.get("data_dir_path") + "picons")
def apply_settings(self):
profile = Profile.ENIGMA_2.value if self._enigma_radio_button.get_active() else Profile.NEUTRINO_MP.value