mirror of
https://github.com/DYefremov/DemonEditor.git
synced 2026-05-09 04:27:29 +02:00
Compare commits
27 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
528f59d990 | ||
|
|
28802957fc | ||
|
|
b763d9785d | ||
|
|
601a81beb9 | ||
|
|
ace38433a1 | ||
|
|
536b23a845 | ||
|
|
d71a1d5dac | ||
|
|
4a92084c75 | ||
|
|
e7b8412c11 | ||
|
|
ef53de1796 | ||
|
|
8e7a116db7 | ||
|
|
285014480f | ||
|
|
279c255ad0 | ||
|
|
90a3053192 | ||
|
|
19c6a5bef9 | ||
|
|
945ee13058 | ||
|
|
c65b6c540c | ||
|
|
62091dfa96 | ||
|
|
6ca06fd2cd | ||
|
|
4cab05fc09 | ||
|
|
81e714ebab | ||
|
|
147430d4f3 | ||
|
|
f8f209d288 | ||
|
|
bd0e08e90b | ||
|
|
57020423d7 | ||
|
|
1fd3e45dd3 | ||
|
|
ac1725b3ef |
@@ -36,7 +36,8 @@ Clipboard is **"rubber"**. There is an accumulation before the insertion!
|
||||
beginning or inserts (creates) a new bouquet.
|
||||
* **Ctrl + BackSpace** - copies the selected channels from the main list to the bouquet end.
|
||||
* **Ctrl + E** - edit.
|
||||
* **Ctrl + R, F2** - rename.
|
||||
* **Ctrl + R, F2** - rename.
|
||||
* **Ctrl + Alt + R** - rename for bouquet.
|
||||
* **Ctrl + S, T** in Satellites edit tool for create satellite or transponder.
|
||||
* **Ctrl + L** - parental lock.
|
||||
* **Ctrl + H** - hide/skip.
|
||||
@@ -85,7 +86,8 @@ Recommended copy the package to the **Application** directory.
|
||||
Perhaps in the security settings it will be necessary to allow the launch of this application!
|
||||
|
||||
* ### MS Windows
|
||||
**Windows users can also run this program.** One way is to use the [MSYS2](https://www.msys2.org/) platform.
|
||||
**Windows users can also run this program.**
|
||||
One way is to use the [MSYS2](https://www.msys2.org/) platform. You can use [this](https://github.com/DYefremov/DemonEditor/blob/master/build/BUILD_WIN.md) quick guide.
|
||||
In addition, you can download a ready-made build (**64-bit**) from the [releases](https://github.com/DYefremov/DemonEditor/releases) page.
|
||||
|
||||
**All builds may contain components distributed under the GPL [v3](http://www.gnu.org/licenses/gpl-3.0.html) or lower license.
|
||||
|
||||
@@ -757,14 +757,6 @@ class Settings:
|
||||
def is_darwin(self):
|
||||
return IS_DARWIN
|
||||
|
||||
@property
|
||||
def force_external_themes(self):
|
||||
return self._settings.get("force_external_themes", False)
|
||||
|
||||
@force_external_themes.setter
|
||||
def force_external_themes(self, value):
|
||||
self._settings["force_external_themes"] = value
|
||||
|
||||
# *********** Download dialog *********** #
|
||||
|
||||
@property
|
||||
|
||||
@@ -57,7 +57,7 @@ class PiconsCzDownloader:
|
||||
_PERM_URL = "https://picon.cz/download/7337"
|
||||
_BASE_URL = "https://picon.cz/download/"
|
||||
_BASE_LOGO_URL = "https://picon.cz/picon/0/"
|
||||
_HEADER = {"User-Agent": "DemonEditor/2.2.2", "Referer": ""}
|
||||
_HEADER = {"User-Agent": "DemonEditor/2.2.4", "Referer": ""}
|
||||
_LINK_PATTERN = re.compile(r"((.*)-\d+x\d+)-(.*)_by_chocholousek.7z$")
|
||||
_FILE_PATTERN = re.compile(b"\\s+(1_.*\\.png).*")
|
||||
|
||||
@@ -136,7 +136,7 @@ class PiconsCzDownloader:
|
||||
raise PiconsError("7-zip [7z] archiver not found!")
|
||||
|
||||
if IS_WIN:
|
||||
exe = f"C:{os.sep}Program Files{os.sep}7-Zip{os.sep}{exe}.exe"
|
||||
exe = f"{exe}.exe" if GTK_PATH else f"C:{os.sep}Program Files{os.sep}7-Zip{os.sep}{exe}.exe"
|
||||
if not os.path.isfile(exe):
|
||||
raise PiconsError("7-Zip executable not found!")
|
||||
|
||||
|
||||
@@ -164,16 +164,15 @@ class SatellitesParser(HTMLParser):
|
||||
|
||||
for src in SatelliteSource.get_sources(self._source):
|
||||
try:
|
||||
request = requests.get(url=src, headers=_HEADERS, timeout=_TIMEOUT)
|
||||
resp = requests.get(url=src, headers=_HEADERS, timeout=_TIMEOUT)
|
||||
except requests.exceptions.RequestException as e:
|
||||
log(f"Getting satellite list error: {repr(e)}")
|
||||
return []
|
||||
else:
|
||||
reason = request.reason
|
||||
reason = resp.reason
|
||||
if reason == "OK":
|
||||
self.feed(request.text)
|
||||
self.feed(resp.text)
|
||||
else:
|
||||
log(reason)
|
||||
log(f"Getting satellite list error: {reason} -> {resp.url}")
|
||||
|
||||
if self._rows:
|
||||
if self._source is SatelliteSource.FLYSAT:
|
||||
@@ -183,6 +182,8 @@ class SatellitesParser(HTMLParser):
|
||||
elif source is SatelliteSource.KINGOFSAT:
|
||||
return self.get_satellites_for_king_of_sat()
|
||||
|
||||
return []
|
||||
|
||||
def get_satellite(self, sat):
|
||||
pos = sat[1]
|
||||
return Satellite(name=f"{pos} {sat[0]}", flags="0",
|
||||
|
||||
@@ -2941,6 +2941,7 @@ Author: Dmitriy Yefremov
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="row_spacing">5</property>
|
||||
<property name="column_spacing">5</property>
|
||||
<property name="column_homogeneous">True</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="control_ok_button">
|
||||
<property name="label" translatable="yes">OK</property>
|
||||
@@ -3336,10 +3337,12 @@ audio-volume-medium-symbolic</property>
|
||||
<property name="margin_right">5</property>
|
||||
<property name="margin_top">5</property>
|
||||
<property name="margin_bottom">5</property>
|
||||
<property name="homogeneous">True</property>
|
||||
<property name="layout_style">expand</property>
|
||||
<child>
|
||||
<object class="GtkButton">
|
||||
<property name="label" translatable="yes">All</property>
|
||||
<property name="width_request">75</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">True</property>
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# The MIT License (MIT)
|
||||
#
|
||||
# Copyright (c) 2018-2021 Dmitriy Yefremov
|
||||
# Copyright (c) 2018-2022 Dmitriy Yefremov
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -860,6 +860,8 @@ class ControlTool(Gtk.Box):
|
||||
self._ber_level_bar = builder.get_object("ber_level_bar")
|
||||
self._agc_level_bar = builder.get_object("agc_level_bar")
|
||||
self._volume_button = builder.get_object("volume_button")
|
||||
self._network_button = builder.get_object("control_network_button")
|
||||
self._header_box = builder.get_object("control_header_box")
|
||||
self.init_actions(app)
|
||||
|
||||
if settings.alternate_layout:
|
||||
@@ -899,7 +901,11 @@ class ControlTool(Gtk.Box):
|
||||
app.set_action("on_screenshot_osd", self.on_screenshot_osd)
|
||||
|
||||
def on_layout_changed(self, app, alt_layout):
|
||||
self._remote_box.reorder_child(self._remote_box.get_children()[0], 1)
|
||||
children = self._remote_box.get_children()
|
||||
self._remote_box.reorder_child(children[0], len(children) - 1)
|
||||
self._remote_box.reorder_child(children[-1], 0)
|
||||
pack_type = Gtk.PackType.END if alt_layout else Gtk.PackType.START
|
||||
self._header_box.set_child_packing(self._network_button, False, False, 0, pack_type)
|
||||
|
||||
# ***************** Remote controller ********************* #
|
||||
|
||||
|
||||
@@ -40,7 +40,7 @@ Author: Dmitriy Yefremov
|
||||
<property name="icon_name">system-help</property>
|
||||
<property name="type_hint">normal</property>
|
||||
<property name="program_name">DemonEditor</property>
|
||||
<property name="version">2.2.2 Beta</property>
|
||||
<property name="version">2.2.4 Beta</property>
|
||||
<property name="copyright">2018-2022 Dmitriy Yefremov
|
||||
</property>
|
||||
<property name="comments" translatable="yes">Enigma2 channel and satellite list editor.</property>
|
||||
|
||||
@@ -108,7 +108,7 @@ class EpgDialog:
|
||||
self._info_bar = builder.get_object("info_bar")
|
||||
self._message_label = builder.get_object("info_bar_message_label")
|
||||
self._assign_ref_popup_item = builder.get_object("bouquet_assign_ref_popup_item")
|
||||
self._left_header_box = builder.get_object("left_header_box")
|
||||
self._left_action_box = builder.get_object("left_action_box")
|
||||
self._xml_download_progress_bar = builder.get_object("xml_download_progress_bar")
|
||||
# Filter
|
||||
self._filter_bar = builder.get_object("filter_bar")
|
||||
@@ -500,7 +500,7 @@ class EpgDialog:
|
||||
|
||||
@run_idle
|
||||
def update_active_header_elements(self, state):
|
||||
self._left_header_box.set_sensitive(state)
|
||||
self._left_action_box.set_sensitive(state)
|
||||
self._xml_download_progress_bar.set_visible(not state)
|
||||
self._source_info_label.set_text("" if state else "Downloading XML:")
|
||||
|
||||
|
||||
@@ -666,7 +666,7 @@ class M3uImportDialog(IptvListDialog):
|
||||
progress_box.pack_start(load_label, False, False, 0)
|
||||
# Picons
|
||||
self._picons_switch = Gtk.Switch(visible=True)
|
||||
self._picon_box = Gtk.HBox(visible=True, sensitive=False, spacing=2)
|
||||
self._picon_box = Gtk.HBox(visible=True, sensitive=False, spacing=5)
|
||||
self._picon_box.pack_end(self._picons_switch, False, False, 0)
|
||||
self._picon_box.pack_end(Gtk.Label(visible=True, label=get_message("Download picons")), False, False, 0)
|
||||
# Extra box
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -10,13 +10,19 @@
|
||||
|
||||
entry {
|
||||
min-height: 2.0em;
|
||||
padding: 0.2em;
|
||||
}
|
||||
|
||||
entry > image {
|
||||
padding-left: 0.3em;
|
||||
padding-right: 0.3em;
|
||||
}
|
||||
|
||||
button {
|
||||
min-height: 1.5em;
|
||||
min-height: 1.2em;
|
||||
min-width: 1.5em;
|
||||
padding-top: 0.1em;
|
||||
padding-bottom: 0.1em;
|
||||
padding-top: 0.3em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
button:active, button:checked {
|
||||
@@ -25,7 +31,7 @@ button:active, button:checked {
|
||||
}
|
||||
|
||||
combobox {
|
||||
min-height: 2.1em;
|
||||
min-height: 2.2em;
|
||||
}
|
||||
|
||||
spinbutton {
|
||||
@@ -54,6 +60,10 @@ switch slider {
|
||||
min-width: 1.5em;
|
||||
}
|
||||
|
||||
popover .view {
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
.font > box {
|
||||
min-height: 1.5em;
|
||||
padding-top: 0.1em;
|
||||
|
||||
@@ -1587,7 +1587,7 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkLabel" id="app_ver_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label">2.2.2 Beta</property>
|
||||
<property name="label">2.2.4 Beta</property>
|
||||
<attributes>
|
||||
<attribute name="weight" value="bold"/>
|
||||
</attributes>
|
||||
|
||||
@@ -709,6 +709,7 @@ Author: Dmitriy Yefremov
|
||||
<property name="tooltip_text" translatable="yes">Drag the services to the desired picon or picon to the list of selected services.</property>
|
||||
<property name="model">picons_src_sort_model</property>
|
||||
<property name="fixed_height_mode">True</property>
|
||||
<property name="rubber_banding">True</property>
|
||||
<property name="enable_grid_lines">horizontal</property>
|
||||
<property name="tooltip_column">0</property>
|
||||
<property name="activate_on_single_click">True</property>
|
||||
@@ -720,7 +721,9 @@ Author: Dmitriy Yefremov
|
||||
<signal name="key-press-event" handler="on_tree_view_key_press" swapped="no"/>
|
||||
<signal name="query-tooltip" handler="on_view_query_tooltip" swapped="no"/>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="picons_src_view_selection"/>
|
||||
<object class="GtkTreeSelection" id="picons_src_view_selection">
|
||||
<property name="mode">multiple</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="src_picon_column">
|
||||
@@ -841,9 +844,10 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkTreeView" id="picons_dest_view">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="tooltip_text" translatable="yes">Drag the services to the desired picon or picon to the list of selected services. </property>
|
||||
<property name="tooltip_text" translatable="yes">Drag the services to the desired picon or picon to the list of selected services.</property>
|
||||
<property name="model">picons_dst_sort_model</property>
|
||||
<property name="fixed_height_mode">True</property>
|
||||
<property name="rubber_banding">True</property>
|
||||
<property name="enable_grid_lines">horizontal</property>
|
||||
<property name="tooltip_column">0</property>
|
||||
<property name="activate_on_single_click">True</property>
|
||||
@@ -856,7 +860,9 @@ Author: Dmitriy Yefremov
|
||||
<signal name="key-press-event" handler="on_tree_view_key_press" swapped="no"/>
|
||||
<signal name="query-tooltip" handler="on_view_query_tooltip" swapped="no"/>
|
||||
<child internal-child="selection">
|
||||
<object class="GtkTreeSelection" id="picons_dest_view_selection"/>
|
||||
<object class="GtkTreeSelection" id="picons_dest_view_selection">
|
||||
<property name="mode">multiple</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkTreeViewColumn" id="dest_picon_column">
|
||||
|
||||
@@ -453,12 +453,12 @@ class PiconManager(Gtk.Box):
|
||||
def on_send_button_drag_data_received(self, button, drag_context, x, y, data, info, time):
|
||||
path = self.get_path_from_uris(data)
|
||||
if path:
|
||||
self.on_send(files_filter={path.name}, path=path.parent)
|
||||
self.on_picons_send(files_filter={path.name}, path=path.parent)
|
||||
|
||||
def on_download_button_drag_data_received(self, button, drag_context, x, y, data, info, time):
|
||||
path = self.get_path_from_uris(data)
|
||||
if path:
|
||||
self.on_download(files_filter={path.name})
|
||||
self.on_picons_download(files_filter={path.name})
|
||||
|
||||
def on_remove_button_drag_data_received(self, button, drag_context, x, y, data, info, time):
|
||||
path = self.get_path_from_uris(data)
|
||||
@@ -526,12 +526,12 @@ class PiconManager(Gtk.Box):
|
||||
def on_selective_send(self, view):
|
||||
path = self.get_selected_path(view)
|
||||
if path:
|
||||
self.on_send(files_filter={path.name}, path=path.parent)
|
||||
self.on_picons_send(files_filter={path.name}, path=path.parent)
|
||||
|
||||
def on_selective_download(self, view):
|
||||
path = self.get_selected_path(view)
|
||||
if path:
|
||||
self.on_download(files_filter={path.name})
|
||||
self.on_picons_download(files_filter={path.name})
|
||||
|
||||
def on_selective_remove(self, view):
|
||||
path = self.get_selected_path(view)
|
||||
@@ -541,20 +541,32 @@ class PiconManager(Gtk.Box):
|
||||
def on_local_remove(self, view):
|
||||
model, paths = view.get_selection().get_selected_rows()
|
||||
if paths and show_dialog(DialogType.QUESTION, self._app_window) == Gtk.ResponseType.OK:
|
||||
itr = model.get_iter(paths.pop())
|
||||
p_path = Path(model.get_value(itr, 2)).resolve()
|
||||
if p_path.is_file():
|
||||
p_path.unlink()
|
||||
base_model = get_base_model(model)
|
||||
filter_model = model.get_model()
|
||||
itr = filter_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr))
|
||||
base_model.remove(itr)
|
||||
self._app.update_picons()
|
||||
base_model = get_base_model(model)
|
||||
filter_model = model.get_model()
|
||||
to_del = []
|
||||
|
||||
for p in paths:
|
||||
itr = model.get_iter(p)
|
||||
p_path = Path(model.get_value(itr, 2)).resolve()
|
||||
if p_path.is_file():
|
||||
p_path.unlink()
|
||||
to_del.append(filter_model.convert_iter_to_child_iter(model.convert_iter_to_child_iter(itr)))
|
||||
|
||||
list(map(base_model.remove, to_del))
|
||||
self._app.update_picons()
|
||||
|
||||
if view is self._picons_dest_view:
|
||||
self._dst_count_label.set_text(str(len(model)))
|
||||
|
||||
def on_send(self, item=None, files_filter=None, path=None):
|
||||
def on_send(self, item=None):
|
||||
view = self._picons_src_view if self._picons_src_view.is_focus() else self._picons_dest_view
|
||||
model, paths = view.get_selection().get_selected_rows()
|
||||
if paths:
|
||||
self.on_picons_send(files_filter={Path(model[p][-1]).resolve().name for p in paths})
|
||||
else:
|
||||
self._app.show_error_message("No selected item!")
|
||||
|
||||
def on_picons_send(self, item=None, files_filter=None, path=None):
|
||||
dest_path = path or self._settings.profile_picons_path
|
||||
settings = Settings(self._settings.settings)
|
||||
settings.profile_picons_path = f"{dest_path}{SEP}"
|
||||
@@ -567,7 +579,10 @@ class PiconManager(Gtk.Box):
|
||||
Gtk.MessageType.INFO),
|
||||
files_filter=files_filter))
|
||||
|
||||
def on_download(self, item=None, files_filter=None, path=None):
|
||||
def on_download(self, item=None):
|
||||
self.on_picons_download()
|
||||
|
||||
def on_picons_download(self, item=None, files_filter=None, path=None):
|
||||
path = path or self._settings.profile_picons_path
|
||||
settings = Settings(self._settings.settings)
|
||||
settings.profile_picons_path = path + SEP
|
||||
|
||||
@@ -195,7 +195,6 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkMenu" id="transponder_popup_menu">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="reserve_toggle_size">False</property>
|
||||
<child>
|
||||
<object class="GtkImageMenuItem" id="add_tr_popup_menu_item">
|
||||
<property name="label" translatable="yes">Add</property>
|
||||
@@ -1468,7 +1467,6 @@ Author: Dmitriy Yefremov
|
||||
<property name="tooltip_text" translatable="yes">Source</property>
|
||||
<property name="active">0</property>
|
||||
<items>
|
||||
<item id="FLYSAT" translatable="yes">FlySat</item>
|
||||
<item id="LYNGSAT" translatable="yes">LyngSat</item>
|
||||
<item id="KINGOFSAT" translatable="yes">KingOfSat</item>
|
||||
</items>
|
||||
|
||||
@@ -530,11 +530,11 @@ class UpdateDialog:
|
||||
|
||||
@run_task
|
||||
def get_sat_list(self, src, callback):
|
||||
sat_src = SatelliteSource.FLYSAT
|
||||
sat_src = SatelliteSource.LYNGSAT
|
||||
if src == 1:
|
||||
sat_src = SatelliteSource.LYNGSAT
|
||||
elif src == 2:
|
||||
sat_src = SatelliteSource.KINGOFSAT
|
||||
elif src == 2:
|
||||
sat_src = SatelliteSource.FLYSAT
|
||||
|
||||
sats = self._parser.get_satellites_list(sat_src)
|
||||
callback(sats)
|
||||
@@ -744,9 +744,7 @@ class ServicesUpdateDialog(UpdateDialog):
|
||||
self._transponder_view.connect("select_all", lambda w: self.update_transponder_selection(True))
|
||||
|
||||
self._transponder_paned.set_visible(True)
|
||||
self._source_box.remove(0)
|
||||
self._source_box.connect("changed", self.on_update_satellites_list)
|
||||
self._source_box.set_active(0)
|
||||
|
||||
@run_idle
|
||||
def on_receive_data(self, item):
|
||||
@@ -843,8 +841,8 @@ class ServicesUpdateDialog(UpdateDialog):
|
||||
sat_src = SatelliteSource.LYNGSAT
|
||||
if src == 1:
|
||||
sat_src = SatelliteSource.KINGOFSAT
|
||||
self._services_parser.source = sat_src
|
||||
|
||||
self._services_parser.source = sat_src
|
||||
sats = self._parser.get_satellites_list(sat_src)
|
||||
callback(sats)
|
||||
self.is_download = False
|
||||
|
||||
@@ -627,7 +627,7 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkLabel" id="record_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="label" translatable="yes">Record:</property>
|
||||
<property name="label" translatable="yes">Recordings:</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
@@ -2551,7 +2551,7 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkBox" id="enable_yt_dl_box">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enables parsing links using youtube-dl to get direct media links.</property>
|
||||
<property name="tooltip_text" translatable="yes">Enables URL parsing using youtube-dl to get direct links to media.</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="enable_yt_dl_label">
|
||||
<property name="visible">True</property>
|
||||
@@ -2569,7 +2569,6 @@ Author: Dmitriy Yefremov
|
||||
<object class="GtkSwitch" id="enable_yt_dl_switch">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="tooltip_text" translatable="yes">Enables parsing links using youtube-dl to get direct links to media</property>
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
@@ -2691,45 +2690,6 @@ Author: Dmitriy Yefremov
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="force_ext_themes_box">
|
||||
<property name="can_focus">False</property>
|
||||
<property name="tooltip_text" translatable="yes">Enables forced use of external themes on macOS. </property>
|
||||
<property name="margin_top">5</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="force_ext_themes_label">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">False</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="label" translatable="yes">Force external themes on macOS </property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="force_ext_themes_switch">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="halign">end</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">True</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child type="label_item">
|
||||
|
||||
@@ -216,8 +216,6 @@ class SettingsDialog:
|
||||
builder.get_object("themes_support_frame").set_visible(True)
|
||||
self._layout_switch = builder.get_object("layout_switch")
|
||||
self._layout_switch.set_active(self._ext_settings.alternate_layout)
|
||||
self._force_ext_themes_switch = builder.get_object("force_ext_themes_switch")
|
||||
self._force_ext_themes_switch.set_active(self._settings.force_external_themes)
|
||||
self._theme_frame = builder.get_object("theme_frame")
|
||||
self._theme_frame.set_visible(True)
|
||||
self._theme_thumbnail_image = builder.get_object("theme_thumbnail_image")
|
||||
@@ -401,7 +399,6 @@ class SettingsDialog:
|
||||
self._ext_settings.is_themes_support = self._themes_support_switch.get_active()
|
||||
self._ext_settings.theme = self._theme_combo_box.get_active_id()
|
||||
self._ext_settings.icon_theme = self._icon_theme_combo_box.get_active_id()
|
||||
self._ext_settings.force_external_themes = self._force_ext_themes_switch.get_active()
|
||||
|
||||
if self._s_type is SettingsType.ENIGMA_2:
|
||||
self._ext_settings.is_enable_experimental = self._enable_exp_switch.get_active()
|
||||
|
||||
@@ -9,3 +9,12 @@ switch {
|
||||
spinbutton entry {
|
||||
min-height: 16px;
|
||||
}
|
||||
|
||||
button > image {
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
grid > button {
|
||||
padding-left: 15px;
|
||||
padding-right: 15px;
|
||||
}
|
||||
|
||||
40
build/BUILD_WIN.md
Normal file
40
build/BUILD_WIN.md
Normal file
@@ -0,0 +1,40 @@
|
||||
## Launch
|
||||
The best way to run this program from source is using of [MSYS2](https://www.msys2.org/) platform.
|
||||
1. Download and install the platform as described [here](https://www.msys2.org/) up to point 4.
|
||||
2. Launch **mingw64** shell.
|
||||

|
||||
3. Run first `pacman -Suy` After that, you may need to restart the terminal and re-run the update command.
|
||||
4. Install minimal required packages:
|
||||
`pacman -S mingw-w64-x86_64-gtk3 mingw-w64-x86_64-python3 mingw-w64-x86_64-python3-gobject mingw-w64-x86_64-python3-pip mingw-w64-x86_64-python3-requests`
|
||||
Optional: `pacman -S mingw-w64-x86_64-python3-pillow`
|
||||
To support streams playback, install the following packages (the list may not be complete):
|
||||
For [MPV](https://mpv.io/) `pacman -S mingw-w64-x86_64-mpv`,
|
||||
For [GStreamer](https://gstreamer.freedesktop.org/) `pacman -S mingw-w64-x86_64-gst-libav mingw-w64-x86_64-gst-plugins-bad mingw-w64-x86_64-gst-plugins-base mingw-w64-x86_64-gst-plugins-good mingw-w64-x86_64-gstreamer`
|
||||
5. Download and unzip the archive with sources from preferred branch (e.g. [master](https://github.com/DYefremov/DemonEditor/archive/refs/heads/master.zip)) in to folder where MSYS2 is installed. E.g: `c:\msys64\home\username\`
|
||||
6. Run mingw64 shell. Go to the folder where the program was unpacked. E.g: `cd DemonEditor/`
|
||||
And run: `./start.py`
|
||||
|
||||
## Building a package
|
||||
To build a standalone package, we can use [PyInstaller](https://pyinstaller.readthedocs.io/en/stable/).
|
||||
1. Launch mingw64 shell.
|
||||
2. Install PyInstaller via pip: `pip3 install pyinstaller`
|
||||
3. Go to the folder where the program was unpacked. E.g: `c:\msys64\home\username\DemonEditor\`
|
||||
4. Сopy and replace the files from the /build/win/ folder to the root .
|
||||
5. Go to the folder with the program in the running terminal: `cd DemonEditor/`
|
||||
6. Give the following command: `pyinstaller.exe DemonEditor.spec`
|
||||
7. Wait until the operation end. In the dist folder you will find a ready-made build.
|
||||
|
||||
### Appearance
|
||||
To change the look we can use third party [Gtk3 themes and Icon sets](https://www.gnome-look.org).
|
||||
To set the default theme:
|
||||
1. Сreate a folder "`\etc\gtk-3.0\`" in the root of the finished build folder.
|
||||
2. Create a _settings.ini_ file in this folder with the following content:
|
||||
```
|
||||
[Settings]
|
||||
gtk-icon-theme-name = Adwaita
|
||||
gtk-theme-name = Windows-10
|
||||
```
|
||||
In this case, we are using the default icon theme "Adwaita" and the [third party theme](https://github.com/B00merang-Project/Windows-10) "Windows-10".
|
||||
Themes and icon sets should be located in the `share\themes` and `share\icons` folders respectively.
|
||||
To fine-tune the default theme you use, you can use the _win_style.css_ file in the `ui` folder.
|
||||
You can find more info about changing the appearance of Gtk applications on the Web yourself.
|
||||
@@ -1,5 +1,5 @@
|
||||
#!/bin/bash
|
||||
VER="2.2.2_Beta"
|
||||
VER="2.2.4_Beta"
|
||||
B_PATH="dist/DemonEditor"
|
||||
DEB_PATH="$B_PATH/usr/share/demoneditor"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Package: demon-editor
|
||||
Version: 2.2.2-Beta
|
||||
Version: 2.2.4-Beta
|
||||
Section: utils
|
||||
Priority: optional
|
||||
Architecture: all
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -32,6 +32,16 @@ a = Analysis([EXE_NAME],
|
||||
hiddenimports=['fileinput', 'uuid'],
|
||||
hookspath=[],
|
||||
runtime_hooks=[],
|
||||
hooksconfig={
|
||||
"gi": {
|
||||
"languages": ["en", "be", "es", "it", "nl",
|
||||
"pl", "pt", "ru", "tr", "zh_CN"],
|
||||
"module-versions": {
|
||||
"Gtk": "3.0",
|
||||
"GtkSource": "3",
|
||||
},
|
||||
},
|
||||
},
|
||||
excludes=excludes,
|
||||
win_no_prefer_redirects=False,
|
||||
win_private_assemblies=False,
|
||||
@@ -69,7 +79,8 @@ app = BUNDLE(coll,
|
||||
'CFBundleGetInfoString': "Enigma2 channel and satellite editor",
|
||||
'LSApplicationCategoryType': 'public.app-category.utilities',
|
||||
'LSMinimumSystemVersion': '10.13',
|
||||
'CFBundleShortVersionString': f"2.2.2.{BUILD_DATE} Beta",
|
||||
'CFBundleShortVersionString': f"2.2.4.{BUILD_DATE} Beta",
|
||||
'NSHumanReadableCopyright': u"Copyright © 2022, Dmitriy Yefremov",
|
||||
'NSRequiresAquaSystemAppearance': 'false'
|
||||
'NSRequiresAquaSystemAppearance': 'false',
|
||||
'NSHighResolutionCapable': 'true'
|
||||
})
|
||||
|
||||
@@ -30,6 +30,16 @@ a = Analysis([EXE_NAME],
|
||||
hiddenimports=['fileinput', 'uuid', 'ctypes.wintypes'],
|
||||
hookspath=[],
|
||||
runtime_hooks=[],
|
||||
hooksconfig={
|
||||
"gi": {
|
||||
"languages": ["en", "be", "es", "it", "nl",
|
||||
"pl", "pt", "ru", "tr", "zh_CN"],
|
||||
"module-versions": {
|
||||
"Gtk": "3.0",
|
||||
"GtkSource": "3",
|
||||
},
|
||||
},
|
||||
},
|
||||
excludes=excludes,
|
||||
win_no_prefer_redirects=False,
|
||||
win_private_assemblies=False,
|
||||
|
||||
@@ -1,8 +1,14 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import ssl
|
||||
|
||||
if __name__ == "__main__":
|
||||
from multiprocessing import freeze_support
|
||||
from app.ui.main import start_app
|
||||
|
||||
os.environ["PYTHONUTF8"] = "1"
|
||||
# TODO There needs to be a more "correct" way.
|
||||
ssl._create_default_https_context = ssl._create_unverified_context
|
||||
|
||||
freeze_support()
|
||||
start_app()
|
||||
|
||||
@@ -1253,6 +1253,9 @@ msgstr "Выконваецца загрузка дадзеных!"
|
||||
msgid "Recordings"
|
||||
msgstr "Запісы"
|
||||
|
||||
msgid "Recordings:"
|
||||
msgstr "Запісы:"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Даведка"
|
||||
|
||||
@@ -1354,3 +1357,6 @@ msgstr "Усе букеты"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Прайграванне з асноўнага спіса"
|
||||
|
||||
msgid "Enables URL parsing using youtube-dl to get direct links to media."
|
||||
msgstr "Улучае аналіз URL-адрасоў з дапамогай youtube-dl для атрымання прамых спасылак на медыя."
|
||||
|
||||
@@ -1267,6 +1267,9 @@ msgstr "Daten werden geladen!"
|
||||
msgid "Recordings"
|
||||
msgstr "Aufnahmen"
|
||||
|
||||
msgid "Recordings:"
|
||||
msgstr "Aufnahmen:"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Hilfe"
|
||||
|
||||
@@ -1368,3 +1371,6 @@ msgstr "Alle Bouquets"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Wiedergabe aus der Hauptliste"
|
||||
|
||||
msgid "Enables URL parsing using youtube-dl to get direct links to media."
|
||||
msgstr "Aktiviert URL-Parsing mit youtube-dl, um direkte Links zu Medien zu erhalten."
|
||||
|
||||
@@ -53,7 +53,7 @@ msgstr "Assegna"
|
||||
msgid "Assign file"
|
||||
msgstr "Assegna file"
|
||||
|
||||
msgid "Bouquet Details"
|
||||
msgid "Bouquet details"
|
||||
msgstr "Dettagli bouquet"
|
||||
|
||||
msgid "Bouquets"
|
||||
@@ -93,7 +93,7 @@ msgid "Import m3u"
|
||||
msgstr "Importa m3u"
|
||||
|
||||
msgid "Import m3u file"
|
||||
msgstr "Importa file m3u"
|
||||
msgstr "Importa m3u"
|
||||
|
||||
msgid "List configuration"
|
||||
msgstr "Visualizza configurazione"
|
||||
@@ -294,7 +294,7 @@ msgid "Providers"
|
||||
msgstr "Provider"
|
||||
|
||||
msgid "Receive picons"
|
||||
msgstr "Ricevi picons"
|
||||
msgstr "Scarica picons"
|
||||
|
||||
msgid "Picons name format:"
|
||||
msgstr "Formato del nome:"
|
||||
@@ -312,7 +312,7 @@ msgid "Picons download tool"
|
||||
msgstr "Strumento per scaricare picons"
|
||||
|
||||
msgid "Transfer to receiver"
|
||||
msgstr "Trasferisci al ricevitore"
|
||||
msgstr "Trasferisci al ricevitore"
|
||||
|
||||
msgid "Downloader"
|
||||
msgstr "Scarica"
|
||||
@@ -336,7 +336,7 @@ msgid "Converter between name formats"
|
||||
msgstr "Convertitore per il formato dei nomi"
|
||||
|
||||
msgid "Receive picons for providers"
|
||||
msgstr "Ricevi picons per providers"
|
||||
msgstr "Scarica picons per providers"
|
||||
|
||||
msgid "Load satellite providers."
|
||||
msgstr "Carica i providers satellitari"
|
||||
@@ -876,7 +876,7 @@ msgid "Record"
|
||||
msgstr "Registra"
|
||||
|
||||
msgid "Record:"
|
||||
msgstr "Registra:"
|
||||
msgstr "Registrazioni:"
|
||||
|
||||
msgid "Record to disk:"
|
||||
msgstr "Registra su disco:"
|
||||
@@ -1250,6 +1250,8 @@ msgstr "Caricamento dati in corso!"
|
||||
msgid "Recordings"
|
||||
msgstr "Registrazioni"
|
||||
|
||||
msgid "Recordings:"
|
||||
msgstr "Registrazioni:"
|
||||
msgid "Help"
|
||||
msgstr "Aiuto"
|
||||
|
||||
@@ -1351,3 +1353,6 @@ msgstr "Tutti i bouquets"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Riproduzione dalla lista principale"
|
||||
|
||||
msgid "Enables URL parsing using youtube-dl to get direct links to media."
|
||||
msgstr "Abilita l'analisi degli URL utilizzando youtube-dl per ottenere collegamenti diretti ai media."
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Last-Translator: wwns <https://github.com/wwns>\n"
|
||||
"Last-Translator: lareq <lareq@lareq.eu>\n"
|
||||
"Language: pl\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -13,10 +13,12 @@ msgstr ""
|
||||
"POT-Creation-Date: \n"
|
||||
"PO-Revision-Date: \n"
|
||||
"Language-Team: \n"
|
||||
"X-Generator: Poedit 3.0\n"
|
||||
"X-Generator: Poedit 2.3\n"
|
||||
|
||||
msgid "translator-credits"
|
||||
msgstr "wwns"
|
||||
msgstr ""
|
||||
"lareq <lareq@lareq.eu>\n"
|
||||
"wwns <https://github.com/wwns>"
|
||||
|
||||
# Main
|
||||
msgid "Service"
|
||||
@@ -215,7 +217,7 @@ msgid "Host:"
|
||||
msgstr "Host:"
|
||||
|
||||
msgid "Loading data..."
|
||||
msgstr "Ładowanie danych…"
|
||||
msgstr "Ładowanie danych..."
|
||||
|
||||
msgid "Receive"
|
||||
msgstr "Pobierz"
|
||||
@@ -542,10 +544,10 @@ msgid "Done!"
|
||||
msgstr "Zrobione!"
|
||||
|
||||
msgid "Please, wait..."
|
||||
msgstr "Proszę czekać…"
|
||||
msgstr "Proszę czekać..."
|
||||
|
||||
msgid "Resizing..."
|
||||
msgstr "Zmiana rozmiaru…"
|
||||
msgstr "Zmiana rozmiaru..."
|
||||
|
||||
msgid "Select paths!"
|
||||
msgstr "Wybierz ścieżki!"
|
||||
@@ -573,7 +575,7 @@ msgstr "Nie znaleziono VLC. Sprawdź, czy jest zainstalowany!"
|
||||
|
||||
# Search unavailable streams dialog
|
||||
msgid "Please wait, streams testing in progress..."
|
||||
msgstr "Proszę czekać, trwa testowanie strumieni…"
|
||||
msgstr "Proszę czekać, trwa testowanie strumieni..."
|
||||
|
||||
msgid "Found"
|
||||
msgstr "Znaleziono"
|
||||
@@ -989,7 +991,7 @@ msgid "Gtk3 Themes and Icons:"
|
||||
msgstr "Gtk3 motywy i ikony:"
|
||||
|
||||
msgid "Deleting data..."
|
||||
msgstr "Usuwanie danych…"
|
||||
msgstr "Usuwanie danych..."
|
||||
|
||||
msgid "Download from the receiver"
|
||||
msgstr "Pobierz z odbiornika"
|
||||
@@ -1019,7 +1021,7 @@ msgid "EXPERIMENTAL!"
|
||||
msgstr "EKSPERYMENTALNE!"
|
||||
|
||||
msgid "Sorting data..."
|
||||
msgstr "Sortowanie danych…"
|
||||
msgstr "Sortowanie danych..."
|
||||
|
||||
msgid ""
|
||||
"There are unsaved changes.\n"
|
||||
@@ -1059,7 +1061,7 @@ msgid "Enable Dark Mode"
|
||||
msgstr "Włącz tryb ciemny"
|
||||
|
||||
msgid "Extract..."
|
||||
msgstr "Rozpakuj…"
|
||||
msgstr "Rozpakuj..."
|
||||
|
||||
msgid "Unsupported format!"
|
||||
msgstr "Format nieobsługiwany!"
|
||||
@@ -1331,3 +1333,45 @@ msgstr "Przeciągnij usługi na żądaną ikonę lub na listę wybranych usług.
|
||||
|
||||
msgid "Sets the profile folder as default to store picons, backups, etc."
|
||||
msgstr "Ustawia folder profilu jako domyślny do przechowywania pikonów, kopii zapasowych itp."
|
||||
|
||||
msgid "New sub-bouquet"
|
||||
msgstr "Nowy sub-bukiet"
|
||||
|
||||
msgid "Mark not presented in Bouquets"
|
||||
msgstr "Zaznacz te, których nie ma w bukietach"
|
||||
|
||||
msgid "Not in Bouquets"
|
||||
msgstr "Nie ma w bukietach"
|
||||
|
||||
msgid "Do not show services present in Bouquets."
|
||||
msgstr "Nie pokazuj usług obecnych w bukietach."
|
||||
|
||||
msgid "IPTV services only"
|
||||
msgstr "Tylko serwisy IPTV"
|
||||
|
||||
msgid "Display picons"
|
||||
msgstr "Wyświetl pikony"
|
||||
|
||||
msgid "Alternate layout"
|
||||
msgstr "Alternatywny wygląd"
|
||||
|
||||
msgid "Layout of elements has been changed!"
|
||||
msgstr "Zmieniono układ elementów!"
|
||||
|
||||
msgid "Restart the program to apply all changes."
|
||||
msgstr "Uruchom ponownie program, aby zastosować wszystkie zmiany."
|
||||
|
||||
msgid "New folder"
|
||||
msgstr "Nowy katalog"
|
||||
|
||||
msgid "Bookmarks"
|
||||
msgstr "Zakładki"
|
||||
|
||||
msgid "Add bookmark"
|
||||
msgstr "Dodaj zakładkę"
|
||||
|
||||
msgid "All bouquets"
|
||||
msgstr "Wszystkie bukiety"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Odtwarzanie z listy głównej"
|
||||
|
||||
@@ -1250,6 +1250,9 @@ msgstr "Выполняется загрузка данных!"
|
||||
msgid "Recordings"
|
||||
msgstr "Записи"
|
||||
|
||||
msgid "Recordings:"
|
||||
msgstr "Записи:"
|
||||
|
||||
msgid "Help"
|
||||
msgstr "Справка"
|
||||
|
||||
@@ -1351,3 +1354,6 @@ msgstr "Все букеты"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Воспроизведение из основного списка"
|
||||
|
||||
msgid "Enables URL parsing using youtube-dl to get direct links to media."
|
||||
msgstr "Включает анализ URL-адресов с помощью youtube-dl для получения прямых ссылок на медиа."
|
||||
|
||||
@@ -3,7 +3,7 @@ msgstr ""
|
||||
"Project-Id-Version: DemonEditor\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-16 15:59+0300\n"
|
||||
"PO-Revision-Date: 2022-02-21 22:06+0300\n"
|
||||
"PO-Revision-Date: 2022-04-17 22:05+0300\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
@@ -1312,6 +1312,9 @@ msgstr "Favoriler listesinde seçilen adı otomatik olarak ayarlayın."
|
||||
msgid "Playback"
|
||||
msgstr "Oynatım"
|
||||
|
||||
msgid "Playback:"
|
||||
msgstr "Oynatım:"
|
||||
|
||||
msgid "Audio"
|
||||
msgstr "Ses"
|
||||
|
||||
@@ -1362,3 +1365,21 @@ msgstr "Öğelerin düzeni değiştirildi!"
|
||||
|
||||
msgid "Restart the program to apply all changes."
|
||||
msgstr "Tüm değişiklikleri uygulamak için programı yeniden başlatın."
|
||||
|
||||
msgid "New folder"
|
||||
msgstr "Yeni dosya"
|
||||
|
||||
msgid "Rename"
|
||||
msgstr "Düzenle"
|
||||
|
||||
msgid "Bookmarks"
|
||||
msgstr "Yer imleri"
|
||||
|
||||
msgid "Add bookmark"
|
||||
msgstr "Yer imleri ekle"
|
||||
|
||||
msgid "All bouquets"
|
||||
msgstr "Tüm buketler"
|
||||
|
||||
msgid "Playback from the main list"
|
||||
msgstr "Ana listeden oynatma"
|
||||
|
||||
8
start.py
8
start.py
@@ -6,19 +6,19 @@ def update_icon():
|
||||
need_update = False
|
||||
icon_name = "DemonEditor.desktop"
|
||||
|
||||
with open(icon_name, "r") as f:
|
||||
with open(icon_name, "r", encoding="utf-8") as f:
|
||||
lines = f.readlines()
|
||||
for i, line in enumerate(lines):
|
||||
if line.startswith("Icon="):
|
||||
icon_path = line.lstrip("Icon=")
|
||||
current_path = "{}/app/ui/icons/hicolor/96x96/apps/demon-editor.png".format(os.getcwd())
|
||||
current_path = f"{os.getcwd()}/app/ui/icons/hicolor/96x96/apps/demon-editor.png"
|
||||
if icon_path != current_path:
|
||||
need_update = True
|
||||
lines[i] = "Icon={}\n".format(current_path)
|
||||
lines[i] = f"Icon={current_path}\n"
|
||||
break
|
||||
|
||||
if need_update:
|
||||
with open(icon_name, "w") as f:
|
||||
with open(icon_name, "w", encoding="utf-8") as f:
|
||||
f.writelines(lines)
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user