def __init__(self, parent, **kwargs): super(BrowserTab, self).__init__(parent) self._parent = parent self.loading = False self.title = False # Search query self.search_query = { "id_view": kwargs.get("id_view", min(config["views"])), "fulltext": kwargs.get("fulltext", ""), "order": kwargs.get("order", "ctime desc"), "conds": kwargs.get("conds", []), } # Layout self.search_box = SearchWidget(self) if self.search_query.get("fulltext"): self.search_box.setText(self.search_query["fulltext"]) self.first_load = True self.view = FireflyBrowserView(self) self.view.horizontalHeader().sectionResized.connect(self.on_section_resize) self.view.horizontalHeader().sortIndicatorChanged.connect( self.on_section_resize ) action_clear = QAction(QIcon(pixlib["cancel"]), "&Clear search query", parent) action_clear.triggered.connect(self.on_clear) self.action_search = QMenu("Views") self.action_search.setStyleSheet(app_skin) self.action_search.menuAction().setIcon(QIcon(pixlib["search"])) self.action_search.menuAction().triggered.connect(self.load) self.load_view_menu() action_copy = QAction("Copy result", self) action_copy.setShortcut("CTRL+SHIFT+C") action_copy.triggered.connect(self.on_copy_result) self.addAction(action_copy) toolbar = QToolBar(self) toolbar.addAction(action_clear) toolbar.addAction(self.action_search.menuAction()) search_layout = QHBoxLayout() search_layout.setContentsMargins(0, 0, 0, 0) search_layout.addWidget(self.search_box) search_layout.addWidget(toolbar) self.pager = Pager(self) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addLayout(search_layout, 0) layout.addWidget(self.view, 1) layout.addWidget(self.pager, 0) self.setLayout(layout)
def __init__(self, parent): super(SchedulerModule, self).__init__(parent) toolbar = scheduler_toolbar(self) self.calendar = SchedulerCalendar(self) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(2) layout.addWidget(toolbar, 0) layout.addWidget(self.calendar, 1) self.setLayout(layout)
def __init__(self): super(CalendarDialog, self).__init__() self.setWindowTitle("Calendar") self.date = False, False, False self.setModal(True) self.calendar = QCalendarWidget(self) self.calendar.setGridVisible(True) self.calendar.setFirstDayOfWeek(1) self.calendar.activated[QDate].connect(self.setDate) layout = QVBoxLayout() layout.addWidget(self.calendar) self.setLayout(layout) self.show()
def __init__(self, parent, asset): super(SubclipSelectDialog, self).__init__(parent) self.setModal(True) self.setWindowTitle(f"Select {asset} subclip to use") self.ok = False self.asset = asset self.subclips = asset.meta.get("subclips", []) self.subclips.sort(key=lambda x: x["mark_in"]) layout = QVBoxLayout() btn = QPushButton("Entire clip") btn.clicked.connect(functools.partial(self.on_submit, -1)) layout.addWidget(btn) btn = QPushButton("All subclips") btn.clicked.connect(functools.partial(self.on_submit, -2)) layout.addWidget(btn) for i, subclip in enumerate(self.subclips): btn = QPushButton("[{} - {}] : {}".format( s2tc(subclip["mark_in"]), s2tc(subclip["mark_out"]), subclip["title"], )) btn.setStyleSheet("font: monospace; text-align: left;") btn.clicked.connect(functools.partial(self.on_submit, i)) layout.addWidget(btn) self.setLayout(layout)
def __init__(self, parent, objects=[]): super(SendToDialog, self).__init__(parent) self.objects = list(objects) self.setModal(True) if len(self.objects) == 1: what = self.objects[0]["title"] else: what = f"{len(self.objects)} objects" self.setWindowTitle(f"Send {what} to...") self.actions = [] response = api.actions(objects=self.assets) if not response: logging.error(response.message) self.close() else: layout = QVBoxLayout() for id_action, title in response.data: btn_send = ActionButton(title) btn_send.clicked.connect(functools.partial(self.on_send, id_action)) layout.addWidget(btn_send, 1) self.restart_existing = QCheckBox("Restart existing actions", self) self.restart_existing.setChecked(True) layout.addWidget(self.restart_existing, 0) self.restart_running = QCheckBox("Restart running actions", self) self.restart_running.setChecked(False) layout.addWidget(self.restart_running, 0) self.setLayout(layout) self.setMinimumWidth(400)
def __init__(self, parent): super(JobsModule, self).__init__(parent) self.view = FireflyJobsView(self) toolbar = QToolBar() btn_active = QPushButton("ACTIVE") btn_active.setCheckable(True) btn_active.setChecked(True) btn_active.setAutoExclusive(True) btn_active.clicked.connect(functools.partial(self.set_view, "active")) toolbar.addWidget(btn_active) btn_finished = QPushButton("FINISHED") btn_finished.setCheckable(True) btn_finished.setAutoExclusive(True) btn_finished.clicked.connect( functools.partial(self.set_view, "finished")) toolbar.addWidget(btn_finished) btn_failed = QPushButton("FAILED") btn_failed.setCheckable(True) btn_failed.setAutoExclusive(True) btn_failed.clicked.connect(functools.partial(self.set_view, "failed")) toolbar.addWidget(btn_failed) toolbar.addWidget(ToolBarStretcher(self)) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addWidget(toolbar, 0) layout.addWidget(self.view, 1) self.setLayout(layout) self.set_view("active")
def __init__(self, parent): super(DetailModule, self).__init__(parent) self.asset = self._is_loading = self._load_queue = False toolbar_layout = QHBoxLayout() fdata = [] for id_folder in sorted(config["folders"].keys()): fdata.append({ "value": id_folder, "alias": config["folders"][id_folder]["title"], "role": "option", }) self.folder_select = FireflySelect(self, data=fdata) for i, fd in enumerate(fdata): self.folder_select.setItemIcon( i, QIcon(pixlib["folder_" + str(fd["value"])])) self.folder_select.currentIndexChanged.connect(self.on_folder_changed) self.folder_select.setEnabled(False) toolbar_layout.addWidget(self.folder_select, 0) self.duration = FireflyTimecode(self) toolbar_layout.addWidget(self.duration, 0) self.toolbar = detail_toolbar(self) toolbar_layout.addWidget(self.toolbar) self.detail_tabs = DetailTabs(self) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.addLayout(toolbar_layout, 1) layout.addWidget(self.detail_tabs) self.setLayout(layout)
def __init__(self, parent, sites=[]): super(SiteSelectDialog, self).__init__(parent) self.setWindowTitle("Multiple sites are cofigured") self.setStyleSheet(app_skin) self.setModal(True) self.sites = sites self.setWindowIcon(QIcon(":/images/firefly.ico")) layout = QVBoxLayout() for i, site in enumerate(sites): btn_site = ActionButton( site.get("site_title", False) or site["site_name"]) btn_site.clicked.connect(functools.partial(self.on_select, i)) layout.addWidget(btn_site, 1) self.setLayout(layout) self.setMinimumWidth(400)
def __init__(self, parent): super(SchedulerCalendar, self).__init__(parent) self.week_start_time = self.week_end_time = 0 self.events = [] self.focus_data = [] self.dragging = False self.drag_offset = 0 self.drag_source = False self.append_condition = False self.selected_event = False header_layout = QHBoxLayout() header_layout.addSpacing(CLOCKBAR_WIDTH + 15) cols_layout = QHBoxLayout() self.clock_bar = SchedulerClockBar(self) cols_layout.addWidget(self.clock_bar, 0) self.headers = [] self.days = [] for i in range(7): self.headers.append(SchedulerDayHeaderWidget(self, i)) self.days.append(SchedulerDayWidget(self)) header_layout.addWidget(self.headers[-1]) cols_layout.addWidget(self.days[-1], 1) header_layout.addSpacing(20) self.scroll_widget = QWidget() self.scroll_widget.setLayout(cols_layout) self.scroll_widget.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred) self.scroll_area = QScrollArea(self) self.scroll_area.setFrameStyle(QFrame.NoFrame) self.scroll_area.setWidgetResizable(True) self.scroll_area.setWidget(self.scroll_widget) self.scroll_area.setContentsMargins(0, 0, 0, 0) self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) zoomlevel = self.parent().app_state.get("scheduler_zoom", 0) self.zoom = QSlider(Qt.Horizontal) self.zoom.setMinimum(0) self.zoom.setMaximum(10000) self.zoom.valueChanged.connect(self.on_zoom) logging.debug("Setting scheduler zoom level to", zoomlevel) self.zoom.setValue(zoomlevel) layout = QVBoxLayout() layout.addLayout(header_layout) layout.addWidget(self.scroll_area, 1) layout.addWidget(self.zoom, 0) self.setLayout(layout) self.setMinimumHeight(450)
def __init__(self, parent): super(BrowserModule, self).__init__(parent) self.tabs = QTabWidget(self) self.tabs.setTabsClosable(True) self.tabs.tabCloseRequested.connect(self.close_tab) self.tabs.currentChanged.connect(self.on_tab_switch) self.layout = QVBoxLayout(self) self.layout.setSpacing(0) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.addWidget(self.tabs) self.setLayout(self.layout) tabscfg = self.app_state.get("browser_tabs", []) created_tabs = 0 current_index = 0 for tabcfg in tabscfg: try: if tabcfg["id_view"] not in config["views"]: continue if tabcfg.get("active"): current_index = self.tabs.count() try: del tabcfg["active"] except KeyError: pass title = False if tabcfg.get("title"): title = tabcfg.get("title") try: del tabcfg["title"] except KeyError: pass self.new_tab(title, **tabcfg) created_tabs += 1 except Exception: log_traceback() logging.warning("Unable to restore tab") if not created_tabs: self.new_tab() self.tabs.setCurrentIndex(current_index)
def __init__(self, parent, meta): super(PlaceholderDialog, self).__init__(parent) self.setWindowTitle("Rundown placeholder") self.ok = False keys = [] for k in ["title", "subtitle", "description", "color", "duration"]: # TODO if k in meta: keys.append([k, {"default": meta[k]}]) self.form = MetaEditor(parent, keys) for k in keys: if meta_types[k[0]]["class"] == MetaClass.SELECT: self.form.inputs[k[0]].auto_data(meta_types[k[0]]) k = k[0] self.form[k] = meta[k] buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.on_accept) buttons.rejected.connect(self.on_cancel) layout = QVBoxLayout() layout.addWidget(self.form, 1) layout.addWidget(buttons, 0) self.setLayout(layout) self.setModal(True) self.setMinimumWidth(400)
def __init__(self, parent, item): super(TrimDialog, self).__init__(parent) self.setWindowTitle("Trim {}".format(item)) self.ok = False self.item = item keys = [ ["mark_in", {}], ["mark_out", {}], ] self.form = MetaEditor(parent, keys) for k, s in keys: self.form[k] = item[k] buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.on_accept) buttons.rejected.connect(self.on_cancel) layout = QVBoxLayout() layout.addWidget(self.form, 1) layout.addWidget(buttons, 0) self.setLayout(layout) self.setModal(True) self.setMinimumWidth(400)
def __init__(self, parent): super(DetailTabPreview, self).__init__(parent) layout = QVBoxLayout() self.player = VideoPlayer(self, pixlib) self.subclips = FireflySubclipsView(self) toolbar = preview_toolbar(self) layout.addWidget(toolbar, 0) layout.addWidget(self.player, 3) layout.addWidget(self.subclips, 1) self.setLayout(layout) self.subclips.hide() self.has_focus = False self.loaded = False self.changed = {}
def __init__(self, parent, objects): super(BatchOpsDialog, self).__init__(parent) self.objects = sorted(objects, key=lambda obj: obj.id) self.setWindowTitle(f"Batch modify: {len(self.objects)} assets") id_folder = self.objects[0]["id_folder"] self.keys = config["folders"][id_folder]["meta_set"] self.form = MetaEditor(self, self.keys) if self.form: for key, conf in self.keys: if meta_types[key]["class"] in [ MetaClass.SELECT, MetaClass.LIST ]: self.form.inputs[key].auto_data(meta_types[key], id_folder=id_folder) values = [] for obj in self.objects: val = obj[key] if val not in values: values.append(val) if len(values) == 1: self.form[key] = values[0] self.form.set_defaults() self.scroll_area = QScrollArea(self) self.scroll_area.setFrameStyle(QFrame.NoFrame) self.scroll_area.setWidgetResizable(True) self.scroll_area.setContentsMargins(0, 0, 0, 0) self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) self.scroll_area.setWidget(self.form) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.on_accept) buttons.rejected.connect(self.on_cancel) layout = QVBoxLayout() layout.addWidget(self.scroll_area, 2) layout.addWidget(buttons) self.setLayout(layout) self.response = False self.resize(800, 800)
def __init__(self, parent, **kwargs): super(EventDialog, self).__init__(parent) self.setWindowTitle("Scheduler") self.kwargs = kwargs self.setStyleSheet(app_skin) self.event = kwargs.get("event", Event()) self.accepted = False self.can_edit = user.has_right("scheduler_edit", self.event["id_channel"]) for key in ["start", "id_channel"]: if kwargs.get(key, False): self.event[key] = kwargs[key] keys = config["playout_channels"][self.event["id_channel"]].get( "meta_set", default_meta_set) if "asset" in self.kwargs: asset = self.kwargs["asset"] for key in [k for k in meta_types if meta_types[k]["ns"] == "m"]: if key not in asset.meta: continue self.event[key] = asset[key] self.form = MetaEditor(self, keys) for key in self.form.keys(): self.form[key] = self.event[key] if not self.can_edit: self.form.setEnabled(False) buttons = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) buttons.accepted.connect(self.on_accept) buttons.rejected.connect(self.on_cancel) layout = QVBoxLayout() layout.addWidget(self.form, 2) layout.addWidget(buttons) self.setLayout(layout)
def __init__(self, parent): super(DetailTabMain, self).__init__(parent) self.keys = [] self.widgets = {} self.layout = QVBoxLayout() self.form = False self.id_folder = False self.status = -1 self.has_focus = False self.scroll_area = QScrollArea(self) self.scroll_area.setFrameStyle(QFrame.NoFrame) self.scroll_area.setWidgetResizable(True) self.scroll_area.setContentsMargins(0, 0, 0, 0) self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) mwidget = QWidget() mwidget.setLayout(self.layout) self.scroll_area.setWidget(mwidget) scroll_layout = QVBoxLayout() scroll_layout.addWidget(self.scroll_area) self.setLayout(scroll_layout)
class DetailTabMain(QWidget): def __init__(self, parent): super(DetailTabMain, self).__init__(parent) self.keys = [] self.widgets = {} self.layout = QVBoxLayout() self.form = False self.id_folder = False self.status = -1 self.has_focus = False self.scroll_area = QScrollArea(self) self.scroll_area.setFrameStyle(QFrame.NoFrame) self.scroll_area.setWidgetResizable(True) self.scroll_area.setContentsMargins(0, 0, 0, 0) self.scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn) mwidget = QWidget() mwidget.setLayout(self.layout) self.scroll_area.setWidget(mwidget) scroll_layout = QVBoxLayout() scroll_layout.addWidget(self.scroll_area) self.setLayout(scroll_layout) def load(self, asset, **kwargs): id_folder = kwargs.get("id_folder", asset["id_folder"]) if id_folder != self.id_folder or kwargs.get("force"): if not id_folder: self.keys = [] else: self.keys = config["folders"][id_folder]["meta_set"] if self.form: # SRSLY. I've no idea what I'm doing here self.layout.removeWidget(self.form) self.form.deleteLater() QApplication.processEvents() self.form.destroy() QApplication.processEvents() self.form = None for i in reversed(range(self.layout.count())): self.layout.itemAt(i).widget().deleteLater() self.form = MetaEditor(self, self.keys) self.layout.addWidget(self.form) self.id_folder = id_folder self.status = asset["status"] if self.form: for key, conf in self.keys: if meta_types[key]["class"] in [ MetaClass.SELECT, MetaClass.LIST ]: self.form.inputs[key].set_data( asset.show(key, result="full")) self.form[key] = asset[key] self.form.set_defaults() if self.form: enabled = has_right("asset_edit", id_folder) self.form.setEnabled(enabled) def on_focus(self): pass def search_by_key(self, key, id_view=False): b = self.parent().parent().parent().main_window.browser id_view = id_view or b.tabs.widget(b.tabs.currentIndex()).id_view view_title = config["views"][id_view]["title"] asset = self.parent().parent().parent().asset b.new_tab( f"{view_title}: {asset.show(key)} ({meta_types[key].alias})", id_view=id_view, conds=[f"'{key}' = '{self.form[key]}'"], ) b.redraw_tabs()
class BrowserModule(BaseModule): def __init__(self, parent): super(BrowserModule, self).__init__(parent) self.tabs = QTabWidget(self) self.tabs.setTabsClosable(True) self.tabs.tabCloseRequested.connect(self.close_tab) self.tabs.currentChanged.connect(self.on_tab_switch) self.layout = QVBoxLayout(self) self.layout.setSpacing(0) self.layout.setContentsMargins(0, 0, 0, 0) self.layout.addWidget(self.tabs) self.setLayout(self.layout) tabscfg = self.app_state.get("browser_tabs", []) created_tabs = 0 current_index = 0 for tabcfg in tabscfg: try: if tabcfg["id_view"] not in config["views"]: continue if tabcfg.get("active"): current_index = self.tabs.count() try: del tabcfg["active"] except KeyError: pass title = False if tabcfg.get("title"): title = tabcfg.get("title") try: del tabcfg["title"] except KeyError: pass self.new_tab(title, **tabcfg) created_tabs += 1 except Exception: log_traceback() logging.warning("Unable to restore tab") if not created_tabs: self.new_tab() self.tabs.setCurrentIndex(current_index) def new_tab(self, title=False, **kwargs): if "id_view" not in kwargs: try: id_view = self.tabs.currentWidget().id_view except AttributeError: pass else: kwargs["id_view"] = id_view tab = BrowserTab(self, **kwargs) self.tabs.addTab(tab, "New tab") self.tabs.setCurrentIndex(self.tabs.indexOf(tab)) tab.title = title tab.load() return tab @property def browsers(self): r = [] for i in range(0, self.tabs.count()): r.append(self.tabs.widget(i)) return r def close_tab(self, idx=False): if self.tabs.count() == 1: return if not idx: idx = self.tabs.currentIndex() w = self.tabs.widget(idx) w.deleteLater() self.tabs.removeTab(idx) self.redraw_tabs() def prev_tab(self): cur = self.tabs.currentIndex() if cur == 0: n = self.tabs.count() - 1 else: n = cur - 1 self.tabs.setCurrentIndex(n) def next_tab(self): cur = self.tabs.currentIndex() if cur == self.tabs.count() - 1: n = 0 else: n = cur + 1 self.tabs.setCurrentIndex(n) def on_tab_switch(self): browser = self.browsers[self.tabs.currentIndex()] sel = browser.view.selected_objects if sel: self.main_window.focus(sel[0]) browser.search_box.setFocus() self.redraw_tabs() def load(self): for b in self.browsers: b.load() def redraw_tabs(self, *args, **kwargs): QApplication.processEvents() views = [] for i, b in enumerate(self.browsers): id_view = b.id_view self.tabs.setTabText(i, b.title or config["views"][id_view]["title"]) sq = copy.copy(b.search_query) if self.tabs.currentIndex() == i: sq["active"] = True if b.title: sq["title"] = b.title views.append(sq) self.app_state["browser_tabs"] = views def seismic_handler(self, message): for b in self.browsers: b.seismic_handler(message) def refresh_assets(self, *objects, request_data=False): for b in self.browsers: b.refresh_assets(*objects, request_data=request_data)
def __init__(self, main_window): super(FireflyMainWidget, self).__init__(main_window) self.main_window = main_window current_tab = self.main_window.app_state.get("current_module", 0) self.perform_on_switch_tab = True self.tabs = QTabWidget(self) self.browser = self.detail = self.rundown = self.scheduler = self.jobs = False # MAM modules self.browser = BrowserModule(self) self.detail = DetailModule(self) self.tabs.addTab(self.detail, "DETAIL") self.main_window.add_subscriber(self.browser, ["objects_changed"]) self.main_window.add_subscriber(self.detail, ["objects_changed"]) # Jobs module if config["actions"]: self.jobs = JobsModule(self) self.tabs.addTab(self.jobs, "JOBS") self.main_window.add_subscriber(self.jobs, ["job_progress"]) # Channel control modules if config["playout_channels"]: if user.has_right("scheduler_view", anyval=True) or user.has_right( "scheduler_edit", anyval=True): self.scheduler = SchedulerModule(self) self.main_window.add_subscriber(self.scheduler, ["objects_changed"]) self.tabs.addTab(self.scheduler, "SCHEDULER") if user.has_right("rundown_view", anyval=True) or user.has_right( "rundown_edit", anyval=True): self.rundown = RundownModule(self) self.main_window.add_subscriber( self.rundown, [ "objects_changed", "rundown_changed", "playout_status", "job_progress", ], ) self.tabs.addTab(self.rundown, "RUNDOWN") # Layout self.main_splitter = QSplitter(Qt.Horizontal) self.main_splitter.addWidget(self.browser) self.main_splitter.addWidget(self.tabs) self.main_splitter.splitterMoved.connect( self.main_window.save_window_state) create_menu(self.main_window) layout = QVBoxLayout() layout.addWidget(self.main_splitter) self.setLayout(layout) if current_tab: self.switch_tab(current_tab) else: self.on_switch_tab() self.tabs.currentChanged.connect(self.on_switch_tab)
def __init__(self, parent): super(MCR, self).__init__(parent) self.progress_bar = QProgressBar(self) self.progress_bar.setTextVisible(False) self.progress_bar.setValue(0) self.progress_bar.setMaximum(PROGRESS_BAR_RESOLUTION) self.btn_take = MCRButton("Take", self, self.on_take) self.btn_freeze = MCRButton("Freeze", self, self.on_freeze) self.btn_retake = MCRButton("Retake", self, self.on_retake) self.btn_abort = MCRButton("Abort", self, self.on_abort) self.btn_loop = MCRButton("Loop", self, self.on_loop, checkable=True) self.btn_cue_backward = MCRButton("<", self, self.on_cue_backward) self.btn_cue_forward = MCRButton(">", self, self.on_cue_forward) self.btn_cue_backward.setShortcut("Ctrl+J") self.btn_take.setShortcut("Ctrl+K") self.btn_cue_forward.setShortcut("Ctrl+L") self.btn_retake.setShortcut("Alt+J") self.btn_freeze.setShortcut("Alt+K") self.btn_abort.setShortcut("Alt+L") btns_layout = QHBoxLayout() btns_layout.addStretch(1) btns_layout.addWidget(self.btn_take, 0) btns_layout.addWidget(self.btn_freeze, 0) btns_layout.addWidget(self.btn_retake, 0) btns_layout.addWidget(self.btn_abort, 0) btns_layout.addWidget(self.btn_loop, 0) btns_layout.addWidget(self.btn_cue_backward, 0) btns_layout.addWidget(self.btn_cue_forward, 0) btns_layout.addStretch(1) self.display_clock = MCRLabel("CLK", "--:--:--:--") self.display_pos = MCRLabel("POS", "--:--:--:--") self.display_current = MCRLabel("CUR", "(no clip)", tcolor="#cc0000") self.display_cued = MCRLabel("NXT", "(no clip)", tcolor="#00cc00") self.display_rem = MCRLabel("REM", "(unknown)") self.display_dur = MCRLabel("DUR", "--:--:--:--") info_layout = QGridLayout() info_layout.setContentsMargins(0, 0, 0, 0) info_layout.setSpacing(2) info_layout.addWidget(self.display_clock, 0, 0) info_layout.addWidget(self.display_pos, 1, 0) info_layout.addWidget(self.display_current, 0, 1) info_layout.addWidget(self.display_cued, 1, 1) info_layout.addWidget(self.display_rem, 0, 2) info_layout.addWidget(self.display_dur, 1, 2) info_layout.setColumnStretch(1, 1) layout = QVBoxLayout() layout.addLayout(info_layout, 0) layout.addWidget(self.progress_bar, 0) layout.addLayout(btns_layout, 0) self.setLayout(layout) self.on_channel_changed() self.display_timer = QTimer(self) self.display_timer.timeout.connect(self.update_display)
def __init__(self, parent): super(RundownModule, self).__init__(parent) self.start_time = 0 self.current_item = False self.cued_item = False self.last_search = "" self.first_load = True self.edit_wanted = self.app_state.get("edit_enabled", True) self.edit_enabled = False self.toolbar = rundown_toolbar(self) layout = QVBoxLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(2) layout.addWidget(self.toolbar, 0) self.view = RundownView(self) self.mcr = self.plugins = False if has_right("mcr", anyval=True): self.mcr = MCR(self) self.plugins = PlayoutPlugins(self) if self.app_state.get("show_mcr", False): self.mcr.show() else: self.mcr.hide() if self.app_state.get("show_plugins", False): self.plugins.show() else: self.plugins.hide() layout.addWidget(self.mcr) layout.addWidget(self.plugins) layout.addWidget(self.view, 1) self.setLayout(layout)