Example #1
0
    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")
Example #2
0
    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)
Example #3
0
    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)
Example #4
0
    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)
Example #5
0
    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(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)
Example #7
0
    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)
Example #8
0
 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()
Example #9
0
    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)
Example #10
0
    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)
Example #11
0
    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)
Example #12
0
    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)
Example #13
0
    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)
Example #14
0
    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)
Example #15
0
    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)
Example #16
0
    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 = {}
Example #17
0
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()
Example #18
0
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)
Example #19
0
    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)
Example #20
0
    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)