void PianorollTrackView::paintMainContent(QPainter *painter, const QRect &rect) { paintBackground(painter, rect); ui->mainContent->paintMeasureLines(painter, rect); if (mutex) { mutex->lock(); paintItems(painter, rect); mutex->unlock(); } else { paintItems(painter, rect); } ui->mainContent->paintSongPosition(painter, rect); // 矩形選択の範囲を描画する if (mouseStatus.mode == MouseStatus::LEFTBUTTON_SELECT_ITEM) { QRect selectRect = mouseStatus.rect(); static QColor fillColor(0, 0, 0, 100); static QColor borderColor(0, 0, 0, 200); static QColor shadowColor(0, 0, 0, 40); painter->fillRect(selectRect, fillColor); painter->setPen(borderColor); painter->drawRect(selectRect); // 選択範囲の周囲に影を描く painter->setPen(shadowColor); // 上側 painter->drawLine( selectRect.left(), selectRect.top() - 1, selectRect.right() + 1, selectRect.top() - 1); // 下側 painter->drawLine( selectRect.left(), selectRect.bottom() + 2, selectRect.right() + 1, selectRect.bottom() + 2); // 左側 painter->drawLine( selectRect.left() - 1, selectRect.top(), selectRect.left() - 1, selectRect.bottom() + 1); // 右側 painter->drawLine( selectRect.right() + 2, selectRect.top(), selectRect.right() + 2, selectRect.bottom() + 1); } }
bool CUpnpBrowserGui::updateItemSelection(std::string id, std::vector<UPnPEntry> * &entries, int newpos, unsigned int &selected, unsigned int &liststart) { if((int) selected != newpos) { int prev_selected = selected; unsigned int oldliststart = liststart; selected = newpos; liststart = (selected/m_listmaxshow)*m_listmaxshow; printf("updateItemSelection: list start old %d new %d selected old %d new %d\n", oldliststart, liststart, prev_selected, selected); if (oldliststart != liststart) { unsigned int total; if (!getItems(id, liststart, entries, total)) return false; paintItems(entries, selected - liststart, total - liststart, liststart); } else { paintItem(entries, prev_selected - liststart, selected - liststart); paintItem(entries, selected - liststart, selected - liststart); } } return true; }
bool CUpnpBrowserGui::selectItem(std::string id) { bool loop = true; bool endall = false; bool refresh = true; neutrino_msg_t msg; neutrino_msg_data_t data; std::vector<UPnPEntry> *entries = NULL; unsigned int liststart = 0; unsigned int selected = 0; unsigned int total = 0; printf("selectItem: [%s]\n", id.c_str()); if (!getItems(id, liststart, entries, total)) return endall; while (loop) { updateTimes(); if (refresh) { printf("selectItem: refresh, timeout = %d\n", (int) timeout); if (!timeout) paintItems(entries, selected - liststart, total - liststart, liststart); refresh=false; } g_RCInput->getMsg(&msg, &data, 10); // 1 sec timeout to update play/stop state display neutrino_msg_t msg_repeatok = msg & ~CRCInput::RC_Repeat; if (msg == CRCInput::RC_timeout) { // nothing } else if (msg == CRCInput::RC_home) { loop=false; endall=true; } else if (!timeout && (msg == CRCInput::RC_left)) { loop=false; } else if (!timeout && (msg_repeatok == (neutrino_msg_t) g_settings.key_list_start)) { updateItemSelection(id, entries, 0, selected, liststart); } else if (!timeout && (msg_repeatok == (neutrino_msg_t) g_settings.key_list_end)) { updateItemSelection(id, entries, total-1, selected, liststart); } else if (!timeout && (msg_repeatok == CRCInput::RC_up || (int) msg == g_settings.key_pageup)) { int step = ((int) msg == g_settings.key_pageup) ? m_listmaxshow : 1; // browse or step 1 int new_selected = selected - step; if (new_selected < 0) { if (selected != 0 && step != 1) new_selected = 0; else new_selected = total - 1; } updateItemSelection(id, entries, new_selected, selected, liststart); } else if (!timeout && (msg_repeatok == CRCInput::RC_down || (int) msg == g_settings.key_pagedown)) { int step = ((int) msg == g_settings.key_pagedown) ? m_listmaxshow : 1; // browse or step 1 int new_selected = selected + step; if (new_selected >= (int) total) { if ((total - m_listmaxshow -1 < selected) && (selected != (total - 1)) && (step != 1)) new_selected = total - 1; else if (((total / m_listmaxshow) + 1) * m_listmaxshow == total + m_listmaxshow) // last page has full entries new_selected = 0; else new_selected = ((step == (int) m_listmaxshow) && (new_selected < (int) (((total / m_listmaxshow)+1) * m_listmaxshow))) ? (total - 1) : 0; } updateItemSelection(id, entries, new_selected, selected, liststart); } else if (!timeout && (msg == CRCInput::RC_ok || msg == CRCInput::RC_right)) { if ((selected - liststart) >= (*entries).size()) continue; if ((*entries)[selected - liststart].isdir) { endall=selectItem((*entries)[selected - liststart].id); if (endall) loop=false; refresh=true; } else { m_folderplay = false; int preferred=(*entries)[selected - liststart].preferred; if (preferred != -1) { std::string &mime = (*entries)[selected - liststart].mime; if (mime.substr(0,6) == "audio/") { m_playing_entry = (*entries)[selected - liststart]; m_playing_entry_is_shown = false; playAudio((*entries)[selected - liststart].resources[preferred].url, (*entries)[selected - liststart].type); } else if (mime.substr(0,6) == "video/") { m_frameBuffer->Clear(); playVideo((*entries)[selected - liststart].title, (*entries)[selected - liststart].resources[preferred].url); m_frameBuffer->showFrame("mp3.jpg"); refresh = true; } else if (mime.substr(0,6) == "image/") { videoDecoder->setBlank(true); showPicture((*entries)[selected - liststart].resources[preferred].url); m_playid = selected; while (true) { g_RCInput->getMsg(&msg, &data, 10); // 1 sec timeout if (msg == CRCInput::RC_home || msg == CRCInput::RC_ok) break; else if (msg == CRCInput::RC_right || msg == CRCInput::RC_down) { m_playfolder = id; m_playid = (m_playid + 1)%total; playnext(); } else if (msg == CRCInput::RC_left || msg == CRCInput::RC_up) { m_playfolder = id; m_playid--; if (m_playid < 0) m_playid = total - 1; playnext(); } else CNeutrinoApp::getInstance()->handleMsg(msg, data); } m_frameBuffer->Clear(); videoDecoder->setBlank(false); refresh = true; } } } } else if (msg == CRCInput::RC_play) { if ((selected - liststart) >= (*entries).size()) continue; m_folderplay = true; m_playfolder = (*entries)[selected - liststart].id; m_playid = 0; playnext(); m_playid++; } else if (msg == CRCInput::RC_yellow) { if (CAudioPlayer::getInstance()->getState() != CBaseDec::STOP) CAudioPlayer::getInstance()->stop(); m_folderplay = false; } else if (m_folderplay && msg == (neutrino_msg_t) CRCInput::RC_stop) { timeout = 0; m_folderplay = false; m_frameBuffer->Clear(); refresh = true; } else if (m_folderplay && msg == (neutrino_msg_t) CRCInput::RC_prev) { timeout = 0; m_playid -= 2; if (m_playid < 0) m_playid = 0; } else if (m_folderplay && msg == (neutrino_msg_t) CRCInput::RC_next) { timeout = 0; if (CAudioPlayer::getInstance()->getState() != CBaseDec::STOP) CAudioPlayer::getInstance()->stop(); } else if (msg == NeutrinoMessages::RECORD_START || msg == NeutrinoMessages::ZAPTO || msg == NeutrinoMessages::STANDBY_ON || msg == NeutrinoMessages::SHUTDOWN || msg == NeutrinoMessages::SLEEPTIMER) { loop = false; g_RCInput->postMsg(msg, data); } #if 0 else if (msg == NeutrinoMessages::EVT_TIMER) { CNeutrinoApp::getInstance()->handleMsg(msg, data); } else if (msg > CRCInput::RC_MaxRC) #endif else { if (CNeutrinoApp::getInstance()->handleMsg(msg, data) & messages_return::cancel_all) loop = false; //refresh=true; } if (m_folderplay && ((!timeout || (timeout <= time(NULL))) && (CAudioPlayer::getInstance()->getState() == CBaseDec::STOP))) { playnext(); m_playid++; } } delete entries; timeout = 0; m_frameBuffer->Clear(); return endall; }